# Google Transit GTFS Realtime 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 Realtime 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.

## Realtime transit

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

### Ignored official specifications in the realtime feeds

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

Table 1 lists the GTFS-defined fields that are ignored by Transit in the
realtime feeds.

| Message | Ignored field defined in the GTFS | Field type |
|---|---|---|
| [*message* `Alert`](https://gtfs.org/realtime/reference/#message-alert) | `image` | TranslatedImage |
| [*message* `Alert`](https://gtfs.org/realtime/reference/#message-alert) | `image_alternative_text` | TranslatedString |
| [*message* `Alert`](https://gtfs.org/realtime/reference/#message-alert) | `severity_level` | Enum |
| [*message* `Alert`](https://gtfs.org/realtime/reference/#message-alert) | `tts_description_text` | Proto |
| [*message* `Alert`](https://gtfs.org/realtime/reference/#message-alert) | `tts_header_text` | Proto |
| [*message* `CarriageDetails`](https://gtfs.org/realtime/reference/#message-carriagedetails) | `id` | String |
| [*message* `CarriageDetails`](https://gtfs.org/realtime/reference/#message-carriagedetails) | `occupancy_percentage` | int32 |
| [*message* `Position`](https://gtfs.org/realtime/reference/#message-position) | `bearing` | Float |
| [*message* `Position`](https://gtfs.org/realtime/reference/#message-position) | `odometer` | Double |
| [*message* `Position`](https://gtfs.org/realtime/reference/#message-position) | `speed` | Float |
| [*message* `Shape`](https://gtfs.org/realtime/reference/#message-shape) | `encoded_polyline` | String |
| [*message* `Shape`](https://gtfs.org/realtime/reference/#message-shape) | `shape_id` | String |
| [*message* `StopTimeUpdate`](https://gtfs.org/realtime/reference/#message-stoptimeupdate) (in `TripUpdate`) | `arrival.uncertainty` | int32 |
| [*message* `StopTimeUpdate`](https://gtfs.org/realtime/reference/#message-stoptimeupdate) (in `TripUpdate`) | `stop_time_properties` | Proto |
| [*message* `TripUpdate`](https://gtfs.org/realtime/reference/#message-tripupdate) | `trip_properties` | Proto |
| [*message* `TripUpdate`](https://gtfs.org/realtime/reference/#message-tripupdate) | `vehicle` | VehicleDescriptor |
| [*message* `VehicleDescriptor`](https://gtfs.org/realtime/reference/#message-vehicledescriptor) | `license_plate` | String |
| [*message* `VehicleDescriptor`](https://gtfs.org/realtime/reference/#message-vehicledescriptor) | `wheelchair_accessible` | WheelchairAccessible |
| [*message* `VehiclePosition`](https://gtfs.org/realtime/reference/#message-vehicleposition) | `congestion_level` | Enum |
| [*message* `VehiclePosition`](https://gtfs.org/realtime/reference/#message-vehicleposition) | `current_status` | VehicleStopStatus |
| [*message* `VehiclePosition`](https://gtfs.org/realtime/reference/#message-vehicleposition) | `current_stop_sequence` | uint32 |
| [*message* `VehiclePosition`](https://gtfs.org/realtime/reference/#message-vehicleposition) | `multi_carriage_details.id` | String |
| [*message* `VehiclePosition`](https://gtfs.org/realtime/reference/#message-vehicleposition) | `occupancy_percentage` | uint32 |
| [*message* `VehiclePosition`](https://gtfs.org/realtime/reference/#message-vehicleposition) | `stop_id` | String |
[**Table 1.** Ignored official fields in realtime feeds]

### Different interpretation in the realtime feeds

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

Table 2 lists GTFS-defined fields in the realtime feeds that are either
optional or required conditionally by Transit. For optional fields, the table
shows whether or not the enum values are supported by Transit.

| Filename | Field defined in the GTFS | Field type | Required by Google Transit? | Google Transit implementation details |
|---|---|---|---|---|
| [*message* `StopTimeUpdate`](https://gtfs.org/realtime/reference/#message-stoptimeupdate) (in `TripUpdate`) | `stop_id` | String | Conditionally required | When a `stop_id` string is provided, it must meet one of the following conditions: - The `stop_id` string must be the same as in the [`stops.txt`](https://gtfs.org/schedule/reference/#stopstxt) file in the corresponding GTFS feed. - If a different `stop_id` string is used, then the provided `stop_id` string must be a sibling or child string of the original `stop_id` string that's provided in the static GTFS. The corresponding `stop_sequence` field must also be provided. |
| [*message* `StopTimeUpdate`](https://gtfs.org/realtime/reference/#message-stoptimeupdate) | `schedule_relationship` | Enum | Optional | Google Transit supports the following enum values: - `SCHEDULED` - `SKIPPED` - `NO_DATA` |
| [*message* `TripDescriptor`](https://gtfs.org/realtime/reference/#message-tripdescriptor) | `schedule_relationship` | Enum | Optional | Google Transit doesn't support the following enum values: - `DUPLICATED` - `CANCELED`---when it's not for `TripUpdate` records Google supports the following enum values: - `SCHEDULED` - `UNSCHEDULED` - `ADDED` - `CANCELED`---only supported for `TripUpdate` records |
[**Table 2.** Differently interpreted realtime feed fields]

### Experimental support in realtime feeds

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

### Google Transit-supported extensions in realtime feeds

At the time of publishing this article, no fields belong to this category. If
you need any assistance, contact
[Google Transit](https://support.google.com/transitpartners/gethelp).

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