POST/v1/flights/order/:gdsprovider/:offerId

Crear orden de vuelo

Crea una reserva instantánea o una orden en hold desde una oferta seleccionada. Las reservas públicas resuelven el precio interno desde offerId o desde la oferta trackeada.

Crea una reserva instantánea o una orden en hold desde una oferta seleccionada. Las reservas públicas resuelven el precio interno desde offerId o desde la oferta trackeada.

Endpoint

MétodoRutaAuth
POST/v1/flights/order/:gdsprovider/:offerIdAPI key requerida
Headers obligatorios:
HeaderDescripción
AuthorizationBearer <secret_key>. The secret is shown only once when the credential is created.
X-Travelandz-Id<public_key>:<profile_code>. The profile_code is the dp_-prefixed Developer Profile code shown in your dashboard. This binds the request to a profile and credential.
Content-TypeUse application/json for requests with a body.

Esquema de parámetros de la petición

PropiedadTipoDetallesRequeridoNotas
gdsprovidernumber-
offerIdstring-

Esquema del cuerpo de la petición

PropiedadTipoDetallesRequeridoNotas
currencyenum
EURUSDCNY
Moneda solicitada para la reserva publica. El precio interno se resuelve por offerId o por los datos de la oferta trackeada
passengersarray-
passengers[]id
stringId de pasajero de la oferta seleccionada. Para gdsprovider=1, reutiliza el valor vacio si la oferta envia un id vacio
passengers[]type
enum
adultchildinfant_without_seat
-
passengers[]title
enum
mrmsmrsmiss
-
passengers[]phone_number
string
Format: E.164 phone number
Satisface passengers[].phone. En flujos gdsprovider=1, passengers[0].phone_number tambien satisface holder.phone y deriva holder.countryCode
passengers[]infant_passenger_id
stringNoRequerido cuando el pasajero esta asociado a un infante
passengers[]identity_documents
arrayNoObjetos de documento de identidad. Ejemplo: [{ type, unique_identifier, issuing_country_code, expires_on }]. Requeridos cuando la oferta o required-fields los solicite
passengers[]firstName
stringSatisface passengers[].name desde required-fields
passengers[]lastName
stringSatisface passengers[].lastName desde required-fields
passengers[]gender
enum
mf
-
passengers[]email
stringSatisface passengers[].email. Algunos flujos gdsprovider=1 solo consumen el email del primer pasajero como email principal del titular
passengers[]bornDate
string
Format: YYYY-MM-DD
-
passengers[]country
stringNoCodigo de pais ISO de 2 letras. Usalo cuando required-fields marque nationality como true
passengers[]NationalID
stringNoUsalo cuando el flujo seleccionado requiera numero de identidad nacional. En respuestas actuales de gdsprovider=1 puede estar implicito si allowedDocuments incluye dni, incluso sin un flag explicito nationalId
passengers[]loyaltyProgrammeAccounts
arrayNoObjetos opcionales de cuenta de fidelidad. Ejemplo: [{ airlineIataCode, accountNumber }]. Usalos solo cuando supportedLoyaltyPrograms incluya el codigo de aerolinea
totalSegmentsarray-
totalSegments[]originCode
stringMapped from offer.slices[].segments[].departure.iataCode
totalSegments[]destinationCode
stringMapped from offer.slices[].segments[].arrival.iataCode
totalSegments[]flightNumber
stringMapped from offer.slices[].segments[].flightNumber
totalSegments[]departureDate
string
Format: ISO 8601
Mapped from offer.slices[].segments[].departure.departingAt
holdIdstringNoSolo para proveedores que soportan pago en hold
typeenum
instanthold
NoPor defecto es instant. hold solo aplica cuando el proveedor seleccionado lo soporta

Respuesta exitosa

Devuelve order identifiers, status and provider booking payload.

Esquema del cuerpo de la respuesta

PropiedadTipoDetallesRequeridoNotas
orderIdstring-
holdExpiresAtstring
Format: ISO 8601
No-
holdPriceGuaranteedstringNo-

Notas operativas

  • passengers[].id es el id del pasajero de la oferta seleccionada, no un identificador interno de usuario.
  • No envies identificadores internos de usuario; no forman parte del contrato publico de reserva.
  • No envies originalPrice en reservas publicas. La API resuelve precio y moneda internos desde offerId o desde la oferta trackeada. Si se envia originalPrice, la validacion publica rechaza la peticion por ser un campo no permitido.
  • Envia identity_documents[] cuando la oferta o el endpoint required-fields indiquen que se requieren documentos de identidad.
  • type=hold y holdId solo aplican cuando el flujo seleccionado soporta pago en hold. Las reservas publicas en hold requieren una oferta trackeada para el mismo profile, gdsprovider y offerId; sin ella la API devuelve Tracked flight offer is required to complete this public booking.
  • totalSegments[] solo es requerido cuando el flujo seleccionado necesita metadata de segmentos. Construyelo desde cada item de offer.slices[].segments[].

Mapeo de required-fields a create-order

Respuesta de required-fieldsCampo de create-orderNotas
passengers[].titlepassengers[].titleCoincidencia directa
passengers[].typepassengers[].typeCoincidencia directa
passengers[].namepassengers[].firstNameRenombrado en el body de reserva
passengers[].lastNamepassengers[].lastNameCoincidencia directa
passengers[].genderpassengers[].genderCoincidencia directa
passengers[].bornDatepassengers[].bornDateCoincidencia directa
passengers[].nationalitypassengers[].countryUsa codigo de pais ISO de 2 letras
passengers[].phonepassengers[].phone_numberFormato E.164
passengers[].emailpassengers[].emailEn flujos gdsprovider=1, solo el email del primer pasajero puede consumirse como email del titular
passengers[].documentIdentifierpassengers[].identity_documents[].unique_identifierSolo cuando se requiere un objeto de documento
passengers[].documentTypepassengers[].identity_documents[].typeLimitado por allowedDocuments
passengers[].documentExpiresAtpassengers[].identity_documents[].expires_onSolo cuando es requerido
passengers[].documentCountryCodepassengers[].identity_documents[].issuing_country_codeSolo cuando es requerido
passengers[].allowedDocumentspassengers[].identity_documents[].typeSi incluye dni, tambien recoge passengers[].NationalID
holder.phonepassengers[0].phone_numberAlgunos flujos derivan el contacto del titular desde el primer pasajero
holder.emailpassengers[0].emailAlgunos flujos derivan el contacto del titular desde el primer pasajero
holder.countryCodederivado de passengers[0].phone_numberNo existe un campo separado de reserva; usa el prefijo telefonico E.164

Los flags genericos age, address, city, postalCode y documentIssuedAt actualmente no mapean a campos publicos explicitos de reserva.

Payloads anidados de pasajero

json
json
{
  "identity_documents": [
    {
      "type": "passport",
      "unique_identifier": "X1234567",
      "issuing_country_code": "ES",
      "expires_on": "2030-12-31"
    }
  ],
  "loyaltyProgrammeAccounts": [
    {
      "airlineIataCode": "BA",
      "accountNumber": "123456789"
    }
  ]
}

Ejemplo de totalSegments

json
json
[
  {
    "originCode": "MAD",
    "destinationCode": "BCN",
    "flightNumber": "1234",
    "departureDate": "2026-08-20T08:15:00"
  }
]
totalSegmentsOrigen en offer.slices[].segments[]
originCodesegment.departure.iataCode
destinationCodesegment.arrival.iataCode
flightNumbersegment.flightNumber
departureDatesegment.departure.departingAt

Ejemplo

bash
bash
curl -X POST https://api.sandbox.travelandz.com/v1/flights/order/0/offer_123 \
  -H "Authorization: Bearer $TRAVELANDZ_SECRET_KEY" \
  -H "X-Travelandz-Id: $TRAVELANDZ_PUBLIC_KEY:$TRAVELANDZ_PROFILE_CODE" \
  -H "Content-Type: application/json" \
  -d '{"currency":"EUR","type":"instant","passengers":[{"id":"pas_0001","type":"adult","title":"mr","phone_number":"+34612345678","firstName":"John","lastName":"Doe","gender":"m","email":"john.doe@example.com","bornDate":"1990-01-15","country":"ES"}]}'