API de creación de viajes En este documento se explica cómo usar la API de TripGDS para la publicación de viajes en el sistema. La API es de tipo REST con uso de datos en formato json. La autenticación en Oauth2, por lo que se requieren unas credenciales de cliente y unas credenciales de usuario.

Autenticación

Endpoint: /token Parámetros:
  • grant_type=password
  • client_id
  • client_secret
  • username
  • password
Los valores de client_id y client_secret son proporcionados por el equipo técnico de Tourknife. Los valores de username y password son los de usuario creado por el cliente en TK. Esta llamada devuelve un token de autenticación que hay que usar en las peticiones de creación (a continuación) añadiendolo en la cabecera. Ejemplo usando httpie desde consola Linux:
$ http https://AAA.tourknife.com/token \
grant_type=password client_id=XXX client_secret=YYY username=apiuser password=ZZZ

HTTP/1.1 200 OK

{

"access_token": "eyJ0....u9W47",

"expires_in": 3599,

"refresh_token": "def50200e6490c6c...9dc0d6",

"token_type": "Bearer"

}
El contenido de “access_token” es el que se deberá usar en peticiones posteriores.

Peticiones de creación

Endpoint: /api/new Parámetros:
  • class: Entidad principal a crear
  • instances: Es un string en formato json que comienza con un array ([]) de hashes ({}), dónde en cada hash están los datos de una entidad. Definido en el siguiente punto.
Ejemplo usando httpie desde consola Linux:
$ http https://tripgds.tourknife.com/api/new \
"Authorization: Bearer eyJ0eXA...QBA2wP2A" \

class=’Tour’ \

instances=’[{...},{...}]’

Estructura del json

La estructura general del json de datos para publicar es esta:
{
“class”: <nombre de la entidad> “instances”: [ <datos de la entidad> ] }
Dónde los textos entre < y > se tienen que sustituir por información.
  • “class” es el nombre de la entidad que que quiere crear
  • “instances” es un array (indicado por “[“ y “]”) dónde hay que ir añadiendo los datos de las instancias (del tipo “class”) que se quieren crear.
Ejemplo básico para la creación de un Tour con un itinerario y varias salidas:
{
«class»: «Tour», «instances»: [ { «name»: «Un tour 5», «description»: «Un tour es una experiencia única que te permite explorar nuevos lugares y culturas. Disfruta de paisajes impresionantes, gastronomía local y actividades emocionantes.», «subtitle»: «Un viaje maravilloso», «priceModel»: 0, «servicesTxt»: «Los servicios del tour son buenos», «notIncludedTxt»: «La propinas y comidas no están incluidas», «commentTxt»: «Soy un comentario preciso y conciso», «summaryTxt»: «Este es el resumen del tour», «mapTxt»: «<iframe src=\»https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d108252.10553859534!2d2.0577886891645023!3d41.39263855834232!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x12a49816718e30e5%3A0x44b0fb3d4f47660a!2sBarcelona!5e1!3m2!1ses!2ses!4v1750244761302!5m2!1ses!2ses\» width=\»600\» height=\»450\» style=\»border:0;\» allowfullscreen=\»\» loading=\»lazy\» referrerpolicy=\»no-referrer-when-downgrade\»></iframe>», «itineraries»: { «class»: «Itinerary», «instances»: [ { «name»: «Itinerario principal», «description»: «Este es el itinerario principal del tour, que incluye visitas a los lugares más emblemáticos.», «days»: { «class»: «ItineraryDay», «instances»: [ { «rank»: 1, «name»: «Día 1: Llegada», «activities»: { «class»: «Activity», «instances»: [ { «name»: «Vuelo de ida», «servicesTxt»: «Vuelo para llegar a Coma-Ruga, aeródromo de Santa Oliva.» }, { «name»: «Hotel en Coma-Ruga» } ] } }, { «rank»: 2, «name»: «Día 2: Exploración», «activities»: { «class»: «Activity», «instances»: [ { «name»: «Hotel en Coma-Ruga» }, { «name»: «Excursión al riuet», «iniTime»: «10:00», «endTime»: «12:00» } ] } }, { «rank»: 3, «name»: «Día 3: Aventura», «activities»: { «class»: «Activity», «instances»: [ { «name»: «Hotel en Coma-Ruga» }, { «name»: «Visita a los viñedos de St. Vicenç de Calders», «iniTime»: «11:00», «endTime»: «13:00», «onDemandType»: 2 }, { «name»: «Vuelo de regreso» } ] } } ] }, «periods»: { «class»: «Period», «instances»: [ { «name»: «Salida del 7 de Noviembre 2025», «subtitle»: «Una salida interesante», «dayOne»: «2025-10-07», «days»: { «class»: «Day», «instances»: [ { «date»: «2025-10-07» }, { «date»: «2025-10-08» }, { «date»: «2025-10-09» } ] }, «maxPax»: 22, «minPax»: 4, «featured»: 1, «status»: 10, «published»: 10, «webBookable»: 1, «webRequest»: 0, «infoCompleted»: 1 }, { «name»: «Salida del 14 de Noviembre 2025», «subtitle»: «Una salida más interesante y reducida», «dayOne»: «2025-10-14», «days»: { «class»: «Day», «instances»: [ { «date»: «2025-10-14» }, { «date»: «2025-10-15» }, { «date»: «2025-10-16» } ] }, «maxPax»: 12, «minPax»: 2, «featured»: 1, «status»: 10, «published»: 10, «webBookable»: 1, «webRequest»: 0, «infoCompleted»: 1 } ] } } ] }, «seoTitle»: «Un tour maravilloso», «metaDescription»: «Lorem ipsum diría que sabe», «metaRobotsIndex»: 1, «webSlug»: «un-tour», «featured»: 1, «priority»: 1, «fiscalType»: 0, «percentageVat»: 10, «tourType»: 1, «tourClass»: 1, «privacyType»: 2 } ] }

Descripción de clases

A continuación describimos los datos para cada clase.

Tour

Propiedad Descripción Tipo de dato Obligatorio
name El nombre del tour string
description Descripción detallada del tour string No
subtitle Subtítulo para mostrar en la web string No
priceModel Modelo de precios 0: basado en periodos 1: basado en productos int Sí (0 por defecto)
servicesTxt Texto relacionado con los servicios que se ofrecen en el tour string No
notIncludedTxt Texto sobre los servicios que no están incluídos en el tour string No
commentTxt Comentarios generales string No
summaryTxt Texto resumen. string No
mapTxt Espacio dónde se puede incrustar el HTML de un mapa del recorrido string No
itineraries Relación con Itinerary Itinerary
user
leadUser
mergeGroup
seoTitle Texto para poner en el título de la web del tour string No
metaDescription Texto para la descripción en la cabecera de la web string No
metaRobotsIndex Indica si la web del tour se tiene que indexar bool Sí (1 por defecto)
webSlug URI dónde se puede acceder a la web del tour string
featured bool Sí (0 por defecto)
priority Prioridad del tour en los resultados, cómo más mejor. int Sí (0 por defecto)
fiscalType int No
percentageVat Tanto por ciento de IVA que se le aplica al tour float No
retailerBaseTourPaymentTypes
tourType Tipo de tour 0: Todos 1: En grupo 10: FIT 30: Actividad 40: Reserva int No (0 por defecto)
tourClass Estilo del tour 1: Multiservicio 2: Monoservicio int Sí (1 por defecto)
privacyType Indica si el tour es privado 1: Privado 2: Público int Sí (2 por defecto)
contractSignatureRequired bool Sí (1 por defecto)
tripType TripType
customDepartures Indica si el tour tiene salidas personalizadas bool Sí (0 por defecto)
customActivities Indica si el tour tiene actividades personalizadas bool Sí (0 por defecto)
visibleIn bool Sí (0 por defecto)
tourCategories Category
reservationType int Sí (1 por defecto)
leadDates Indica cómo se puede solicitar información para el tour 1: Sólo en las fechas predefinidas del tour 2: En cualquier fecha int Sí (1 por defecto)
leadDepartures Indica desde qué ciudades de salida se puede solicitar información del tour 1: Sólo para las ciudades de salida definidas en el tour 2: Para cualquier ciudad de salida int Sí (1 por defecto)
showItineraryOnWeb bool Sí (0 por defecto)
showItineraryDaysOnWeb bool Sí (0 por defecto)
showCalendarOnWeb bool Sí (0 por defecto)
showSimilarToursOnWeb bool Sí (0 por defecto)
showToursDestinationButtonOnWeb bool Sí (0 por defecto)
showPricesOnWeb bool Sí (1 por defecto)
summaryItemsOnWeb bool No
freeTextOnWeb string No
language Language
showOnePricePerDepartureCity bool Sí (0 por defecto)

Itinerary

Propiedad Descripción Tipo de dato Obligatorio
name El nombre del itinerario string
description Descripción del itinerario string No
hasPrice bool Sí (0 por defecto)
subtitle string No
maxPax Máximo de viajeros para el itinerario int No
minPax Mínimo de viajeros para el viaje int No (0 por defecto)
periods Period No
days ItineraryDay No
activityGroups ActivityCompeticionGroup No
itineraryExtencions ItineraryExtension No
tripPercentageInUE Parte del tour (en %) que transcurre en territorio de la Unión Europea int No
tripPercentageOutsideUE Resto del tour, que transcurre fuera de la UE int No
maxCancellationDate Fecha límite para cancelación del viaje date No
periodTemplate Period
isVariableRoommates Indica si el viaje se puede hacer cambiando compañeros de habitación bool No (0 por defecto)
generateQr Habilitar uso de QR bool Sí (0 por defecto)
autoConsumeOnQr Descontar pax al leer el QR bool Sí (0 por defecto)

Activity

Propiedad Descripción Tipo de dato Obligatorio
name El nombre de la actividad string
serviceType Tipo de actividad 1: Vuelo 2: Alojamiento 3: Transporte 4: Guía 5: Otro 99: Sin tipo 100: Desconocido 101: Falso 200: Múltiple int
subType int No
serviceAssignationType int No
createDefaultServices bool No (0 por defecto)
createDefaultServicesByActivity bool No (0 por defecto)
defaultServiceType 1: General 2: Por itinerario 3: Por periodo 4: Específico 5: Servicio existente int No (1 por defecto)
defaultServiceTypeFlightType int No
onDemandType 1: Reserva 2: Stock int No
onDemandServiceType 1: Proveedor desconocido 2: Proveedor conocido int No
servicesTxt string No
iniTime time No
endTime time No
dayTypePattern bool No
dayTypes DayType
rank int No
activityCompetitionGroups ActivityCompetitionGroup No
activityGroups ActivityGroup No
activityPeriods ActivityPeriod No
projectionText string No

Period

Propiedad Descripción Tipo de dato Obligatorio
name El nombre del itinerario string
description Descripción del itinerario string No
startDate (DateRangeTrait) No
endDate (DateRangeTrait) No
parentDateRange (DateRangeTrait) DateRange
childDateRanges (DateRangeTrait) DateRange
type (DateRangeTrait) No
timeName (TimeRangeTrait)
startTime (TimeRangeTrait)
endTime (TimeRangeTrait)
subtitle string No
reservationServicesReassign bool Sí (0 por defecto)
itinerary Itinerary
tripType TripType
dayOne Fecha de inicio del viaje date
days Dias del viaje Day
specificReservationModes Indica si el periodo tiene unos modos de reserva específicos y distintos a los del tour bool Sí (o por defecto)
activities Actividades que se realizan en el periodo Activity
activityGroups ActivityGroup
maxPax Mínimo de personal para el viaje int No
minPax Màximo número de personas que pueden hacer el viaje int No
currentPax Número actual de viajeros int No
paxCapacity int No
lastDate Fecha de finalización del viaje date No
activityPeriods ActivityPeriod
webSlug URI del periodo concreto string No
featured bool
priority Prioridad del periodo bool
status Estado del periodo 0: En preparación 10: No hay personas mínimas 20: Salida garantizada 40: Ventas cerradas 60: Reabierto 80: El viaje ha salido 90: El viaje ha regresado int Sí (0 por defecto)
salesClosedNewReservations float No
capacityCost float No
highlightsFromTour bool No (1 por defecto)
sustainabilityHighlightsFromTour bool No (1 por defecto)
accommodationFromTour bool No (1 por defecto)
accommodationResourceFromItinerary bool No (1 por defecto)
maxCancellationDate Fecha límite de cancelación date No
maxCancellationDateFromItinerary bool No (1 por defecto)
inExpenses bool Sí (0 por defecto)
templatedItinerary Itinerary
generalCommentsFromTour Sí (1 por defecto)
servicesTxt string No
notIncludedTxt string No
commentTxt string No
specificExtraDaysConfig bool
published El periodo está publicado (en TK) 0: No publicado 10: Publicado 20: Pre-publicado int Sí (0 por defecto)
bookable El periodo se puede reservar (en TK) bool Sí (0 por defecto)
infoCompleted El periodo tiene todos los datos informados y se puede publicar bool Sí (0 por defecto)
webBookable El periodo está reservable en la web bool Sí (0 por defecto)
webRequest Se puede pedir presupuesto para el periodo bool Sí (0 por defecto)
intranetPublished bool Sí (0 por defecto)

Peticiones de edición

Endpoint: /api/edit Parámetros:
  • class: Nombre de la clase a editar
  • id: Identificador interno de la entidad
  • data: Cadena json con las parejas <propiedad>: <valor> a modificar
Ejemplo de llamada de edición para modificar el nombre y URI de un tour:
$ http https://tripgds.tourknife.com/api/edit \
«Authorization: Bearer asd123» \ class=’Tour’ \ id=55 \ data=’{“name”: “Nuevo nombre del tour”, “webSlug”: “nuevo-nombre-tour”}’
Hay que tener en cuenta que para una entidad sólo se pueden modificar sus valores directos. Es decir, que por ejemplo no se pueden modificar los valores de un itinerario desde la clase tour.