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.
El contenido de “access_token” es el que se deberá usar en peticiones posteriores.
Dónde los textos entre < y > se tienen que sustituir por información.
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.
Autenticación
Endpoint: /token Parámetros:- grant_type=password
- client_id
- client_secret
- username
- password
$ 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"
} |
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.
$ 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>
]
} |
- “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.
{
«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 | Sí |
| 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 | Sí |
| 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 | Sí |
| 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 | Sí |
| 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 | Sí |
| 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 | Sí |
| 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 | Sí |
| 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 | Sí | |
| tripType | TripType | Sí | |
| dayOne | Fecha de inicio del viaje | date | Sí |
| days | Dias del viaje | Day | Sí |
| 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 | Sí | |
| priority | Prioridad del periodo | bool | Sí |
| 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 | Sí | |
| 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
$ http https://tripgds.tourknife.com/api/edit \«Authorization: Bearer asd123» \ class=’Tour’ \ id=55 \ data=’{“name”: “Nuevo nombre del tour”, “webSlug”: “nuevo-nombre-tour”}’ |