# Realtime validation errors and warnings

This page provides a list of validation errors and warnings for the Realtime Transit feed, as
well as tips on how to troubleshoot these issues.

## Realtime validation errors

To provide accurate information to passengers, be sure to fix any validation errors in your
Realtime feed.

To debug the Realtime validation errors, use the information from the following table.

- The "Enum value" column provides the short name of the issue in your Realtime feed, which displays in the validation report in the Transit Partner Dashboard.
- The "Error message" column provides the message that displays in the validation report in the Transit Partner Dashboard. It summarizes the error.
- The "Troubleshooting tips" column provides the major steps you need to take to resolve the error.

| Enum value | Error message | Troubleshooting tips |
|---|---|---|
| `PROTO_MISSING_FIELDS_ERROR` | Binary protocol buffer is missing field(s) <var translate="no">%(field)</var>. | Open the file in a text editor and verify that the feed includes all of the fields marked as **Required** in the `FeedMessage` protocol buffer. |
| `PROTO_ASCII_ERROR` | Cannot parse ASCII protocol buffer. Errors: <var translate="no">%(field)</var>. | Open the file in a text editor and verify that the feed includes all of the required fields and uses the correct syntax. |
| `PROTO_PARSE_ERROR` | Cannot parse binary protocol buffer. | Open the file in a text editor and verify that the feed can be parsed as a `FeedMessage`. You can find code examples at [Feed examples](https://developers.google.com/transit/gtfs-realtime/examples). |
| `URL_DNS_ERROR` | DNS error for URL. | Verify the internet connection and DNS settings. |
| `FETCHER_CONNECTION_ERROR` | Failed to connect to URL. | Verify the URL that you provided for fetching. Make sure the URL is correct. |
| `CUSTOM_PARSE_ERROR` | Failed to parse the custom-format feed: <var translate="no">%(value_string)</var> | Verify the file content in a text editor. Confirm that the file generates correctly and isn't corrupted during transport. If the error persists, reach out to your Google Transit representative for help. |
| `FEED_TOO_OLD` | Feed timestamp <var translate="no">%(timestamp)</var> (<var translate="no">%(timestamp_string)</var>) is in the past by <var translate="no">%(diff_time)</var> seconds (<var translate="no">%(difftime_string)</var>). The current time is <var translate="no">%(localtime)</var> (<var translate="no">%(localtime_string)</var>). Feed discarded. | Verify that there are no other problems reported about fetching the feed. Generate the feed regularly and keep data fresh. Ensure that the feed timestamp correctly represents the feed creation time in seconds after epoch (in UTC timezone). |
| `FETCHER_HTTP_ERROR` | HTTP Error: <var translate="no">%(value)</var>. | Verify the HTTP error code returned and investigate the issue accordingly. |
| `FULL_DATASET_REQUIRED` | Only `FULL_DATASET` feeds are supported. | Set the value of `incrementality` to `FULL_DATASET`. |
| `FEED_TIMESTAMP_CONSISTENTLY_IN_THE_FUTURE` | The feed timestamp is consistently in the future by <var translate="no">%(diff_time)</var> seconds (<var translate="no">%(difftime_string)</var>). | Be sure to provide the timestamp in the UTC timezone, in seconds after epoch. Check your server's clocks to make sure that they're all synchronized, such as with NTP. |
| `INVALID_TIMESTAMP_RANGE` | The feed timestamp value is out of range (<var translate="no">%(timestamp)</var>). | Provide a feed timestamp that represents the feed creation time in seconds after epoch (in UTC timezone). |
| `PROTO_ENCODING_UNKNOWN` | Unknown feed encoding. | Use the correct encoding to configure the feed. Your final feed needs to be in binary format but you can use the ASCII format for testing. |
| `VEHICLE_POSITION_INTERNAL_ERROR` | `VehiclePosition` conversion into `TripUpdate` failed for <var translate="no">%(trip_id)</var> with a generic error "<var translate="no">%(value_string)</var>". | This error indicates that the `VehiclePosition` isn't used to estimate a `TripUpdate`. Contact your Google Transit representative for help. |

## Realtime validation warnings

To increase the feed data quality, it's important to fix the validation warnings that indicate
potential issues with your Realtime feed.

To debug the Realtime validation warnings, search through the entries in the following table.

- The "Enum value" column provides the short name of the issue in your Realtime feed, which displays in the validation report in the Transit Partner Dashboard.
- The "Warning or info message" column provides the message that displays in the validation report in the Transit Partner Dashboard. It summarizes the warning or information.
- The "Troubleshooting tips" column provides the major steps you need to take to resolve the warning.

| Enum value | Warning or info message | Troubleshooting tips |
|---|---|---|
| `TRIP_UPDATE_SOME_STU_NOT_MATCHED` | <var translate="no">%(value)</var> of valid `StopTimeUpdates` specified `trip_id` "<var translate="no">%(trip_id)</var>" were unable to be matched against the GTFS trip. e.g. position: <var translate="no">%(index)</var> stop_sequence: <var translate="no">%(next_seq)</var> `stop_id`: "<var translate="no">%(stop_id)</var>". | Make sure that the `StopTimeUpdates` are provided in the correct order. |
| `VEHICLE_POSITION_DUPLICATE_TRIP_BLOCK_TRANSFER` | A block transfer trip <var translate="no">$(trip_id)</var> and `start_time` <var translate="no">$(timestamp_string)</var> reported by multiple vehicles. | Ensure that only one vehicle represents a trip at a specific start time. |
| `INVALID_ALERT_ROUTE_NOT_MATCHED` | Alert discarded: `route_id` "<var translate="no">%(route_id)</var>" could not be matched to GTFS feed. | Verify whether the static schedule is correct and add the route information if it's missing. When the new static schedule is live, correct the `route_id` reference in the Realtime feed. |
| `INVALID_ALERT_STOP_NOT_MATCHED` | Alert discarded: `stop_id` "<var translate="no">%(stop_id)</var>" could not be matched to GTFS feed. | Verify whether the static schedule is correct and add the stop information if it's missing. When the new static schedule is live, correct the `stop_id` reference in the Realtime feed. |
| `INVALID_ALERT_TRIP_NOT_MATCHED` | Alert discarded: `trip_id` "<var translate="no">%(trip_id)</var>" could not be matched to GTFS feed. | Verify whether the static schedule is correct and add the trip information if it's missing. When the new static schedule is live, correct the `trip_id` reference in the Realtime feed. |
| `STOP_TIME_UPDATE_PREMATURE_ARRIVAL` | Arrival of `StopTimeUpdate` for trip "<var translate="no">%(trip_id)</var>" with `stop_id` "<var translate="no">%(stop_id)</var>" and `stop_sequence` <var translate="no">%(next_seq)</var> is <var translate="no">%(value)</var> seconds earlier than previous `StopTimeUpdate` with `stop_id` "<var translate="no">%(other_id)</var>" and `stop_sequence` <var translate="no">%(prev_seq)</var>. | Review the arrival time and departure time for the given `stop_id` or the previous ones. Fix the incorrect values to ensure that the times don't decrease. |
| `INVALID_ALERT_NO_INFORMED_ENTITIES` | At least one informed entity should be given. | Include a relevant `informed_entity` in the alert. |
| `PROTO_ENCODING_MISMATCH` | Configured proto encoding differs from received encoding. | Provide the feed in the correct format. If the problem persists, reach out to your Google Transit representative for help. |
| `STOP_TIME_UPDATE_PREMATURE_DEPARTURE` | Departure of `StopTimeUpdate` for trip "<var translate="no">%(trip_id)</var>" with `stop_id` "<var translate="no">%(stop_id)</var>" and `stop_sequence` <var translate="no">%(next_seq)</var> is <var translate="no">%(value)</var> seconds earlier than previous `StopTimeUpdate` with `stop_id` "<var translate="no">%(other_id)</var>" and `stop_sequence` <var translate="no">%(prev_seq)</var>. | Review the departure time for the given `stop_id` or the previous ones. Fix the incorrect values to ensure that the departure times don't decrease. |
| `DETOUR_MUST_SPECIFY_TIME` | Detour of trip "<var translate="no">%(trip_id)</var>" through stop "<var translate="no">%(stop_id)</var>" must specify absolute time. | Include the exact times at the affected `stop_id` for the specified `trip_id`. |
| `ENTITY_MUST_HAVE_ALERTS` | Entity must have alerts. | Verify that the feed content is complete and that each `FeedEntity` message includes information about service alerts. |
| `ENTITY_MUST_HAVE_POSITIONS` | Entity must have positions. | Verify that the feed content is complete and that each `FeedEntity` message includes vehicle position information. |
| `ENTITY_MUST_HAVE_UPDATES` | Entity must have trip updates. | Verify that the feed content is complete and that each `FeedEntity` message includes information about trip updates. |
| `TIMESTAMP_FUTURE` | Feed timestamp <var translate="no">%(timestamp)</var> (<var translate="no">%(timestamp_string)</var>) is in the future by <var translate="no">%(diff_time)</var> seconds (<var translate="no">%(difftime_string)</var>). Using the acquisition timestamp which is <var translate="no">%(localtime)</var> (<var translate="no">%(localtime_string)</var>). | Be sure to provide the timestamp in the UTC timezone, in seconds after epoch. Check your server's clocks to make sure that they're all synchronized, such as with NTP. |
| `TIMESTAMP_PAST` | Feed timestamp <var translate="no">%(timestamp)</var> (<var translate="no">%(timestamp_string)</var>) is in the past by <var translate="no">%(diff_time)</var> seconds (<var translate="no">%(difftime_string)</var>). Using the acquisition timestamp which is <var translate="no">%(localtime)</var> (<var translate="no">%(localtime_string)</var>). | Regenerate the Realtime feed more frequently, even if the content remains the same or empty. |
| `NO_VALID_TEXT` | Field <var translate="no">%(field)</var> has no valid translations. | Review the `TranslatedString` messages and fix any relevant issues, such as `HTML_TAGS_FOUND`, `INVALID_URL_LENGTH`, `INVALID_TEXT_LENGTH`, and `INVALID_URL`. |
| `HTML_TAGS_FOUND` | Field <var translate="no">%(field)</var>(<var translate="no">%(index)</var>) contains HTML tags. | Remove any HTML tags from the field. |
| `INVALID_LANGUAGE` | Field <var translate="no">%(field)</var>(<var translate="no">%(index)</var>) has invalid language code "<var translate="no">%(language)</var>". | Set the language field to a valid [BCP-47 language code](https://wikipedia.org/wiki/IETF_language_tag). |
| `INVALID_URL` | Field <var translate="no">%(field)</var>(<var translate="no">%(index)</var>) has invalid URL (absolute http or https expected). | Include a valid URL for the alert. |
| `INVALID_TEXT_LENGTH` | Field <var translate="no">%(field)</var>(<var translate="no">%(index)</var>) has length <var translate="no">%(length)</var> (maximum <var translate="no">%(max_length)</var>). | Shorten the supplied text, which often shows on small screens, such as mobile phones. If you want to provide more details to the users, provide a URL reference instead. |
| `INVALID_URL_LENGTH` | Field <var translate="no">%(field)</var>(<var translate="no">%(index)</var>) has URL length <var translate="no">%(length)</var> (maximum <var translate="no">%(max_length)</var>). | Provide a URL that fits within the limits. |
| `MULTIPLE_UNSPECIFIED_LANGUAGE` | Field <var translate="no">%(field)</var>(<var translate="no">%(index)</var>) is a repeated translation with no language set. | Review the `TranslatedString` messages. Set correct values for the `language` field where more than one translation is given. |
| `INVALID_TRIP_UPDATE_DELAY` | Invalid delay within trip update: <var translate="no">%(value)</var>. | Review the `delay` field of the given `entity_id` and fix the incorrect value. |
| `INVALID_TRIP_UPDATE_EVENT_TIME` | Invalid stop event time: <var translate="no">%(timestamp)</var>. | Include `TripUpdates` only for trips that are ongoing or occurring in the near future. |
| `INVALID_TRIP_UPDATE_DEPARTURE_NO_TIME` | Neither `time` nor `delay` provided for a departure. | Include a `time` field, a `delay` field, or both at each `StopTimeEvent` message. If no information is available, omit the `departure` field. |
| `INVALID_TRIP_UPDATE_ARRIVAL_NO_TIME` | Neither `time` nor `delay` provided for an arrival. | Include a `time` field, a `delay` field, or both at each `StopTimeEvent` message. If no information is available, omit the `arrival` field. |
| `MISSING_CONTENT_AND_EFFECT` | No valid content or effect. | Add `effect`, `header_text`, or `description_text` into the alert. If no information is available, remove the `alert` instead. |
| `CUSTOM_PARSE_WARNING` | Partial failure when parsing the custom-format feed: <var translate="no">%(value_string)</var> | This error indicates a portion of the Realtime feed wasn't able to be parsed. Open a text editor to verify the feed's content, or reupload the feed. If the error persists, contact your Google Transit representative for help. |
| `VEHICLE_POSITION_BAD_START_TIME` | Specified trip <var translate="no">$(trip_id)</var> start time is <var translate="no">%(diff_time)</var> seconds away from actual start of the vehicle. | Specify the start time of the vehicle close to the actual start time of the trip. |
| `INVALID_TRIP_UPDATE_INCONSISTENT_IDS` | `stop_sequence` <var translate="no">%(value)</var> does not match stop "<var translate="no">%(stop_id)</var>" for trip "<var translate="no">%(trip_id)</var>". Overriding it with the `stop_sequence` <var translate="no">%(next_seq)</var> from the static index. | Ensure that the value of `stop_sequence` field is correct and matches the `stop_sequence` for the same `stop_id` and `trip_id` in the current static feed. |
| `INVALID_STOP_STOP_ID` | `StopTimeUpdate` discarded: `stop_id` "<var translate="no">%(stop_id)</var>" given for trip "<var translate="no">%(trip_id)</var>" could not be matched to GTFS feed. `stop_sequence` \[if present\] <var translate="no">%(value)</var>. | Verify the accuracy of the static feed. If needed, fix the value of `stop_id` in `stop_times.txt` for the trip. Wait until the new version of the static feed is live. Update the `stop_id` reference in the Realtime feed. |
| `INVALID_STOP_SEQUENCE_ID` | `StopTimeUpdate` discarded: `stop_sequence` <var translate="no">%(value)</var> within trip "<var translate="no">%(trip_id)</var>" could not be matched to GTFS feed. | Verify the accuracy of the static feed. If needed, fix the value of `stop_sequence`. Wait until the new version of the static feed is live. Update the `stop_sequence` reference in the Realtime feed. |
| `INVALID_TRIP_UPDATE_ORDER` | `StopTimeUpdate` discarded: `stop_sequence` order violation for `trip_id` "<var translate="no">%(trip_id)</var>" `stop_id` \[if present\] "<var translate="no">%(stop_id)</var>", `stop_sequence` <var translate="no">%(prev_seq)</var> followed by <var translate="no">%(next_seq)</var>. | Be sure to set the order of `StopTimeUpdates` with `stop_sequence`. |
| `FEED_TIMESTAMP_CONSISTENTLY_IN_THE_PAST` | The feed timestamp is consistently in the past by <var translate="no">%(diff_time)</var> seconds (<var translate="no">%(difftime_string)</var>). | Confirm that the timestamp value is in UTC timezone, in seconds after epoch. Confirm that your server's clocks are synchronized, such as with NTP. Be sure to update the feed regularly. |
| `TIMESTAMP_MISSING` | The feed's `FeedHeader` is missing the `timestamp` field. | Fill in the `timestamp` field in the `FeedHeader` in seconds after epoch, in UTC timezone. The timestamp needs to correctly represent the feed generation time. |
| `ENTITY_MORE_THAN_ONCE` | The `FeedEntity`'s id appears more than once in the feed. | Ensure that all entity IDs are unique in the feed. |
| `PROTO_ASCII_HAS_BOM` | The provided feed begins with a Byte Order Mark (BOM). | Remove the Byte Order Mark. Ensure that the text-formatted protocol buffer is in UTF-8 without a BOM. We recommend that you provide the protocol buffer in binary format instead. |
| `TRIP_UPDATE_TIMESTAMP_CONSISTENTLY_IN_THE_FUTURE` | The `timestamp` for some trip update is consistently in the future by <var translate="no">%(diff_time)</var> seconds (<var translate="no">%(difftime_string)</var>). | Confirm that the `timestamp` value is formatted as a UTC timezone, in seconds after epoch. Confirm that your server's clocks are synchronized, such as with NTP. Remove `TripUpdates` from the feed for trips that were completed more than one hour ago. |
| `VEHICLE_POSITION_TIMESTAMP_CONSISTENTLY_IN_THE_FUTURE` | The timestamp is consistently in the future by <var translate="no">%(diff_time)</var> seconds (<var translate="no">%(difftime_string)</var>). | Confirm that the `timestamp` value is formatted as a UTC timezone, in seconds after epoch. Confirm that your server's clocks are synchronized, such as with NTP. |
| `VEHICLE_POSITION_TIMESTAMP_CONSISTENTLY_IN_THE_PAST` | The `timestamp` is consistently in the past by <var translate="no">%(diff_time)</var> seconds (<var translate="no">%(difftime_string)</var>). | Confirm that the `timestamp` value is formatted as a UTC timezone, in seconds after epoch. Confirm that your server's clocks are synchronized, such as with NTP. Remove `VehiclePositions` from the feed for trips that were completed more than one hour ago. |
| `UNKNOWN_TRIP_ID` | The trip id "<var translate="no">%(trip_id)</var>" is unknown to the static GTFS feed. | Verify the static feed to ensure that it contains correct and up-to-date information. Ensure that the correct version of the static feed is in use, or upload the correct version where necessary. Provide an existing and accurate `trip_id` in the `TripDescriptor`. |
| `TRIP_OUTSIDE_SERVICE_WINDOW` | The trip with id "<var translate="no">%(trip_id)</var>" is not in service at the specified time. | Verify the accuracy of the static feed. Add the trip information if it's missing. Wait until the new version of the static feed is live. Correct the `trip_id` reference in the Realtime feed. |
| `AMBIGUOUS_TRIP_DESCRIPTOR` | The `TripDescriptor` is ambiguous, and does not resolve a single trip at a particular time. | If the trip is frequency based, be sure to provide a valid `start_time` value and a `start_date` value in `TripDescriptor`. |
| `INVALID_TRIP_UPDATE_FUTURE_TIMESTAMP` | The `TripUpdate` timestamp <var translate="no">%(timestamp)</var> (<var translate="no">%(timestamp_string)</var>) is in the future by <var translate="no">%(diff_time)</var> seconds (<var translate="no">%(difftime_string)</var>) when compared to the feed timestamp which is <var translate="no">%(localtime)</var> (<var translate="no">%(localtime_string)</var>). | Verify that the clock source has the correct time set. Verify that any timezone conversions are performed accurately. The `Vehicle.Position.timestamp` field needs to be formatted as a UTC timezone, in seconds after epoch. |
| `INVALID_VEHICLE_POSITION_FUTURE_TIMESTAMP` | The `VehiclePosition` timestamp <var translate="no">%(timestamp)</var> (<var translate="no">%(timestamp_string)</var>) is in the future by <var translate="no">%(diff_time)</var> seconds (<var translate="no">%(difftime_string)</var>) when compared to the feed timestamp which is <var translate="no">%(localtime)</var> (<var translate="no">%(localtime_string)</var>). | Verify that the clock source has the correct time set. Verify that any timezone conversions are performed accurately. The `Vehicle.Position.timestamp` field needs to be formatted as a UTC timezone, in seconds after epoch. |
| `INVALID_VEHICLE_POSITION_STALE_TIMESTAMP` | The `VehiclePosition` timestamp <var translate="no">%(timestamp)</var> (<var translate="no">%(timestamp_string)</var>) is in the past by <var translate="no">%(diff_time)</var> seconds (<var translate="no">%(difftime_string)</var>) when compared to the feed timestamp which is <var translate="no">%(localtime)</var> (<var translate="no">%(localtime_string)</var>). | Remove the out-of-service vehicles from the feed. Verify that the clock is synchronized and the timezone conversions are correct. |
| `INVALID_ALERT_TIME_RANGE_END_PAST` | Time range ended over a month ago: <var translate="no">%(time_end)</var>. | Remove alerts (or `active_periods`) which have the end time in the past and are no longer active. |
| `INVALID_ALERT_TIME_RANGE_ORDER` | Time range order is reversed: (<var translate="no">%(time_start)</var>, <var translate="no">%(time_end)</var>). | Verify the value of the `active_period` fields. The order of these fields might be reversed. |
| `INVALID_ALERT_TIME_RANGE_START_FUTURE` | Time range starts more than a year from now: <var translate="no">%(time_start)</var>. | Include an `active_period` start time in the near future into the alerts. |
| `STOP_TIME_AND_DELAY_MISMATCH` | Trip "<var translate="no">%(trip_id)</var>" at stop "<var translate="no">%(stop_id)</var>" specifies timestamp <var translate="no">%(timestamp)</var> and delay <var translate="no">%(delay)</var> which contradict each other. Setting delay to <var translate="no">%(value)</var>. | Verify that the Realtime feed matches the currently live static feed. Make sure that the `delay` field and `time` field in `StopTimeEvent` are correct and consistent. Alternatively, omit the `delay` field entirely and provide only the `time` field instead. |
| `INVALID_START_DATE` | Trip "<var translate="no">%(trip_id)</var>" has invalid start date "<var translate="no">%(value_string)</var>", assuming today. Expected format is "YYYYMMDD". | Verify the value of the start_date for the specified trip. Ensure that the value is correct. |
| `INVALID_START_TIME` | Trip "<var translate="no">%(trip_id)</var>" has invalid start time "<var translate="no">%(value_string)</var>". Expected format is "HH:MM:SS". | Verify the value and format of the `start_time` for the specified trip. Ensure that the value and the format are correct. |
| `VEHICLE_POSITION_DUPLICATE_TRIP` | Trip <var translate="no">$(trip_id)</var> and `start_time` <var translate="no">$(timestamp_string)</var> reported by multiple vehicles. | Change the `start_time` of the trip and change the `ScheduleRelationship` to `ADDED` for the non-frequency based trips. |
| `VEHICLE_POSITION_CONVERTED_TO_ADDED` | Trip <var translate="no">$(trip_id)</var> schedule relationship was changed to `ADDED` trip. | This error is the side effect of another problem. Address that problem first to fix this error. |
| `INVALID_TRIP_UPDATE_MISSING_IDS` | Trip update contains `stop_update` with neither `stop_sequence` nor `stop_id`. | Include a `stop_id`, a `stop_sequence`, or both into the `StopTimeUpdate` message. |
| `MULTIPLE_ENTITIES_PER_TRIP` | Trip update discarded: Represents the same `trip_id` "<var translate="no">%(trip_id)</var>" with the same start time as other entity with id <var translate="no">%(value_string)</var>. | Ensure that there's at most one `TripUpdate` for each real-world journey. Ensure that the `TripDescriptor` is unique within the feed. |
| `INVALID_TRIP_UPDATE_MISSING_CONTENT` | Trip update for scheduled `trip_id` "<var translate="no">%(trip_id)</var>" should specify at least one stop time update with data or specify a delay. | Provide one of the following: - `StopTimeUpdate` with data - `TripUpdate.delay` |
| `TRIP_UPDATE_SUSPICIOUS_DELAY` | Trip with `trip_id` "<var translate="no">%(trip_id)</var>" contains a suspiciously unreasonable delay of <var translate="no">%(difftime_string)</var>. | Verify that the `TripDescription` is clearly defined, which needs to have a `trip_id`, `start_date`, and `start_time`. Verify that `StopTimeUpdates` have time values that match the specified trip. Check for any timezone mismatch problems, for example, whether `start_date` and `start_time` are in the local timezone, but all integer time fields in `FeedMessage` are in seconds after epoch. |
| `TRIP_UPDATE_OBSOLETE` | Trip with `trip_id` "<var translate="no">%(trip_id)</var>" ended <var translate="no">%(difftime_string)</var> ago. | Remove trips from the feed a few minutes after they reach the final stop. |
| `UNSUPPORTED_ADDED_WITH_BLOCK_TRANSFER` | `TripDescriptor` with a `schedule_relationship` of `ADDED` for a trip <var translate="no">%(trip_id)</var> with a block transfer is not supported. | Only use the `ADDED` value for `ScheduleRelationship` to indicate the isolated trips. |
| `UNSUPPORTED_ADDED_WITHOUT_TIMES` | `TripDescriptor` with a `schedule_relationship` of `ADDED` for a trip <var translate="no">%(trip_id)</var> without times specified. | Provide a `start_date` and a `start_time` to indicate when the added trip began. |
| `TRIP_UPDATE_TOO_OLD` | `TripUpdate` timestamp <var translate="no">%(timestamp)</var> (<var translate="no">%(timestamp_string)</var>) is in the past by <var translate="no">%(diff_time)</var> seconds (<var translate="no">%(difftime_string)</var>). The current time is <var translate="no">%(localtime)</var> (<var translate="no">%(localtime_string)</var>). `TripUpdate` discarded. | Generate the feed regularly and keep data fresh. Ensure that the `TripUpdate` timestamp is correct, in seconds after epoch, and formatted as a UTC timezone. Remove trips from the feed a few minutes after they reach the final stop. |
| `INVALID_TRIP_UPDATE_DELAY_USAGE` | `TripUpdate`'s `delay` field specified together with time in `StopTimeUpdates`. | Provide timing information using only one of the following, instead of both: - `StopTimeUpdates` - `TripUpdate.delay` |
| `INVALID_VEHICLE_POSITION_VEHICLE_ID_MISSING` | `VehiclePosition` lacks a vehicle identifier. | Provide a vehicle identifier. Make sure this value is stable across all versions of the feed in which the vehicle is in service. |
| `INVALID_VEHICLE_POSITION_INVALID_POSITION` | `VehiclePosition` lacks valid position information. | Provide valid values for the `latitude` and `longitude` fields. |
| `INVALID_VEHICLE_POSITION_TIMESTAMP_MISSING` | `VehiclePosition` timestamp is missing. | Provide a timestamp value of when the `VehiclePosition` information was collected, in seconds after epoch formatted as a UTC timezone. |