# Google Transit GTFS Schedule Reference and Differences

> [!NOTE]
> **Note:** To see the official canonical General Transit Feed Specification (GTFS), go to [gtfs.org](https://gtfs.org). This page is up to date with the official specification as of December 21, 2022. Updates past that date aren't supported.

This page describes the major differences between the official GTFS Schedule and
Google Transit's implementation of the specification in the following areas:

- **Ignored official specifications:** These fields are part of the official
  GTFS. Google Transit ingests this data without error but doesn't proactively use
  the data.

- **Different interpretation:** These fields include the parts of the official
  GTFS that Google Transit interprets differently than the GTFS definition of
  those parts.

- **Experimental support:** These fields are experimental in Google Transit's
  implementation. If you want to implement a new experimental field, contact the
  [Google Transit team](https://support.google.com/transitpartners/gethelp).

- **Google Transit-supported extension:** This extension *is not* part of the
  official GTFS. The Transit-supported extension includes both public extensions
  and Google Transit-specific extensions. Any partner can send this information to
  Transit in their feed.

## Static transit

The following sections document the major differences between the official GTFS
and Google Transit's implementation of the static feed.

> [!NOTE]
> **Note:** The official GTFS site ([gtfs.org](https://gtfs.org)) refers to the static transit specifications as "GTFS Schedule." On the Google Transit developer site, we use the term "static" transit to differentiate it from "realtime."

### Ignored official specifications in static feeds

Some official specifications that are ignored by Transit are experimental. To
learn more, go to [gtfs.org](https://gtfs.org).

Table 1 lists GTFS files that aren't supported by Transit in static feeds.
Also, none of the fields that are defined in these files are supported by
Transit.

|---|
| [`areas.txt`](https://gtfs.org/schedule/reference/#areastxt) |
| [`fare_leg_rules.txt`](https://gtfs.org/schedule/reference/#fare_leg_rulestxt) |
| [`fare_products.txt`](https://gtfs.org/schedule/reference/#fare_productstxt) |
| [`fare_transfer_rules.txt`](https://gtfs.org/schedule/reference/#fare_transfer_rulestxt) |
| [`levels.txt`](https://gtfs.org/schedule/reference/#levelstxt) |
| [`stop_areas.txt`](https://gtfs.org/schedule/reference/#stop_areastxt) |
[**Table 1.** Unsupported GTFS files in static feeds]

Table 2 lists all the GTFS-defined fields that are ignored by Transit in the
static feeds.

| Filename | Ignored field defined in the GTFS | Field type |
|---|---|---|
| [`fare_attributes.txt`](https://gtfs.org/schedule/reference/#fare_attributestxt) | `payment_method` | Enum |
| [`feed_info.txt`](https://gtfs.org/schedule/reference/#feed_infotxt) | `default_lang` | Language code |
| [`feed_info.txt`](https://gtfs.org/schedule/reference/#feed_infotxt) | `feed_publisher_name` | Text |
| [`pathways.txt`](https://gtfs.org/schedule/reference/#pathwaystxt) | `max_slope` | Float |
| [`routes.txt`](https://gtfs.org/schedule/reference/#routestxt) | `continuous_drop_off` | Enum |
| [`routes.txt`](https://gtfs.org/schedule/reference/#routestxt) | `continuous_pickup` | Enum |
| [`routes.txt`](https://gtfs.org/schedule/reference/#routestxt) | `network_id` | ID |
| [`routes.txt`](https://gtfs.org/schedule/reference/#routestxt) | `route_desc` | Text |
| [`routes.txt`](https://gtfs.org/schedule/reference/#routestxt) | `route_sort_order` | Non-negative integer |
| [`stops.txt`](https://gtfs.org/schedule/reference/#stopstxt) | `level_id` | ID |
| [`stops.txt`](https://gtfs.org/schedule/reference/#stopstxt) | `stop_desc` | Text |
| [`stops.txt`](https://gtfs.org/schedule/reference/#stopstxt) | `stop_url` | URL |
| [`stops.txt`](https://gtfs.org/schedule/reference/#stopstxt) | `tts_stop_name` | Text |
| [`trips.txt`](https://gtfs.org/schedule/reference/#stopstxt) | `bikes_allowed` | Enum |
[**Table 2.** Ignored GTFS fields in static feeds]

### Different interpretation in static feeds

Although Transit accepts certain GTFS-defined fields, Transit interprets them
differently than the GTFS.

Table 3 shows the fields in static feeds that Transit implements differently
than as described in the GTFS.

| Filename | Field defined in the GTFS | Field type | Required by Google Transit? | Google Transit implementation details |
|---|---|---|---|---|
| [`fare_attributes.txt`](https://gtfs.org/schedule/reference/#fare_attributestxt) | `transfers` | Enum | Required | Google Transit extension. The public GTFS limits values to a range from `0` to `2`. Google Transit accepts values from `0` to `5`. Use this field to set the maximum number of allowable transfers with the fare. This doesn't include block transfers, also known as in-seat transfers. If you don't want to set limits on the number of transfers for a fare, leave the `transfers` field empty. |
| [`pathways.txt`](https://gtfs.org/schedule/reference/#pathwaystxt) | `pathway_mode` | Enum | Optional | When the `pathway_mode` field is specified, if it's left empty, Google Transit accepts it and treats it as unknown. |
| [`stop_times.txt`](https://gtfs.org/schedule/reference/#stop_timestxt) | `arrival_time` | Time | Conditionally required | Hours are restricted to values from `00` to `99`, which is more than enough for three-day trips. |
| [`transfers.txt`](https://gtfs.org/schedule/reference/#transferstxt) | `transfer_type` | Enum | Required | Values of `4` and `5` aren't supported and are ignored. Google Transit supports values of `0`, `1`, `2`, and `3`. |
| [`trips.txt`](https://gtfs.org/schedule/reference/#tripstxt) | `block_id` | ID | Optional | To learn more, see [Block transfer example](https://developers.google.com/transit/gtfs/examples/block-transfer-example). |
[**Table 3.** Differently implemented static feed fields]

### Experimental support in static feeds

If you need support to integrate new experimental fields in this category,
contact [Google Transit](https://support.google.com/transitpartners/gethelp).

### Google Transit-supported extensions in static feeds

Table 4 provides information about [Google Transit extensions](https://developers.google.com/transit/gtfs/reference/gtfs-extensions). These fields aren't part of the official GTFS.

| Filename | Field | Field type | Required by Google Transit? | Google Transit implementation details |
|---|---|---|---|---|
| [`fare_attributes.txt`](https://gtfs.org/schedule/reference/#fare_attributestxt) | `ic_price` | Float | Optional | This Google Transit extension is available only for partners in Japan. The `ic_price` field represents the discounted amount of money to be paid for this fare with a smart card. If no discounts are provided for this fare, or the smart card isn't supported, the `ic_price` field's value needs to be `-1`. |
| [`fare_rules.txt`](https://gtfs.org/schedule/reference/#fare_rulestxt) | `contains_route_id` | ID | Optional | Google Transit extension. This fare applies only to travel that visits an exact set of routes identified by the `route_id` value in all rows for this combination of the `fare_id`, `origin_id`, and `destination_id` columns. If the `contains_route_id` column is missing, or all its values for this fare are null, then the fare isn't restricted in this parameter. If the `contains_route_id` field is given for a fare, then the `route_id` field must be empty. |
| [`routes.txt`](https://gtfs.org/schedule/reference/#routestxt) | `checkin_duration` | Integer | Optional | Google Transit extension. The `checkin_duration` field specifies how many seconds early a passenger is advised to arrive before the scheduled departure in order to check in and board. If the passenger connects to the departure by a transfer, then any defined transfer time overrides the `checkin_duration` value. The `checkin_duration` value is only a recommendation that's usually provided by the transit operator. It might not reflect the absolute last possible moment that a passenger can arrive and still board the vehicle. |
| [`routes.txt`](https://gtfs.org/schedule/reference/#routestxt) | `route_type` | Enum | Required | Google Transit extension. To learn how Google Transit extends the GTFS‑accepted `route_type` value options, see [Extended GTFS route types](https://developers.google.com/transit/gtfs/reference/extended-route-types). |
| [`stop_times.txt`](https://gtfs.org/schedule/reference/#stop_timestxt) | `stop_direction_name` | Text | Optional | Google Transit extension. The `stop_direction_name` field identifies a trip's direction to passengers. The direction is stored as the `direction_name` value of the departure from this stop. If the `stop_direction_name` field is empty, then the Transit-supported `trip_direction_name` field is used instead. If the `trip_direction_name` and `stop_direction_name` fields are both empty, then the transit importer leaves them empty. In that case, partners can use the `stop_headsign` or `trip_headsign` value instead. The values of the `stop_direction_name` field are case normalized. |
| [`stops.txt`](https://gtfs.org/schedule/reference/#stopstxt) | `signposted_as` | Text | Optional | Google Transit extension. The `signposted_as` field contains the verbatim text written on the signboard for the platform. Examples are "Towards Central" and "East side \& Brooklyn." The GTFS `platform_code` field and the Transit-supported `signposted_as` field can be set simultaneously. Differences between the `platform_code` and `signposted_as` fields include the following: - **Length.** The `platform_code` field usually contains a number or letter like *2* or *C*. - **Language.** The `platform_code` field doesn't have a language, but `signposted_as` values can have translations. - **Stability.** The `platform_code` field changes much less often than the `signposted_as` field. |
| [`stops.txt`](https://gtfs.org/schedule/reference/#stopstxt) | `vehicle_type` | Integer | Optional | Google Transit extension. The `vehicle_type` field specifies the type of vehicles that are used at a stop. This field accepts hierarchical vehicle type (HVT) route types. The HVT values are derived from the European Transport Protocol Experts Group (TPEG) standard. |
| [`agency.txt`](https://gtfs.org/schedule/reference/#agencytxt) | `ticketing_deep_link_id` | ID | Optional | Google Transit ticketing extension. In the [`agency.txt`](https://gtfs.org/schedule/reference/#agencytxt) file, the `ticketing_deep_link_id` field represents the deep link that's used to ticket the trips of this agency. |
| [`routes.txt`](https://gtfs.org/schedule/reference/#routestxt) | `ticketing_deep_link_id` | ID | Optional | Google Transit ticketing extension. In the [`routes.txt`](https://gtfs.org/schedule/reference/#routestxt) file, the `ticketing_deep_link_id` field represents the deep link that's used to ticket the trips of this route. |
| [`stop_times.txt`](https://gtfs.org/schedule/reference/#stop_timestxt) | `ticketing_stop_time_id` | ID | Optional | Google Transit ticketing extension. If present in the [`stop_times.txt`](https://gtfs.org/schedule/reference/#stop_timestxt) file, the `ticketing_stop_time_id` field overrides the identifier that represents the stop time for ticketing with deep links. |
| [`stop_times.txt`](https://gtfs.org/schedule/reference/#stop_timestxt) | `ticketing_type` | Enum | Optional | Google Transit ticketing extension. The `ticketing_type` field specifies the type of ticketing that applies to this stop time. Google Transit accepts the following values: - **`Empty`.** Default---as defined by the trip. - **`0`.** Available only if the agency or route has a ticketing deep link that's enabled. - **`1`.** Unavailable. |
| [`ticketing_deep_links.txt`](https://developers.google.com/transit/gtfs/reference/google-transit-ticketing-extension) | `android_intent_uri` | URI | Optional | Google Transit ticketing extension. The `android_intent_uri` field represents the intent URI that's used for deep linking on Android. |
| [`ticketing_deep_links.txt`](https://developers.google.com/transit/gtfs/reference/google-transit-ticketing-extension) | `ios_universal_link_url` | URL | Optional | Google Transit ticketing extension. The `ios_universal_link_url` field represents the universal link URL that's used for deep linking on iOS. |
| [`ticketing_deep_links.txt`](https://developers.google.com/transit/gtfs/reference/google-transit-ticketing-extension) | `ticketing_deep_link_id` | ID | Required | Google Transit ticketing extension. The `ticketing_deep_link_id` field represents the identifier of the deep link. |
| [`ticketing_deep_links.txt`](https://developers.google.com/transit/gtfs/reference/google-transit-ticketing-extension) | `web_url` | URL | Optional | Google Transit ticketing extension. The `web_url` field represents the URL that's used for deep linking on the web. |
| [`ticketing_identifiers.txt`](https://developers.google.com/transit/gtfs/reference/google-transit-ticketing-extension) | `agency_id` | ID | Required | Google Transit ticketing extension. To specify the agency of the stop that the default `ticketing_stop_id` field is defined for, the `agency_id` field contains the ID from the GTFS [`agency.txt`](https://gtfs.org/schedule/reference/#agencytxt) file. |
| [`ticketing_identifiers.txt`](https://developers.google.com/transit/gtfs/reference/google-transit-ticketing-extension) | `stop_id` | ID | Required | Google Transit ticketing extension. To specify the stop that the default `ticketing_stop_id` field is defined for, the `stop_id` field contains the ID from the GTFS [`stops.txt`](https://gtfs.org/schedule/reference/#stopstxt) file. |
| [`ticketing_identifiers.txt`](https://developers.google.com/transit/gtfs/reference/google-transit-ticketing-extension) | `ticketing_stop_id` | ID | Required | Google Transit ticketing extension. The `ticketing_stop_id` field contains the ticketing ID that is applied to the stop. Optionally, an agency qualifies the ID. |
| `trips.txt` | `exceptional` | Enum | Optional | This field indicates exceptional trips. They operate outside of the regular schedule or are diverted from the usual route due to special events or planned disruptions (such as trackwork, etc). Google accepts the following value options: - **`0`.** Regular services - **`1`.** Service exception. For example, services that are added due to special events or services diverted away from the usual route due to planned disruptions. |
| [`trips.txt`](https://gtfs.org/schedule/reference/#tripstxt) | [`ticketing_trip_id`](https://developers.google.com/transit/gtfs/reference/google-transit-ticketing-extension#field-definitions) | ID | Optional | Google Transit ticketing extension. If the `ticketing_trip_id` field is present, its value overrides the `trip_id` field to identify the trip for ticketing with deep links. |
| [`trips.txt`](https://gtfs.org/schedule/reference/#tripstxt) | [`ticketing_type`](https://developers.google.com/transit/gtfs/reference/google-transit-ticketing-extension#field-definitions) | Enum | Optional | Google Transit ticketing extension. The [`ticketing_type`](https://developers.google.com/transit/gtfs/reference/google-transit-ticketing-extension#field-definitions) field specifies the type of ticketing that applies to this trip. Google Transit accepts the following values: - **`0`.** Default. Available only if the agency or route has a ticketing deep link that's enabled. - **`1`.** Unavailable. |
| [`translations.txt`](https://gtfs.org/schedule/reference/#translationstxt) | `lang` | Language Code | Optional | Google Transit extension. The `lang` field isn't part of the official GTFS, but Google Transit uses this value when it's present. To specify the translation of a phrase, use the `lang` field. Its value *must not* be empty or `und` (an undefined language). |
| [`translations.txt`](https://gtfs.org/schedule/reference/#translationstxt) | `trans_id` | ID | Optional | Google Transit extension. The `trans_id` field isn't part of the official GTFS, but Google Transit uses this value when it's present. To specify the ID token of the phrase that the translation is provided for, use the `trans_id` field. Each row of the [`translations.txt`](https://gtfs.org/schedule/reference/#translationstxt) table means that in the language `lang`, the phrase `trans_id` translates to `translation`. |
| [`trips.txt`](https://gtfs.org/schedule/reference/#tripstxt) | `original_trip_id` | ID | Optional | Google Transit extension. If it's present in the [`trips.txt`](https://gtfs.org/schedule/reference/#tripstxt) file, the `original_trip_id` value overrides the `trip_id` value for use by other systems. An example is realtime matching. |
| [`trips.txt`](https://gtfs.org/schedule/reference/#tripstxt) | `trip_direction_name` | Text | Optional | Google Transit extension. The `trip_direction_name` field identifies a trip's direction to passengers. The value in this field is stored as the `direction_name` value of each trip. If the `stop_direction_name` value in the `stop_times` table changes along the trip, it might override the `trip_direction_name` value. Values in the `trip_direction_name` field are case normalized. |
| [`trips.txt`](https://gtfs.org/schedule/reference/#tripstxt) | `vehicle_category_id` | ID | Optional | Google Transit extension. In the [`trips.txt`](https://gtfs.org/schedule/reference/#tripstxt) file, the `vehicle_category_id` field identifies the vehicle that's allotted to this trip. When this field is in the `trips.txt` file, its value overrides the `vehicle_category_id` value in the [`routes.txt`](https://gtfs.org/schedule/reference/#routestxt) file. |
| `vehicle_categories.txt` | `vehicle_category_id` | ID | Required | Google Transit extension. Identifies a vehicle category. |
| `vehicle_categories.txt` | `vehicle_amenity_id` | ID | Optional | Google Transit extension. Identifies a set of amenities available to all passengers in the vehicle category. Alternatively, see `vehicle_category_amenities.txt ` for when different amenity sets are available in the same vehicle category. |
| `vehicle_amenities.txt` | `vehicle_amenity_id` | ID | Required | Google Transit extension. Identifies a set of amenities. |
| `vehicle_amenities.txt` | `ac_availability` | Enum | Optional | Google Transit extension. Defines if air conditioning is available. Google accepts the following values: - **`0`.** Default. Unknown. - **`1`.** Available anywhere, anytime. - **`2`.** Not available. |
| `vehicle_amenities.txt` | `wifi_availability` | Enum | Optional | Google Transit extension. Defines if Wifi is available onboard. Google accepts the following values: - **`0`.** Default. Unknown. - **`1`.** Available anywhere, anytime. - **`2`.** Not available. |
| `vehicle_amenities.txt` | `toilet_availability` | Enum | Optional | Google Transit extension. Defines if a toilet is available inside the vehicle. Google accepts the following values: - **`0`.** Default. Unknown. - **`1`.** Available anywhere, anytime. - **`2`.** Not available. |
| `vehicle_amenities.txt` | `gender_accessibility` | Enum | Optional | Google Transit extension. Defines if gender restrictions apply. Google accepts the following values: - **`0`.** Default. Unknown. - **`1`.** No gender restrictions. - **`2`.** Restricted to women only. - **`3`.** Restricted to men only. |
| `vehicle_amenities.txt` | `seat_type` | Enum | Optional | Google Transit extension. Defines the type of seat. Google accepts the following values: - **`0`.** Default. Seat (not foldable, may be reclining). - **`1`.** Fixed bed (cannot be reclined back as seat). - **`2`.** Reclining seat. |
| `vehicle_amenities.txt` | `service_class` | Enum | Optional | Google Transit extension. Defines the class of the seat. Google accepts the following values: - **`0`.** Default. Unknown. - **`1`.** First class. - **`2`.** Second class. - **`3`.** Third class. - **`4`.** Business. - **`5`.** Premium Economy. - **`6`.** Economy. |
| `vehicle_amenities.txt` | `service_class_code` | String | Optional | Google Transit extension. Defines a short form class code (e.g. 1A for Air-Conditioned First Class). This field is a more specific version of the class field, where the classes not available in the class enum can be specified. |
| `vehicle_amenities.txt` | `seat_plug` | Enum | Optional | Google Transit extension. Defines if either an electric or usb plug (of any type) is available at the seat. Google accepts the following values: - **`0`.** Default. Unknown. - **`1`.** Available at all seats. - **`2`.** Not available. |
| `vehicle_amenities.txt` | `row_layout_summary` | String | Optional | Google Transit extension. Defines the number of seats or beds in one row of the vehicle. Some examples are: "2" (2 seats in a row, but whether they are separated or next to each other is unknown), "1+1" (2 individual seats in a row), "2+2" (4 seats in a row with a separation in the middle). |
| `vehicle_amenities.txt` | `row_leg_space` | Enum | Optional | Google Transit extension. Defines if rows have additional leg space. Google accepts the following values: - **`0`.** Default. Unknown / Not applicable. - **`1`.** Standard leg space. - **`2`.** Additional leg space. |
| `vehicle_category_amenities.txt` | `vehicle_category_id` | ID | Required | Google Transit extension. Identifies the vehicle category. The same vehicle category can have numerous amenity sets by repeating the value of this field in multiple rows. This is typically helpful when a vehicle category has various classes of service. |
| `vehicle_category_amenities.txt` | `vehicle_amenity_id` | ID | Required | Google Transit extension. Identifies a set of amenities available to all passengers in the vehicle category. |
[**Table 4.** Supported static feed extensions]

> [!NOTE]
> **Note:** To learn more about the differences between the GTFS Realtime and Google Transit implementation, refer to [this
> article](https://developers.google.com/transit/gtfs-realtime/reference/difference-gtfs-transit-implement).