Método GetTripOptions

Este método proporciona grupos de tickets de alto nivel para un viaje especificado. Estos contienen conjuntos de tramos con clases de servicio seleccionadas que se pueden reservar en el mismo boleto, así como información sobre las tarifas y la disponibilidad del boleto en su totalidad. Ten en cuenta lo siguiente:

GetTripOptionsRequest

Definición de .proto

// Request sent to partners.
message GetTripOptionsRequest {
  // All segments together should form a single trip for which a ticket can be
  // booked.
  repeated ext.travel.transport.partner.SegmentKey segment_keys = 1;
}

Ejemplo de JSON

{
  "segment_keys": [
    {
      "ticketing_trip_id": "123456",
      "from_ticketing_stop_time_id": "ZRH-1234",
      "to_ticketing_stop_time_id": "LUZ-1235",
      "service_date": {
        "year": 2022,
        "month": 4,
        "day": 6
      },
      "boarding_time": {
        "year": 2022,
        "month": 4,
        "day": 6,
        "hours": 14,
        "minutes": 25,
        "seconds": 0,
        "nanos": 0,
        "utc_offset": "0s"
      },
      "arrival_time": {
        "year": 2022,
        "month": 4,
        "day": 6,
        "hours": 16,
        "minutes": 25,
        "seconds": 0,
        "nanos": 0,
        "utc_offset": "0s"
      }
    },
    {
      "ticketing_trip_id": "234567",
      "from_ticketing_stop_time_id": "LUZ-2759",
      "to_ticketing_stop_time_id": "WOL-2455",
      "service_date": {
        "year": 2022,
        "month": 4,
        "day": 6
      },
      "boarding_time": {
        "year": 2022,
        "month": 4,
        "day": 6,
        "hours": 18,
        "minutes": 13,
        "seconds": 0,
        "nanos": 0,
        "utc_offset": "0s"
      },
      "arrival_time": {
        "year": 2022,
        "month": 4,
        "day": 6,
        "hours": 20,
        "minutes": 13,
        "seconds": 0,
        "nanos": 0,
        "utc_offset": "0s"
      }
    }
  ]
}

GetTripOptionsResponse

Definición de .proto

// Response received from partners.
message GetTripOptionsResponse {
  oneof response {
    TripOptionsResult trip_options_result = 1;
    TripOptionsError trip_options_error = 2;
  }
}

// A successful partner response.
message TripOptionsResult {
  // Note:
  // - A TripOption represents the fare for a combination of available service
  //   classes for the segments in the request.
  // - If the seats within a service class are sold at different fares of
  //   limited availability, a different TripOption instance with the same
  //   sequence of segments can be returned for each fare.

  // Partners should also include options that are unavailable because they are
  // fully booked, using the appropriate Unavailable message below.
  repeated TripOption trip_options = 1;
}


// A travel option for users covering the whole end-to-end journey with the
// partner.
message TripOption {
  // A series of Segments that cover the whole trip option, one for each
  // SegmentKey in the request.
  repeated Segment segments = 1;

  // This is the lowest standard fare of all seats with the specified segments.
  // This field is optional if the series of segments is unavailable.
  // This "standard fare" should be the lowest seat price where no age or other
  // booking restrictions apply. The currency should be the local currency of
  // the origin of the first segment.
  Fare lowest_standard_fare = 2;

  // The availability status for bookings of this trip option at the
  // lowest_standard_fare.
  Availability availability = 3;

  // This is used to receive optional extra data via the Travel Transport API
  // and pass it into the ticketing deep link.
  // Booking links should still work without the booking token, but the token
  // can be used to ensure price consistency between Google Search results and
  // the partner booking page.
  string booking_token = 4 [features.field_presence = EXPLICIT];
}

// A segment traveled on a single vehicle in a given Service Class.
message Segment {
  SegmentKey segment_key = 1;

  // The service class used on this segment.
  ServiceClass service_class = 2;
}

Ejemplo de JSON

{
  "trip_options_result": {
    "trip_options": [
      {
        "segments": [
          {
            "segment_key": {
              "ticketing_trip_id": "123456",
              "from_ticketing_stop_time_id": "ZRH-1234",
              "to_ticketing_stop_time_id": "LUZ-1235",
              "service_date": {
                "year": 2022,
                "month": 4,
                "day": 6
              },
              "boarding_time": {
                "year": 2022,
                "month": 4,
                "day": 6,
                "hours": 14,
                "minutes": 25,
                "seconds": 0,
                "utc_offset": "0s"
              },
              "arrival_time": {
                "year": 2022,
                "month": 4,
                "day": 6,
                "hours": 16,
                "minutes": 25,
                "seconds": 0,
                "utc_offset": "0s"
              }
            },
            "service_class": {
              "type": "FIRST_CLASS"
            }
          },
          {
            "segment_key": {
              "ticketing_trip_id": "234567",
              "from_ticketing_stop_time_id": "LUZ-2759",
              "to_ticketing_stop_time_id": "WOL-2455",
              "service_date": {
                "year": 2022,
                "month": 4,
                "day": 6
              },
              "boarding_time": {
                "year": 2022,
                "month": 4,
                "day": 6,
                "hours": 18,
                "minutes": 13,
                "seconds": 0,
                "utc_offset": "0s"
              },
              "arrival_time": {
                "year": 2022,
                "month": 4,
                "day": 6,
                "hours": 20,
                "minutes": 13,
                "seconds": 0,
                "utc_offset": "0s"
              }
            },
            "service_class": {
              "type": "FIRST_CLASS"
            }
          }
        ],
        "lowest_standard_fare": {
          "total_amount": {
            "units": 15,
            "nanos": 0,
            "currency_code": "CHF"
          },
          "line_items": [
            {
              "line_item_type": "BASE_FARE",
              "amount": {
                "units": 13,
                "nanos": 950000000,
                "currency_code": "CHF"
              }
            },
            {
              "line_item_type": "SERVICE_CHARGE",
              "amount": {
                "units": 1,
                "nanos": 50000000,
                "currency_code": "CHF"
              }
            }
          ]
        },
        "availability": {
          "available": {
            "available_seat_count": 10,
            "total_seat_count": 30
          }
        }
      },
      {
        "segments": [
          {
            "segment_key": {
              "ticketing_trip_id": "123456",
              "from_ticketing_stop_time_id": "ZRH-1234",
              "to_ticketing_stop_time_id": "LUZ-1235",
              "service_date": {
                "year": 2022,
                "month": 4,
                "day": 6
              },
              "boarding_time": {
                "year": 2022,
                "month": 4,
                "day": 6,
                "hours": 14,
                "minutes": 25,
                "seconds": 0,
                "utc_offset": "0s"
              },
              "arrival_time": {
                "year": 2022,
                "month": 4,
                "day": 6,
                "hours": 16,
                "minutes": 25,
                "seconds": 0,
                "utc_offset": "0s"
              }
            },
            "service_class": {
              "type": "SECOND_CLASS"
            }
          },
          {
            "segment_key": {
              "ticketing_trip_id": "234567",
              "from_ticketing_stop_time_id": "LUZ-2759",
              "to_ticketing_stop_time_id": "WOL-2455",
              "service_date": {
                "year": 2022,
                "month": 4,
                "day": 6
              },
              "boarding_time": {
                "year": 2022,
                "month": 4,
                "day": 6,
                "hours": 18,
                "minutes": 13,
                "seconds": 0,
                "utc_offset": "0s"
              },
              "arrival_time": {
                "year": 2022,
                "month": 4,
                "day": 6,
                "hours": 20,
                "minutes": 13,
                "seconds": 0,
                "utc_offset": "0s"
              }
            },
            "service_class": {
              "type": "SECOND_CLASS"
            }
          }
        ],
        "lowest_standard_fare": {
          "total_amount": {
            "units": 10,
            "nanos": 0,
            "currency_code": "CHF"
          },
          "line_items": [
            {
              "line_item_type": "BASE_FARE",
              "amount": {
                "units": 9,
                "nanos": 750000000,
                "currency_code": "CHF"
              }
            },
            {
              "line_item_type": "SERVICE_CHARGE",
              "amount": {
                "units": 0,
                "nanos": 250000000,
                "currency_code": "CHF"
              }
            }
          ]
        },
        "availability": {
          "available": {
            "available_seat_count": 44,
            "total_seat_count": 200
          }
        }
      }
    ]
  }
}

Muestra de error de JSON

{
  "trip_options_error": {
    "error_type": "SEGMENT_KEY_NOT_FOUND",
    "error_message": "No matching segments found, no departures at 14:25"
  }
}

Nota de implementación de la API:

Para garantizar la compatibilidad con posibles cambios, si se encuentran parámetros adicionales en las claves de segmento, siempre devuélvelos en la respuesta. De lo contrario, ignora los parámetros y trata la solicitud como si no estuvieran allí, hasta que implementes la compatibilidad específica con los parámetros.

Respuestas de error

En la siguiente tabla, se describen las expectativas de informes de errores para este método:

Tipo de error Se puede volver a intentar Código de estado HTTP Descripción
SEGMENT_KEY_NOT_FOUND No 404 No se puede encontrar el segmento correspondiente a uno de los SegmentKey proporcionados.
TRIP_OPTION_CACHE_STALE 404 Los datos de la opción de viaje solicitada no están actualizados en el socio y deben actualizarse para proporcionárselos a Google.
INTERNAL_ERROR 500 Se produjo un error inesperado al recuperar este viaje. Esto indica un error que el socio debe corregir.
SUBOPTIMAL_ITINERARY No 404 Se encontró el viaje, pero el socio lo considera subóptimo y decide no vender boletos para él.
TICKETING_PROHIBITED No 404 Se encontró el viaje, pero el socio no puede vender boletos para él debido a las restricciones generales de venta de boletos impuestas por el operador o la autoridad ferroviaria.
BOOKING_WINDOW_NOT_SUPPORTED No 404 El socio no admite itinerarios con precios para la fecha solicitada.

Para obtener más información, consulta TripOptionsErrorType.

Para obtener información sobre el código de estado que se devuelve en las respuestas HTTP, consulta Códigos de estado y control de errores.