[{"data":1,"prerenderedAt":2271},["ShallowReactive",2],{"ADwPdXS24D":3,"mdc-4323-fx32el":1803},{"apis":4,"types":69,"datasets":162,"datasources":562,"customer_types":627,"applications":712,"posts":793,"authors":1037,"recipes":1072},[5,16,29,39,45,51,58],{"id":6,"fields":7},"rec0eGRxbdGmvkoQG",{"Icon":8,"Entity":9,"Type":10,"Code":11,"defaultImportSchedule":12,"Credits":13,"Types":14},"fi-rr-plane","flight","feed","feed-flight-rate","daily",50,[15],"recCHNUh2GY4XPGWU",{"id":17,"fields":18},"rec95KQ0Iqvq6pFdM",{"Icon":19,"Entity":20,"configurationService":21,"Type":10,"Group":23,"Code":24,"defaultImportSchedule":25,"Credits":26,"Types":27},"fi-rr-ticket","location",[22],"visibilityMonths","feed-event","feed-event-tier1","monthly",4000,[28],"recI27NQd09QiiAjU",{"id":30,"fields":31},"rec9KOrR1XD4r8PrZ",{"Icon":32,"Entity":33,"Type":34,"Code":35,"Credits":36,"Types":37},"fi-rr-reflect","accommodation","realtime","realtime-accommodation-parity",1.1765,[38],"recdhPlA4VLSodK7R",{"id":40,"fields":41},"recJTKcnfmdHEmCmx",{"Icon":8,"Entity":9,"Type":34,"Code":42,"Credits":43,"Types":44},"realtime-flight-rate",1,[15],{"id":46,"fields":47},"recN7obYuzREciRAx",{"Icon":48,"Entity":33,"Type":34,"Code":49,"Credits":36,"Types":50},"fi-rr-arrow-up-right-from-square","realtime-expedia-rate",[38],{"id":52,"fields":53},"recU04sGOlwjyJrK1",{"Icon":19,"Entity":20,"configurationService":54,"Type":10,"Group":23,"Code":55,"defaultImportSchedule":25,"Credits":56,"Types":57},[22],"feed-event-tier2",1500,[28],{"id":59,"fields":60},"recy3dxciw0bCDIP2",{"Icon":61,"Entity":62,"configurationService":63,"Type":10,"Code":65,"defaultImportSchedule":12,"Credits":66,"Types":67},"fi-rr-search","search",[64],"visibilityDays","feed-booking-location-search",9.84,[68],"reccB5EgpDi9z7qsJ",[70,80,90,100,108,123,131,138,151],{"id":15,"fields":71},{"Name":72,"Apis":73,"Datasets":74,"Url_en":77,"Name_Seo_en":72,"Url_es":78,"Name_Seo_es":79},"flights",[40,6],[75,76],"rec9WlPJrM5BSmiXr","rec9Bq1R2pe3gKhYR","/data-type/flights","/tipo-datos/vuelos","vuelos",{"id":28,"fields":81},{"Name":82,"Apis":83,"Datasets":84,"Url_en":87,"Name_Seo_en":82,"Url_es":88,"Name_Seo_es":89},"events",[17,52],[85,86],"recgTf4OIGlMTain9","recX2sCXKkD8u793N","/data-type/events","/tipo-datos/eventos","eventos",{"id":91,"fields":92},"recVdxQ8X9PTXqTck",{"Name":93,"Datasets":94,"Url_en":97,"Name_Seo_en":93,"Url_es":98,"Name_Seo_es":99},"market",[95,85,76,96],"recJu5QR0Gh1zTz8S","rec7L2mYD5FTUqJEN","/data-type/market","/tipo-datos/mercado","mercado",{"id":68,"fields":101},{"Name":102,"Apis":103,"Datasets":104,"Url_en":105,"Name_Seo_en":102,"Url_es":106,"Name_Seo_es":107},"searches",[59],[96],"/data-type/searches","/tipo-datos/busquedas","busquedas",{"id":38,"fields":109},{"Name":110,"Apis":111,"Datasets":112,"Url_en":120,"Name_Seo_en":110,"Url_es":121,"Name_Seo_es":122},"accommodations",[30,46],[113,114,115,116,117,118,95,119],"recCybKfOF5EOLfO6","rec1UyHSjGMml3vau","reciTQLJ2LRXTOmix","recegXsjU6GfOss2W","recspTqNVvQLidOig","recPqDdaSeiAUO7iu","rectPOVmO6amu6CFV","/data-type/accommodations","/tipo-datos/alojamientos","alojamientos",{"id":124,"fields":125},"recnUBJJ2jAi1kDRz",{"Name":126,"Datasets":127,"Url_en":128,"Name_Seo_en":126,"Url_es":129,"Name_Seo_es":130},"locations",[85,86],"/data-type/locations","/tipo-datos/ubicaciones","ubicaciones",{"id":132,"fields":133},"recnamlC9Sq8dpbnG",{"Name":134,"Url_en":135,"Name_Seo_en":134,"Url_es":136,"Name_Seo_es":137},"custom","/data-type/custom","/tipo-datos/personalizado","personalizado",{"id":139,"fields":140},"recthSXmM8XyVCGmA",{"Name":141,"Datasets":142,"Url_en":149,"Name_Seo_en":141,"Url_es":150,"Name_Seo_es":141},"pms",[143,144,145,146,147,148],"recGSLJ0qQLopxBDL","recA4EnGBkqjFEQb9","recnDAI5fSVBwkmUm","recEzctujt2uDSabB","recwkxo0sEJWVchCu","recIhZrWzwp2gFeXr","/data-type/pms","/tipo-datos/pms",{"id":152,"fields":153},"recwzZ12BYFioFBSv",{"Name":154,"Datasets":155,"Url_en":159,"Name_Seo_en":154,"Url_es":160,"Name_Seo_es":161},"reputation",[156,157,158],"recL2rsbyYGGXC1UI","rece0g0OUnaxxImRv","recZ49luJHCl7kKyq","/data-type/reputation","/tipo-datos/reputacion","reputacion",[163,194,220,239,258,274,299,314,329,344,363,385,400,418,434,449,468,484,500,515,529,547],{"id":114,"fields":164},{"Url_es":165,"Name":166,"Name_Seo_en":166,"Link":167,"Recipes":168,"Title_es":170,"URL Documentation":171,"Customer Types":172,"Url_en":178,"Title_en":179,"Datasources":180,"Description_en":184,"Types":185,"Applications":186,"Name_Seo_es":192,"Description_es":193},"/dataset/disponibilidad-hotelera","availability","https://www.veetal.app/",[169],"recy0107demQAwi0T","Disponibilidad","https://developers.veetal.app/#tag/feed-api/get/feed/accommodation/{accommodation_slug}/rate",[173,174,175,176,177],"recL1mt8kaY77MnTc","rec65SJfvrIcgaMDw","recAeoZCIdHHANnCz","recKGQaV01k98zkwA","recDJvADpXi3erFvg","/dataset/availability","Availability",[181,182,183],"recQfAct4I4YGALMY","recHG8VFIbcxdh0Tj","rece5EUjIP2ihr7YO","Access real-time hotel availability data from top OTAs. Avoid overbooking, optimize occupancy, and keep your systems updated instantly via Veetal Connect API.\n",[38],[187,188,189,190,191],"recNwrh1FZz7j5emv","recuWNtzcaT5UKzSY","recmUecUJV8cB2Mcd","rec98ZNTDGdaCE6u9","recSlTXaMqxlFvkH1","disponibilidad-hotelera","Accede a datos de disponibilidad hotelera en tiempo real desde los principales OTAs. Evita el overbooking, optimiza la ocupación y mantén tus sistemas actualizados al instante con Veetal Connect API.\n",{"id":96,"fields":195},{"Url_es":196,"Name":197,"Name_Seo_en":198,"Link":167,"Recipes":199,"Title_es":203,"URL Documentation":204,"Customer Types":205,"Url_en":210,"Title_en":211,"Datasources":212,"Description_en":213,"Types":214,"Applications":215,"Name_Seo_es":218,"Description_es":219},"/dataset/booking-lista-ubicaciones","booking_location_listing","booking-location-listing",[200,201,202],"recF5DSbpI10mMkcn","reclVMlxDjsvpdEp9","recb0a6ZKnE0ecdlP","Lista de hoteles por ubicación","https://developers.veetal.app/#tag/feed-api/get/feed/location-search/{location_search_id}/{target_date}/booking-location-search",[206,207,208,209,173],"reczVdH3mfq2cqqgD","rec4e5mpYwBJPSJey","reckUqyAuvcLuFcWg","rechjPl4dfep3AUZY","/dataset/booking-location-listing","Booking location listing",[181],"Filter and find hotels by locations and preferences\n",[91,68],[216,217],"recRrofeTDR0RKPJU","reczHNRNWQm1q2HcO","booking-lista-ubicaciones","Filtra y encuentra hoteles por ubicaciones y preferencias\n",{"id":76,"fields":221},{"Url_es":222,"Name":223,"Name_Seo_en":224,"Link":167,"Title_es":225,"Customer Types":226,"Url_en":227,"Title_en":228,"Datasources":229,"Description_en":233,"Types":234,"Applications":235,"Name_Seo_es":237,"Description_es":238},"/dataset/demanda-vuelos","flight_demand","flight-demand","Demanda de vuelos",[207,206,175,176,177],"/dataset/flight-demand","Flight demand",[230,231,232],"rec4XX3Fb8AyAkOg6","recEb9jO9WI2lHy1U","recRBdMSENEAgkzVN","Access flight demand data to anticipate hotel occupancy and effectively adjust rates and marketing strategies.\n",[15,91],[216,187,189,236,191],"recjR78EiLAlpiMzg","demanda-vuelos","Accede a datos de demanda de vuelos para anticipar la ocupación hotelera y ajustar tarifas y estrategias de marketing de manera efectiva.\n",{"id":75,"fields":240},{"Url_es":241,"Name":242,"Name_Seo_en":243,"Link":167,"Recipes":244,"Title_es":247,"URL Documentation":248,"Customer Types":249,"Url_en":250,"Title_en":251,"Datasources":252,"Description_en":253,"Types":254,"Applications":255,"Name_Seo_es":256,"Description_es":257},"/dataset/tarifas-vuelos","flight_rates","flight-rates",[245,246],"recRQLE8ZxkmbtfKy","recOn0OYTplBkiuxx","Tarifas de vuelo","https://developers.veetal.app/#tag/feed-api/get/feed/flight/{flight_id}/rates",[208,174,175,176,177],"/dataset/flight-rates","Flight rates",[230,231,232],"Access flight fare data to adjust your marketing and hotel pricing strategies in line with travel trends.\n",[15],[236],"tarifas-vuelos","Accede a datos de tarifas de vuelos para ajustar tus estrategias de marketing y precios hoteleros alineados con las tendencias de viaje.\n",{"id":144,"fields":259},{"Url_es":260,"Name":261,"Name_Seo_en":262,"Link":167,"Title_es":263,"Customer Types":264,"Url_en":265,"Title_en":266,"Datasources":267,"Description_en":269,"Types":270,"Applications":271,"Name_Seo_es":272,"Description_es":273},"/dataset/reservas-pms","pms_reservations","pms-reservations","Reservas de PMS",[206,207,174,208],"/dataset/pms-reservations","PMS bookings",[268],"rec6AO9jdRhPcU7yG","PMS reservation data is crucial to managing availability and ensuring a seamless guest experience.\n",[139],[187,190],"reservas-pms","Los datos de reservas del PMS son cruciales para gestionar la disponibilidad y asegurar una experiencia fluida para los huéspedes.\n",{"id":113,"fields":275},{"Url_es":276,"Name":277,"Name_Seo_en":278,"Link":167,"Recipes":279,"Title_es":286,"URL Documentation":171,"Customer Types":287,"Url_en":288,"Title_en":289,"Datasources":290,"Description_en":291,"Types":292,"Applications":293,"Name_Seo_es":297,"Description_es":298},"/dataset/tarifas-hoteles","hotel_rates","hotel-rates",[280,281,282,283,284,285],"recltiHBEqBpNwHg7","reckxnAsjYpk8coUy","recldh7e087mU6Yhc","recDn5mK71kVxzcpI","recguYT7SoWAeM3xT","recIlVF2v7zdSpjkp","Tarifas de hotel",[207,208,175,176,177],"/dataset/hotel-rates","Hotel rates",[181,182,183],"Access real-time hotel rate data from Booking.com, Expedia, Google Hotels and more. Power your pricing strategy, revenue tools, and travel apps with structured hotel rate feeds.\n",[38],[294,187,188,189,295,296,191],"recwgFcfYyNruae4v","rec4544JKP0JS5IV8","rec2K2Tzi112OEfOr","tarifas-hoteles","Accede a datos de tarifas hoteleras en tiempo real desde Booking.com, Expedia, Google Hotels y más. Potencia tu estrategia de precios, herramientas de revenue y apps de viaje con feeds estructurados.\n",{"id":146,"fields":300},{"Url_es":301,"Name":302,"Name_Seo_en":303,"Link":167,"Title_es":304,"Customer Types":305,"Url_en":306,"Title_en":307,"Datasources":308,"Description_en":309,"Types":310,"Applications":311,"Name_Seo_es":312,"Description_es":313},"/dataset/tipos-habitacion-pms","pms_room_types","pms-room-types","Tipos de habitación de PMS",[206,207,174,208],"/dataset/pms-room-types","PMS room types",[268],"PMS room type data enables hotels to offer varied and attractive options to guests.\n",[139],[187],"tipos-habitacion-pms","Los datos sobre tipos de habitación del PMS permiten a los hoteles ofrecer opciones variadas y atractivas para los huéspedes.\n",{"id":143,"fields":315},{"Url_es":316,"Name":317,"Name_Seo_en":318,"Link":167,"Title_es":319,"Customer Types":320,"Url_en":321,"Title_en":322,"Datasources":323,"Description_en":324,"Types":325,"Applications":326,"Name_Seo_es":327,"Description_es":328},"/dataset/alojamientos-pms","pms_accommodations","pms-accommodations","Alojamientos de PMS",[206,207,174,208],"/dataset/pms-accommodations","PMS accommodations",[268],"Property data from your PMS is essential for managing reservations efficiently and improving the guest experience.\n",[139],[187],"alojamientos-pms","Los datos de alojamientos del PMS son esenciales para gestionar reservas de manera eficiente y mejorar la experiencia del huésped.\n",{"id":148,"fields":330},{"Url_es":331,"Name":332,"Name_Seo_en":333,"Link":167,"Title_es":334,"Customer Types":335,"Url_en":336,"Title_en":337,"Datasources":338,"Description_en":339,"Types":340,"Applications":341,"Name_Seo_es":342,"Description_es":343},"/dataset/planes-tarifas-pms","pms_rate_plans","pms-rate-plans","Planes de tarifas de PMS",[206,207,174,208],"/dataset/pms-rate-plans","PMS rate plans",[268],"PMS rate data is essential for setting competitive prices and maximizing revenue.\n",[139],[187,190],"planes-tarifas-pms","Los datos de tarifas del PMS son esenciales para establecer precios competitivos y maximizar ingresos.\n",{"id":95,"fields":345},{"Url_es":346,"Name":347,"Name_Seo_en":348,"Link":167,"Recipes":349,"Title_es":351,"URL Documentation":352,"Customer Types":353,"Url_en":355,"Title_en":356,"Datasources":357,"Description_en":358,"Types":359,"Applications":360,"Name_Seo_es":361,"Description_es":362},"/dataset/demanda-mercado","market_demand","market-demand",[350],"recedkJNCQKFzNfVK","Demanda de mercado","https://developers.veetal.app/#tag/feed-api/get/feed/location-search/{location_search_id}/{date}/demand",[208,354,209,175,176,177],"recQUTNSjT1k30Erl","/dataset/market-demand","Market demand",[181,182,183],"Access data on market demand to optimize rates and maximize revenue in the hotel industry.\n",[38,91],[189,187,188,217,216,236,190,191],"demanda-mercado","Accede a datos sobre la demanda del mercado para optimizar tarifas y maximizar ingresos en la industria hotelera.\n",{"id":156,"fields":364},{"Url_es":365,"Name":366,"Name_Seo_en":366,"Link":167,"Recipes":367,"Title_es":371,"URL Documentation":372,"Customer Types":373,"Url_en":374,"Title_en":375,"Datasources":376,"Description_en":378,"Types":379,"Applications":380,"Name_Seo_es":383,"Description_es":384},"/dataset/opiniones","reviews",[368,369,370],"recU8n7xt8yX8VIWY","recrhQudweYCCJJb6","recirVkCV94RIgB21","Reseñas","https://developers.veetal.app/#tag/feed-api/get/feed/accommodation/{accommodation_slug}/reviews",[206,208,207,173,354,174,209,175,176,177],"/dataset/reviews","Reviews",[181,182,183,377],"rec6iCmh0EIM7mEhO","Access structured hotel guest reviews from Booking.com, TripAdvisor, and Expedia via API. Monitor your reputation, benchmark against competitors, and power recommendation engines with real guest feedback.\n",[152],[187,189,381,382],"recGDvCRB8MGUbIxQ","recBYbd3ufSNfNJVy","opiniones","Accede a reseñas estructuradas de huéspedes hoteleros desde Booking.com, TripAdvisor y Expedia vía API. Monitoriza tu reputación, compara con la competencia y potencia motores de recomendación con feedback real.\n",{"id":118,"fields":386},{"Url_es":387,"Name":388,"Name_Seo_en":389,"Link":167,"Title_es":390,"Customer Types":391,"Url_en":392,"Title_en":393,"Datasources":394,"Description_en":395,"Types":396,"Applications":397,"Name_Seo_es":398,"Description_es":399},"/dataset/tipos-habitacion","room_types","room-types","Tipos de habitación",[206,173,175,176,177],"/dataset/room-types","Room types",[181,182,183],"Access data on accommodation options to maximize occupancy and meet your guests' preferences.\n",[38],[187,188,191],"tipos-habitacion","Accede a datos sobre opciones de alojamiento para maximizar la ocupación y satisfacer las preferencias de tus huéspedes.\n",{"id":86,"fields":401},{"Url_es":402,"Name":403,"Name_Seo_en":404,"Link":167,"Title_es":405,"URL Documentation":406,"Customer Types":407,"Url_en":408,"Title_en":409,"Datasources":410,"Description_en":412,"Types":413,"Applications":414,"Name_Seo_es":416,"Description_es":417},"/dataset/estimacion-eventos","event_estimation","event-estimation","Estimación de eventos","https://developers.veetal.app/#tag/feed-api/get/feed/event/assistants-range",[206,208,207,209,175,176,177],"/dataset/event-estimation","Event estimation",[411],"recHTbDtG6IBvzxJp","Event estimation allows you to predict visitor influx and adjust marketing strategies to maximize occupancy.\n",[28,124],[415],"recguaLgPffQvSAkK","estimacion-eventos","La estimación de eventos permite prever la afluencia de visitantes y ajustar estrategias de marketing para maximizar la ocupación.\n",{"id":158,"fields":419},{"Url_es":420,"Name":421,"Name_Seo_en":421,"Link":167,"Recipes":422,"Title_es":425,"URL Documentation":426,"Customer Types":427,"Url_en":420,"Title_en":428,"Datasources":429,"Description_en":430,"Types":431,"Applications":432,"Name_Seo_es":421,"Description_es":433},"/dataset/rating","rating",[423,424],"rec1pdlYLPa8E22CU","recGNo5Lkl6itiJu4","Puntuación","https://developers.veetal.app/#tag/feed-api/get/feed/accommodation/{accommodation_slug}/reputation",[206,208,207,173,354,174,209,175,176,177],"Rating",[181,182,183,377],"Ratings are essential for evaluating a hotel's performance, reflecting customer satisfaction and guiding booking decisions.\n",[152],[189,381,382],"Las calificaciones son esenciales para evaluar el rendimiento de un hotel, reflejando la satisfacción del cliente y guiando decisiones de reserva.\n",{"id":157,"fields":435},{"Url_es":436,"Name":437,"Name_Seo_en":438,"Link":167,"Title_es":439,"Customer Types":440,"Url_en":441,"Title_en":442,"Datasources":443,"Description_en":444,"Types":445,"Applications":446,"Name_Seo_es":447,"Description_es":448},"/dataset/analisis-semantico","semantic_analysis","semantic-analysis","Análisis semántico",[208,209,174],"/dataset/semantic-analysis","Semantic analysis",[181,182,183,377],"Semantic analysis helps you better understand customer opinions by extracting meanings and patterns from reviews.\n",[152],[189,382],"analisis-semantico","El análisis semántico permite comprender mejor las opiniones de los clientes al extraer significados y patrones de las reseñas.\n",{"id":116,"fields":450},{"Url_es":451,"Name":452,"Name_Seo_en":453,"Link":167,"Recipes":454,"Title_es":457,"URL Documentation":458,"Customer Types":459,"Url_en":460,"Title_en":461,"Datasources":462,"Description_en":463,"Types":464,"Applications":465,"Name_Seo_es":466,"Description_es":467},"/dataset/competidores-hoteles","competitors","hotel-competitors",[455,456],"recUZcm4XkZrO6eO6","recBR7p9RL96KnDyY","Competidores","https://developers.veetal.app/#tag/account-api/get/account/accommodation/{accommodation_slug}/competitors",[209,174],"/dataset/hotel-competitors","Competitors",[181,182,183],"Monitor competitor hotel rates and offers in real time. Adjust your pricing strategy and gain market advantage with structured competitor data from Veetal.\n",[38],[187,188,189,191],"competidores-hoteles","Monitoriza las tarifas y ofertas de tus competidores hoteleros en tiempo real. Ajusta tu estrategia de precios y gana ventaja competitiva con datos estructurados de Veetal.\n",{"id":85,"fields":469},{"Url_es":470,"Name":82,"Name_Seo_en":82,"Link":167,"Recipes":471,"Title_es":474,"URL Documentation":475,"Customer Types":476,"Url_en":477,"Title_en":478,"Datasources":479,"Description_en":480,"Types":481,"Applications":482,"Name_Seo_es":89,"Description_es":483},"/dataset/eventos",[472,473],"rec4yl1t17gKsaPO1","recnXsevUrHHctJvc","Eventos","https://developers.veetal.app/#tag/feed-api/get/feed/event/{location_id}",[206,208,207,209,175,176,177],"/dataset/events","Events",[411],"Event data is critical for hotels, influencing demand for accommodation and facilitating rate and promotion planning.\n",[28,91,124],[189,187,188,415,191],"Los datos sobre eventos son fundamentales para los hoteles, influyendo en la demanda de alojamiento y facilitando la planificación de tarifas y promociones.\n",{"id":115,"fields":485},{"Url_es":486,"Name":487,"Name_Seo_en":488,"Link":167,"Recipes":489,"Title_es":491,"Customer Types":492,"Url_en":493,"Title_en":494,"Datasources":495,"Description_en":496,"Types":497,"Name_Seo_es":498,"Description_es":499},"/dataset/detalle-hotel","hotel_detail","hotel-detail",[490],"recWh92iY6N0JXisy","Detalle de hotel",[209,207,175,176,177],"/dataset/hotel-detail","Hotel details",[181,182,183],"Access comprehensive data on each hotel's services, location and unique features to help you stand out in the market.\n",[38],"detalle-hotel","Accede a datos completos sobre servicios, ubicación y características únicas de cada hotel para destacarte en el mercado.\n",{"id":145,"fields":501},{"Url_es":502,"Name":503,"Name_Seo_en":504,"Link":167,"Title_es":505,"Customer Types":506,"Url_en":507,"Title_en":508,"Datasources":509,"Description_en":510,"Types":511,"Applications":512,"Name_Seo_es":513,"Description_es":514},"/dataset/inventario-pms","pms_inventory","pms-inventory","Inventario de PMS",[206,207,174,208],"/dataset/pms-inventory","PMS inventory",[268],"PMS inventory data is vital to managing hotel room and resource availability.\n",[139],[189,187,190],"inventario-pms","Los datos de inventario del PMS son vitales para gestionar la disponibilidad de habitaciones y recursos del hotel.\n",{"id":117,"fields":516},{"Url_es":517,"Name":518,"Name_Seo_en":519,"Link":167,"Title_es":520,"Customer Types":521,"Url_en":522,"Title_en":523,"Datasources":524,"Description_en":525,"Types":526,"Name_Seo_es":527,"Description_es":528},"/dataset/fotos-hotel","hotel_photos","hotel-photos","Fotos de hotel",[354,206,175,176,177],"/dataset/hotel-photos","Hotel photos",[181,182,183],"High-quality images are key to attracting guests and improving booking conversions at your hotel.\n",[38],"fotos-hotel","Imágenes de alta calidad son clave para atraer huéspedes y mejorar la conversión de reservas en tu hotel.\n",{"id":119,"fields":530},{"Url_es":531,"Name":532,"Name_Seo_en":533,"Link":167,"Recipes":534,"Title_es":536,"URL Documentation":537,"Customer Types":538,"Url_en":539,"Title_en":540,"Datasources":541,"Description_en":542,"Types":543,"Applications":544,"Name_Seo_es":545,"Description_es":546},"/dataset/disparidad-hotelera","disparities","hotel-disparities",[535],"reccDu65UupvZ6BRk","Disparidades","https://developers.veetal.app/#tag/real-time-api/get/real-time/accommodation/{accommodation_slug}/parity/{checkin_date}/{checkout_date}/{adults}",[354,173],"/dataset/hotel-disparities","Disparities",[411],"Access data on rate and occupancy disparities to adjust prices and improve competitiveness in the hotel market.\n",[38],[189,294,187,188,295,296,191],"disparidad-hotelera","Accede a datos sobre disparidades en tarifas y ocupación para ajustar precios y mejorar la competitividad en el mercado hotelero.\n",{"id":147,"fields":548},{"Url_es":549,"Name":550,"Name_Seo_en":551,"Link":167,"Title_es":552,"Customer Types":553,"Url_en":554,"Title_en":555,"Datasources":556,"Description_en":557,"Types":558,"Applications":559,"Name_Seo_es":560,"Description_es":561},"/dataset/panel-pms","pms_board","pms-board","Tablero de PMS",[206,207,174,208],"/dataset/pms-board","PMS dashboard",[268],"The PMS dashboard provides an overview of hotel operations, facilitating informed decision making.\n",[139],[187,190],"panel-pms","El tablero del PMS proporciona una visión general de las operaciones del hotel, facilitando la toma de decisiones informadas.\n",[563,569,574,582,588,594,601,607,614,621],{"id":230,"fields":564},{"Datasets":565,"Url_en":566,"Url_es":567,"Name_Seo_es":568,"Name_Seo_en":568,"Name":568},[75,76],"/datasource/kayak","/fuente-datos/kayak","kayak",{"id":268,"fields":570},{"Datasets":571,"Url_en":572,"Url_es":573,"Name_Seo_es":141,"Name_Seo_en":141,"Name":141},[143,144,145,146,147,148],"/datasource/pms","/fuente-datos/pms",{"id":377,"fields":575},{"Datasets":576,"Url_en":577,"Url_es":578,"Name_Seo_es":579,"Name_Seo_en":580,"Name":581},[157,156,158],"/datasource/trip-advisor","/fuente-datos/tripadvisor","tripadvisor","trip-advisor","trip_advisor",{"id":231,"fields":583},{"Datasets":584,"Url_en":585,"Url_es":586,"Name_Seo_es":587,"Name_Seo_en":587,"Name":587},[75,76],"/datasource/skyscanner","/fuente-datos/skyscanner","skyscanner",{"id":182,"fields":589},{"Datasets":590,"Url_en":591,"Url_es":592,"Name_Seo_es":593,"Name_Seo_en":593,"Name":593},[113,114,115,116,117,118,95,156,158,157],"/datasource/expedia","/fuente-datos/expedia","expedia",{"id":411,"fields":595},{"Datasets":596,"Url_en":597,"Url_es":598,"Name_Seo_es":599,"Name_Seo_en":599,"Name":600},[85,86,119],"/datasource/google-events","/fuente-datos/google-events","google-events","google_event",{"id":181,"fields":602},{"Datasets":603,"Url_en":604,"Url_es":605,"Name_Seo_es":606,"Name_Seo_en":606,"Name":606},[113,114,115,116,117,118,95,156,158,157,96],"/datasource/booking","/fuente-datos/booking","booking",{"id":232,"fields":608},{"Datasets":609,"Url_en":610,"Url_es":611,"Name_Seo_es":612,"Name_Seo_en":612,"Name":613},[75,76],"/datasource/google-flights","/fuente-datos/google-flights","google-flights","google_flights",{"id":183,"fields":615},{"Datasets":616,"Url_en":617,"Url_es":618,"Name_Seo_es":619,"Name_Seo_en":619,"Name":620},[113,114,115,116,117,118,95,156,158,157],"/datasource/google-hotels","/fuente-datos/google-hotels","google-hotels","google_hotels",{"id":622,"fields":623},"recvRVj9lfXIXWJXJ",{"Url_en":624,"Url_es":625,"Name_Seo_es":626,"Name_Seo_en":626,"Name":626},"/datasource/airbnb","/fuente-datos/airbnb","airbnb",[628,637,646,655,663,670,679,685,694,703],{"id":207,"fields":629},{"Url_en":630,"Name_Seo_es":631,"Applications":632,"Name_Seo_en":633,"Url_es":634,"Datasets":635,"Name":636},"/customer-type/hotel-chains","cadenas-hoteleras",[188,295,294,187,217,216,415,296,381,382,190,191],"hotel-chains","/tipo-cliente/cadenas-hoteleras",[113,115,76,156,158,85,86,143,144,145,146,147,148,96],"hotel_chains",{"id":174,"fields":638},{"Url_en":639,"Name_Seo_es":640,"Applications":641,"Name_Seo_en":642,"Url_es":643,"Datasets":644,"Name":645},"/customer-type/bi-developers","desarrolladores-bi",[189,188,295,294,217,216,236,415,382,190,191],"bi-developers","/tipo-cliente/desarrolladores-bi",[114,116,75,156,158,157,143,144,145,146,147,148],"bi_developers",{"id":175,"fields":647},{"Url_en":648,"Name_Seo_es":649,"Applications":650,"Name_Seo_en":651,"Url_es":652,"Datasets":653,"Name":654},"/customer-type/travel-agencies","agencias-viajes",[188,294,295,217,216,236,415],"travel-agencies","/tipo-cliente/agencias-viajes",[113,114,115,117,118,95,75,76,156,158,85,86],"travel_agencies",{"id":177,"fields":656},{"Url_en":657,"Name_Seo_es":658,"Applications":659,"Name_Seo_en":658,"Url_es":660,"Datasets":661,"Name":662},"/customer-type/travel-startups","travel-startups",[188,189,294,217,216,236,415,382],"/tipo-cliente/travel-startups",[113,114,115,117,118,95,75,76,156,158,85,86],"travel_startups",{"id":176,"fields":664},{"Url_en":665,"Name_Seo_es":666,"Applications":667,"Name_Seo_en":666,"Url_es":668,"Datasets":669,"Name":666},"/customer-type/otas","otas",[189,188,217,216,236,415,294,382,191],"/tipo-cliente/otas",[113,114,115,117,118,95,75,76,156,158,85,86],{"id":173,"fields":671},{"Url_en":672,"Name_Seo_es":673,"Applications":674,"Name_Seo_en":675,"Url_es":676,"Datasets":677,"Name":678},"/customer-type/booking-engines","motores-reserva",[295,294,188,296,381,382,191],"booking-engines","/tipo-cliente/motores-reserva",[114,118,119,156,158,96],"booking_engines",{"id":354,"fields":680},{"Url_en":681,"Name_Seo_es":141,"Applications":682,"Name_Seo_en":141,"Url_es":683,"Datasets":684,"Name":141},"/customer-type/pms",[188,294,217,190,191],"/tipo-cliente/pms",[117,95,119,156,158],{"id":209,"fields":686},{"Url_en":687,"Name_Seo_es":688,"Applications":689,"Name_Seo_en":690,"Url_es":691,"Datasets":692,"Name":693},"/customer-type/hotel-marketing-agency","agencia-marketing-hotelero",[216,217,415,296,381,382],"hotel-marketing-agency","/tipo-cliente/agencia-marketing-hotelero",[115,116,156,158,95,157,85,86,96],"hotel_marketing_agency",{"id":208,"fields":695},{"Url_en":696,"Name_Seo_es":697,"Applications":698,"Name_Seo_en":699,"Url_es":700,"Datasets":701,"Name":702},"/customer-type/hotel-consultancy","consultoras-hoteleras",[295,294,217,415,216,188,382,190,191],"hotel-consultancy","/tipo-cliente/consultoras-hoteleras",[113,95,75,156,158,157,85,86,143,144,145,146,147,148,96],"hotel_consultancy",{"id":206,"fields":704},{"Url_en":705,"Name_Seo_es":706,"Applications":707,"Name_Seo_en":708,"Url_es":709,"Datasets":710,"Name":711},"/customer-type/revenue-agencies","agencias-revenue",[188,295,294,187,217,216,382,190,191],"revenue-agencies","/tipo-cliente/agencias-revenue",[117,118,76,156,158,85,86,143,144,145,146,147,148,96],"revenue_agencies",[713,720,727,733,739,744,750,756,761,767,773,778,783,788],{"id":296,"fields":714},{"Link_Dataset":715,"Customer Types":716,"Datasets":717,"Product":718,"Name":719},"https://www.veetal.app/widgets-oem",[207,173,209],[113,119],"widgets","parity_widget",{"id":295,"fields":721},{"Link_Dataset":722,"Customer Types":723,"Datasets":724,"Product":725,"Name":726},"https://connect-api.veetal.app/dataset/hotel-disparities",[206,207,208,173,174,175],[119,113],"connect-api","disparity_alert",{"id":190,"fields":728},{"Link_Dataset":729,"Customer Types":730,"Datasets":731,"Product":725,"Name":732},"https://connect-api.veetal.app/dataset/pms-reservations",[207,206,354,208,174],[144,145,148,147,114,95],"booking_analytics",{"id":382,"fields":734},{"Link_Dataset":735,"Customer Types":736,"Datasets":737,"Product":725,"Name":738},"https://connect-api.veetal.app/dataset/semantic-analysis",[207,206,208,209,174,176,177,173],[157,156,158],"sentiment_analysis",{"id":381,"fields":740},{"Link_Dataset":715,"Customer Types":741,"Datasets":742,"Product":718,"Name":743},[207,173,209],[156,158],"reputation_widget",{"id":187,"fields":745},{"Link_Dataset":746,"Customer Types":747,"Datasets":748,"Product":725,"Name":749},"https://connect-api.veetal.app/dataset/hotel-rates",[206,207],[113,116,118,114,95,119,144,76,85,156,148,147,146,145,143],"revenue_optimization",{"id":216,"fields":751},{"Link_Dataset":752,"Customer Types":753,"Datasets":754,"Product":725,"Name":755},"https://connect-api.veetal.app/dataset/market-demand",[207,208,174,209,175,176,177,206],[76,95,96],"demand_forecasting",{"id":191,"fields":757},{"Link_Dataset":746,"Customer Types":758,"Datasets":759,"Product":725,"Name":760},[206,207,208,354,173,174,176],[113,114,118,116,95,85,76,119],"dynamic_pricing",{"id":415,"fields":762},{"Link_Dataset":763,"Customer Types":764,"Datasets":765,"Product":725,"Name":766},"https://connect-api.veetal.app/dataset/events",[207,208,174,209,175,176,177],[86,85],"event_demand_analytics",{"id":236,"fields":768},{"Link_Dataset":769,"Customer Types":770,"Datasets":771,"Product":725,"Name":772},"https://connect-api.veetal.app/dataset/flight-demand",[174,175,176,177],[95,75,76],"flight_analytics",{"id":189,"fields":774},{"Link_Dataset":746,"Customer Types":775,"Datasets":776,"Product":725,"Name":777},[174,176,177],[95,119,113,116,145,76,158,85,114,156,157],"ai_training_data",{"id":188,"fields":779},{"Link_Dataset":746,"Customer Types":780,"Datasets":781,"Product":725,"Name":782},[206,207,208,173,354,174,175,176,177],[113,116,118,114,95,119,85],"rate_shopping",{"id":294,"fields":784},{"Link_Dataset":722,"Customer Types":785,"Datasets":786,"Product":725,"Name":787},[206,207,208,173,354,174,175,176,177],[113,119],"rate_parity",{"id":217,"fields":789},{"Link_Dataset":752,"Customer Types":790,"Datasets":791,"Product":725,"Name":792},[206,207,208,174,209,175,176,177,354],[95,96],"market_research",[794,816,837,857,877,897,918,938,958,978,997,1017],{"id":795,"fields":796},"recBA7d2ZnKeddwds",{"Header":797,"Body_es":800,"Title_es":801,"Published":802,"Slug_en":803,"Author":804,"Title_en":806,"Summary_en":807,"Summary_es":808,"Slug_es":809,"Date":810,"Body_en":811,"LinkedIn post":812,"Thumbnail":813},[798],{"filename":799},"what-is-a-travel-data-api-header.webp","Si estás desarrollando una aplicación de viajes, una herramienta de revenue management o un dashboard de BI para el sector hotelero, probablemente ya te has topado con el mismo problema: conseguir datos de viaje precisos y en tiempo real es más difícil de lo que debería.\n\nConstruir tu propio pipeline de datos significa meses de trabajo de ingeniería antes de ver un primer resultado útil. Las integraciones directas con OTAs requieren negociaciones largas. Y una vez que tienes los datos fluyendo, el mantenimiento no para — las plataformas cambian, los pipelines se rompen, y tu equipo acaba dedicando más tiempo a mantener la infraestructura que a construir tu producto real.\n\nUna API de datos de viaje resuelve todo eso. Aquí te explicamos exactamente qué es, cómo funciona y qué debes buscar al elegir una.\n\n## ¿Qué es una API de datos de viaje?\n\nUna API de datos de viaje (Application Programming Interface) es un servicio que proporciona a desarrolladores y empresas acceso programático y estructurado a datos relacionados con el sector travel — incluyendo tarifas hoteleras, disponibilidad de habitaciones, precios de vuelos, feeds de OTAs, reseñas y señales de demanda de mercado.\n\nEn lugar de construir y mantener tu propia infraestructura de recopilación de datos, te conectas una sola vez a la API y recibes datos limpios y normalizados de todas las fuentes a través de un único endpoint.\n\nLas APIs de datos de viaje las usan:\n- **Motores de reserva** que necesitan disponibilidad y tarifas hoteleras en vivo\n- **Sistemas de revenue management** que necesitan precios de competidores y demanda de mercado\n- **OTAs** que necesitan feeds agregados de hoteles y vuelos\n- **Desarrolladores de BI** que construyen herramientas de reporting para clientes hoteleros\n- **Startups de viaje** que desarrollan productos de viaje para consumidor o B2B\n\n## ¿Cómo funciona una API de datos de viaje?\n\nUna API de datos de viaje se sitúa entre las fuentes de datos brutos (plataformas OTA, sistemas GDS, plataformas PMS, metabuscadores) y tu aplicación. Así es el flujo:\n\n**1. Recopilación de datos**\nEl proveedor de la API recopila datos continuamente de múltiples fuentes de viaje — Booking.com, Expedia, TripAdvisor, Google Hotels, Kayak y otros — a través de una infraestructura propietaria optimizada para escala y fiabilidad.\n\n**2. Normalización de datos**\nLos datos brutos de diferentes fuentes usan distintos formatos, esquemas y frecuencias de actualización. El proveedor de la API limpia y normaliza todo en una estructura consistente, de modo que recibes el mismo esquema JSON independientemente de la fuente.\n\n**3. Entrega vía API**\nEnvías una petición al endpoint de la API con parámetros (ID de hotel, rango de fechas, mercado, etc.) y recibes datos estructurados en tiempo real. Sin trabajo manual. Sin pipelines de datos que mantener.\n\n**4. Infraestructura personalizada**\nLas APIs de datos de viaje de nivel enterprise — como Veetal Connect — proporcionan infraestructura dedicada por cliente, lo que significa que tu pipeline de datos no se comparte con otros clientes y puede ajustarse a tus requisitos específicos de volumen y latencia.\n\n## ¿Qué tipos de datos proporciona una API de datos de viaje?\n\nLas APIs de datos de viaje varían en alcance. Algunas se centran solo en vuelos o solo en hoteles. Otras proporcionan un conjunto más amplio de datasets. Estos son los principales tipos de datos:\n\n### Datos hoteleros\n- **[Datos de tarifas hoteleras](/dataset/hotel-rates)** — precios de habitaciones en tiempo real desde OTAs por fecha, tipo de habitación y régimen de comidas\n- **[Datos de disponibilidad hotelera](/dataset/availability)** — qué habitaciones están abiertas para reservar y para qué fechas\n- **[Datos de precios de competidores](/dataset/hotel-competitors)** — lo que tu set competitivo está cobrando en cada canal\n- **Fotos de hoteles** — imágenes de la propiedad y habitaciones desde listados de OTAs\n- **Detalles de hoteles** — metadatos de la propiedad, servicios, ubicación, tipos de habitación\n\n### Datos de reputación\n- **[Datos de reputación hotelera](/data-type/reputation)** — reseñas estructuradas de huéspedes desde Booking.com, TripAdvisor y otros\n- **Valoraciones** — puntuaciones numéricas por categoría (limpieza, ubicación, valor, etc.)\n- **Análisis semántico** — categorización con IA de temas y sentimiento de las reseñas\n\n### Datos de vuelos\n- **[API de datos de vuelos](/data-type/flights)** — datos de tarifas en tiempo real y señales de demanda de pasajeros desde Kayak, Google Flights y otros\n- **Demanda de vuelos** — señales de demanda de pasajeros por ruta y fecha\n\n### Datos de mercado\n- **Demanda de mercado** — indicadores de demanda agregada para un destino o mercado\n- **Datos de eventos** — eventos locales que generan picos de demanda y afectan a los precios\n\n### Datos de PMS\n- **Reservas** — datos de reservas desde sistemas de gestión de propiedades\n- **Inventario** — disponibilidad y asignación por tipo de habitación\n- **Planes tarifarios** — estructuras de precios configuradas en el PMS\n\n## ¿Por qué usar una API de datos de viaje en lugar de construir tu propio pipeline de datos?\n\nMuchos equipos intentan recopilar datos de viaje por su cuenta. La puesta en marcha inicial parece manejable — pero los costes reales aparecen rápidamente.\n\n**Complejidad de ingeniería.** Construir una infraestructura fiable de recopilación de datos de viaje requiere conocimiento especializado: gestionar sistemas de gestión de tráfico, controlar volúmenes de peticiones, lidiar con cambios estructurales constantes en docenas de plataformas OTA y normalizar formatos de datos muy inconsistentes.\n\n**Carga de mantenimiento.** Las plataformas de viaje se actualizan constantemente. Un pipeline de datos que funciona hoy necesita monitorización y correcciones continuas. Mantenerlo significa dedicar recursos de ingeniería que podrían emplearse en construir tu producto real.\n\n**Calidad de datos.** Los datos brutos recogidos son inconsistentes entre fuentes — diferentes esquemas, monedas, formatos de fecha y campos que faltan. Limpiarlos y normalizarlos para uso en producción requiere un trabajo adicional significativo.\n\n**Escala.** Recopilar datos a gran volumen es técnicamente exigente. La infraestructura necesaria para una recopilación de datos de alta frecuencia y alto volumen no es trivial de construir y es cara de operar.\n\nUna API de datos de viaje como Veetal Connect elimina toda esta sobrecarga. Obtienes datos limpios, normalizados y listos para producción — a cualquier escala — sin construir ni mantener la infraestructura subyacente.\n\n## Qué buscar al elegir una API de datos de viaje\n\nNo todas las APIs de datos de viaje son iguales. Esto es lo que importa:\n\n**Cobertura de datos**\n¿Qué OTAs y proveedores cubre la API? ¿Incluye las fuentes que importan para tu mercado — Booking.com, Expedia, Google Hotels, TripAdvisor, Kayak?\n\n**Frescura de datos**\n¿Los datos son en tiempo real o por lotes? Para aplicaciones de revenue management y pricing, los datos en tiempo real son esenciales. Para analítica, lotes diarios u horarios pueden ser suficientes.\n\n**Amplitud de datasets**\n¿La API cubre solo hoteles y vuelos, o también incluye datos de reputación, eventos, demanda de mercado e integración con PMS? Una cobertura más amplia significa menos integraciones que mantener.\n\n**Modelo de infraestructura**\n¿El proveedor de la API usa infraestructura compartida (tus peticiones pasan por el mismo pipeline que las de todos los demás) o infraestructura dedicada (tu propio pipeline de datos, configurado para tus necesidades)? La infraestructura dedicada es más fiable y personalizable.\n\n**Precio y punto de entrada**\n¿Puedes empezar a probar sin un largo proceso de compra? Las APIs con niveles de prueba gratuita te permiten validar la calidad de los datos y la integración antes de comprometerte.\n\n**Cumplimiento europeo**\nSi operas en Europa o manejas datos de clientes de la UE, asegúrate de que el proveedor de la API cumple con el RGPD y está basado en la UE.\n\n## Cómo empezar con una API de datos de viaje\n\nEmpezar con Veetal Connect API lleva menos de 10 minutos:\n\n1. **Regístrate** en connect-api.veetal.app/funnel — sin tarjeta de crédito\n2. **Obtén tu API key** y accede a la documentación para desarrolladores en developers.veetal.app\n3. **Haz tu primera llamada** con 100 créditos gratuitos de API incluidos en la prueba gratuita\n4. **Selecciona tus datasets** — elige entre tarifas hoteleras, disponibilidad, competidores, reputación, vuelos, eventos, PMS y más\n5. **Pasa a producción** con tu infraestructura personalizada configurada para tu volumen de producción\n\n## FAQ\n\n**¿Es una API de datos de viaje lo mismo que un GDS?**\nNo. Un GDS (Global Distribution System) como Amadeus o Sabre es principalmente un sistema de reservas y emisión de billetes utilizado por agencias de viaje y aerolíneas. Una API de datos de viaje como Veetal Connect se centra en entregar datos estructurados para analítica, revenue management y desarrollo de aplicaciones — no en reservas.\n\n**¿Puedo usar datos de una API de viaje para entrenar modelos de machine learning?**\nSí. Los datos de viaje estructurados e históricos son una fuente de entrenamiento excelente para modelos de ML — incluyendo previsión de demanda, pricing dinámico y modelos de comportamiento del cliente. Veetal proporciona acceso a datasets históricos para casos de uso de ML.\n\n**¿Cuánto cuesta una API de datos de viaje?**\nLos precios varían según el proveedor y el volumen. Veetal Connect ofrece una prueba gratuita con 100 créditos de API y precios personalizados según la selección de datasets y el volumen de llamadas. Contáctanos para obtener un presupuesto.\n\n**¿Necesito construir mi propia infraestructura de recopilación de datos?**\nNo. Con Veetal Connect, toda la recopilación y normalización de datos es gestionada por la infraestructura de Veetal. Te conectas a un único endpoint de API y recibes datos limpios y listos para producción — sin necesidad de ingeniería de pipelines por tu parte.\n\n*¿Listo para empezar?* [Empieza tu prueba gratuita](/funnel) con 100 créditos gratuitos de API — sin tarjeta de crédito.","¿Qué es una API de datos de viaje? Guía completa (2026)",true,"what-is-a-travel-data-api",[805],"recQWbBd0cLGqoInl","What Is a Travel Data API? Complete Guide (2026)","A travel data API gives you structured, real-time access to hotel rates, flight data, OTA feeds, and more — without building your own data pipeline. Here's how it works, what it includes, and how to choose the right one.","Una API de datos de viaje te da acceso estructurado en tiempo real a tarifas hoteleras, datos de vuelos, feeds de OTAs y más — sin tener que construir tu propio pipeline de datos. Aquí te explicamos cómo funciona y cómo elegir la mejor.","que-es-una-api-de-datos-de-viaje","2026-03-08","If you're building a travel application, a revenue management tool, or a BI dashboard for the hospitality sector, you've probably run into the same problem: getting accurate, real-time travel data is harder than it should be.\n\nBuilding your own data pipeline means months of engineering work before you see a single useful result. Direct OTA integrations require lengthy negotiations. And once you have data flowing, the maintenance never stops — platforms change, pipelines break, and your team ends up spending more time keeping the infrastructure alive than building your actual product.\n\nA travel data API solves all of that. Here's exactly what it is, how it works, and what to look for when choosing one.\n\n## What is a travel data API?\n\nA travel data API (Application Programming Interface) is a service that gives developers and businesses structured, programmatic access to travel-related data — including hotel rates, room availability, flight prices, OTA feeds, reviews, and market demand signals.\n\nInstead of building and maintaining your own data collection infrastructure, you connect once to the API and receive clean, normalized data across all sources through a single endpoint.\n\nTravel data APIs are used by:\n- **Booking engines** that need live hotel availability and rates\n- **Revenue management systems** that need competitor pricing and market demand\n- **OTAs** that need aggregated hotel and flight feeds\n- **BI developers** who build reporting tools for hospitality clients\n- **Travel startups** building consumer or B2B travel products\n\n## How does a travel data API work?\n\nA travel data API sits between the raw data sources (OTA platforms, GDS systems, PMS platforms, meta-search engines) and your application. Here's the flow:\n\n**1. Data collection**\nThe API provider collects data continuously from multiple travel sources — Booking.com, Expedia, TripAdvisor, Google Hotels, Kayak, and others — through a proprietary infrastructure optimized for scale and reliability.\n\n**2. Data normalization**\nRaw data from different sources uses different formats, schemas, and update frequencies. The API provider cleans and normalizes this into a consistent structure, so you receive the same JSON schema regardless of the source.\n\n**3. API delivery**\nYou send a request to the API endpoint with parameters (hotel ID, date range, market, etc.) and receive structured data back in real time. No manual work. No data pipelines to maintain.\n\n**4. Custom infrastructure**\nEnterprise-grade travel APIs — like Veetal Connect — provide dedicated infrastructure per client, meaning your data pipeline is not shared with other customers and can be tuned for your specific volume and latency requirements.\n\n## What types of data does a travel data API provide?\n\nTravel data APIs vary in scope. Some focus only on flights or only on hotels. Others provide a broader set of datasets. Here are the main data types:\n\n### Hotel data\n- **[Hotel rate data](/dataset/hotel-rates)** — real-time room prices from OTAs by date, room type, and meal plan\n- **[Hotel availability data](/dataset/availability)** — which rooms are open for booking, for which dates\n- **[Competitor pricing data](/dataset/hotel-competitors)** — what your competitive set is charging on each channel\n- **Hotel photos** — property and room images from OTA listings\n- **Hotel details** — property metadata, amenities, location, room types\n\n### Reputation data\n- **[Hotel reputation data](/data-type/reputation)** — structured guest reviews from Booking.com, TripAdvisor, and others\n- **Ratings** — numerical scores by category (cleanliness, location, value, etc.)\n- **Semantic analysis** — AI-powered categorization of review themes and sentiment\n\n### Flight data\n- **[Flight data API](/data-type/flights)** — real-time fare data and passenger demand signals from Kayak, Google Flights, and others\n- **Flight demand** — passenger demand signals by route and date\n\n### Market data\n- **Market demand** — aggregate demand indicators for a destination or market\n- **Events data** — local events that drive demand spikes and affect pricing\n\n### PMS data\n- **Reservations** — booking data from property management systems\n- **Inventory** — room type availability and allocation\n- **Rate plans** — pricing structures configured in the PMS\n\n## Why use a travel data API instead of building your own data pipeline?\n\nMany teams try to collect travel data themselves. The initial setup looks manageable — but the real costs emerge quickly.\n\n**Engineering complexity.** Building reliable data collection infrastructure for travel data requires specialized knowledge: handling traffic management systems, managing request volumes, dealing with constant structural changes across dozens of OTA platforms, and normalizing wildly inconsistent data formats.\n\n**Maintenance burden.** Travel platforms update constantly. A data pipeline that works today needs continuous monitoring and fixes. Maintaining it means dedicating engineering resources that could be spent building your actual product.\n\n**Data quality.** Raw collected data is inconsistent across sources — different schemas, currencies, date formats, and missing fields. Cleaning and normalizing it for production use requires significant additional work.\n\n**Scale.** Collecting data at volume is technically demanding. The infrastructure required for high-frequency, high-volume data collection is non-trivial to build and expensive to operate.\n\nA travel data API like Veetal Connect eliminates all of this overhead. You get clean, normalized, production-ready data — at any scale — without building or maintaining the underlying infrastructure.\n\n## What to look for when choosing a travel data API\n\nNot all travel data APIs are the same. Here's what matters:\n\n**Data coverage**\nWhich OTAs and providers does the API cover? Does it include the sources that matter for your market — Booking.com, Expedia, Google Hotels, TripAdvisor, Kayak?\n\n**Data freshness**\nIs the data real-time or batched? For revenue management and pricing applications, real-time data is essential. For analytics, daily or hourly batches may be sufficient.\n\n**Dataset breadth**\nDoes the API cover only hotels and flights, or does it also include reputation data, events, market demand, and PMS integration? Broader coverage means fewer integrations to maintain.\n\n**Infrastructure model**\nDoes the API provider use shared infrastructure (your requests go through the same pipeline as everyone else) or dedicated infrastructure (your own data pipeline, configured for your needs)? Dedicated infrastructure is more reliable and customizable.\n\n**Pricing and entry point**\nCan you start testing without a long procurement process? APIs with free trial tiers let you validate the data quality and integration before committing.\n\n**European compliance**\nIf you operate in Europe or handle EU customer data, ensure the API provider is GDPR-compliant and based in the EU.\n\n## How to get started with a travel data API\n\nGetting started with Veetal Connect API takes less than 10 minutes:\n\n1. **Sign up** at connect-api.veetal.app/funnel — no credit card required\n2. **Get your API key** and access the developer documentation at developers.veetal.app\n3. **Make your first call** with 100 free API credits included in the free trial\n4. **Select your datasets** — choose from hotel rates, availability, competitors, reputation, flights, events, PMS, and more\n5. **Go live** with your custom infrastructure configured for your production volume\n\n## FAQ\n\n**Is a travel data API the same as a GDS?**\nNo. A GDS (Global Distribution System) like Amadeus or Sabre is primarily a booking and ticketing system used by travel agents and airlines. A travel data API like Veetal Connect focuses on delivering structured data for analytics, revenue management, and application development — not bookings.\n\n**Can I use travel data API data to train machine learning models?**\nYes. Structured, historical travel data is an excellent training source for ML models — including demand forecasting, dynamic pricing, and customer behavior models. Veetal provides historical dataset access for ML use cases.\n\n**How much does a travel data API cost?**\nPricing varies by provider and volume. Veetal Connect offers a free trial with 100 API credits and custom pricing based on dataset selection and call volume. Contact us for a quote.\n\n**Do I need to build my own data collection infrastructure?**\nNo. With Veetal Connect, all data collection and normalization is handled by Veetal's infrastructure. You connect to a single API endpoint and receive clean, production-ready data — no pipeline engineering required on your side.\n\n*Ready to start?* [Start your free trial](/funnel) with 100 free API credits — no credit card required.","Most travel tech companies are drowning in data infrastructure.\n\nThey're building custom scrapers, normalizing feeds from 10+ sources, and still don't have reliable data on Monday morning.\n\nThe solution isn't more engineering effort.\nIt's a travel data API.\n\nHere's what a travel data API actually gives you:\n→ Real-time hotel rates and availability\n→ Flight schedules, fares, and route data\n→ OTA feeds in a single normalized format\n→ Reputation and review data across platforms\n→ Zero pipeline maintenance on your side\n\nThe complete guide is live — what they include, how they work, and how to choose the right one for your use case.\n\nLink in comments 👇\n\n#TravelTech #TravelData #API #HotelData #FlightData",[814],{"filename":815},"what-is-a-travel-data-api-thumbnail.webp",{"id":817,"fields":818},"recBpgsRXcimouZCE",{"Header":819,"Body_es":822,"Title_es":823,"Published":802,"Slug_en":824,"Author":825,"Title_en":827,"Summary_en":828,"Summary_es":829,"Slug_es":830,"Date":831,"Body_en":832,"LinkedIn post":833,"Thumbnail":834},[820],{"filename":821},"hotel-api-vs-web-scraping-header.webp","## API Hotelera vs Web Scraping: La Diferencia Fundamental\n\nAl construir productos de travel tech, herramientas de revenue management o pipelines de datos hoteleros, te enfrentas a una decisión arquitectónica crítica: ¿usar una API de datos hoteleros o construir un web scraper?\n\nAmbos enfoques pueden extraer precios de hoteles, disponibilidad e inteligencia competitiva — pero difieren enormemente en fiabilidad, legalidad, coste y escalabilidad.\n\n## ¿Qué Es una API de Datos Hoteleros?\n\nUna API de datos hoteleros es una interfaz estructurada que proporciona acceso directo y autorizado a datos hoteleros. Proveedores como Veetal Connect agregan tarifas, disponibilidad e información de competidores de las principales OTAs (Booking.com, Expedia, Google Hotels) y los entregan en formatos limpios y estructurados (JSON/XML) a través de endpoints REST.\n\n**Características clave:**\n- Acceso a datos autorizado y contractual\n- Formatos de datos estructurados y consistentes\n- Feeds en tiempo real o casi tiempo real\n- Disponibilidad respaldada por SLA\n- Soporte técnico dedicado\n\n## ¿Qué Es el Web Scraping para Datos Hoteleros?\n\nEl web scraping consiste en escribir código que navega automáticamente por webs de reservas hoteleras y extrae información de precios y disponibilidad de la estructura HTML de la página.\n\n**Características clave:**\n- Datos no estructurados que requieren parseo extenso\n- Se rompe frecuentemente con rediseños web\n- Alto coste de mantenimiento\n- Complejidades legales\n\n## Comparación Directa: API Hotelera vs Web Scraping\n\n| Factor | API de Datos Hoteleros | Web Scraping |\n|--------|----------------------|--------------|\n| **Fiabilidad de Datos** | Alta — feeds estructurados | Baja — se rompe con cambios web |\n| **Tiempo de Configuración** | Horas o días | Semanas o meses |\n| **Coste de Mantenimiento** | Bajo — gestionado por el proveedor | Alto — actualizaciones constantes |\n| **Estado Legal** | Totalmente autorizado | Requiere gestión de acceso |\n| **Calidad de Datos** | Limpia y normalizada | Requiere limpieza y parseo |\n| **Escalabilidad** | Diseñada para escalar | Intensiva en infraestructura |\n| **Datos en Tiempo Real** | Sí | Retrasos por frecuencia de crawl |\n| **Coste** | Basado en suscripción | Ingeniería + infraestructura |\n| **Riesgo de Bloqueo de IP** | Ninguno | Alto |\n| **Soporte** | Soporte dedicado | Ninguno |\n\n## Cuándo el Web Scraping Puede Tener Sentido\n\nEn casos limitados, el web scraping puede ser una opción viable:\n\n1. **Prototipo o MVP**: Si estás validando un concepto antes de invertir en acceso a API\n2. **Investigación interna**: Para análisis competitivo puntual donde la velocidad importa más que la fiabilidad\n3. **No existe API**: Para fuentes de datos nicho que no ofrecen acceso API\n\nSin embargo, para cualquier sistema productivo o uso comercial continuo, los riesgos superan los beneficios.\n\n## Los Costes Ocultos del Web Scraping Hotelero\n\nMuchos equipos subestiman el coste real del scraping hotelero:\n\n**Tiempo de ingeniería**: Construir scrapers para múltiples plataformas de viajes requiere una inversión significativa en ingeniería. Cada sitio tiene estructuras HTML diferentes, requisitos de renderizado JavaScript y sistemas de gestión de tráfico.\n\n**Mantenimiento**: Las webs de reservas hoteleras se rediseñan con frecuencia. Un simple cambio de layout puede romper todo tu pipeline de datos, requiriendo correcciones de emergencia.\n\n**Infraestructura**: Ejecutar scrapers a escala requiere infraestructura técnica especializada, navegadores headless e infraestructura distribuida.\n\n**Anti-scraping**: Las principales webs de reservas implementan activamente medidas de gestión de tráfico para detectar y limitar el acceso automatizado.\n\n## Por Qué las APIs Hoteleras Ganan en Casos de Uso en Producción\n\nPara herramientas de revenue management, dashboards de BI, agregadores de viajes y motores de pricing, las APIs de datos hoteleros ofrecen ventajas claras:\n\n**Fiabilidad**: Veetal Connect y APIs similares ofrecen disponibilidad respaldada por SLA. Tu pipeline de datos no se rompe porque Expedia actualizó su flujo de checkout.\n\n**Velocidad de comercialización**: En lugar de meses construyendo y depurando scrapers, puedes integrar datos hoteleros estructurados en días mediante API REST.\n\n**Completitud de datos**: Las APIs proporcionan datos normalizados de cientos de hoteles y OTAs — algo que los scrapers difícilmente logran de forma consistente.\n\n**Foco**: Tu equipo de ingeniería puede centrarse en construir valor de producto en lugar de mantener scrapers frágiles.\n\n## Casos de Uso Reales donde las APIs Superan al Scraping\n\n**Sistemas de revenue management**: ¿Necesitas tarifas de competidores en tiempo real de más de 50 hoteles? Una API lo entrega en milisegundos. El scraping no puede igualar esto a escala.\n\n**OTAs de viajes**: Construir un sitio de comparación de hoteles requiere datos limpios y fiables de cientos de fuentes. Los scrapers fallan bajo esta carga.\n\n**BI y analítica**: Las herramientas de business intelligence necesitan datos históricos consistentes. La calidad de los datos de scrapers se degrada con el tiempo, haciendo que el análisis histórico sea poco fiable.\n\n**Motores de pricing dinámico**: El pricing automatizado requiere datos precisos y en tiempo real. Los scrapers introducen retrasos y errores que hacen poco fiables las decisiones de pricing dinámico.\n\n## Conclusión: La API Es la Elección Profesional\n\nPara cualquiera que construya travel tech de nivel productivo — ya sea una plataforma de revenue management, una herramienta de comparación de hoteles o un dashboard de inteligencia de precios — las APIs de datos hoteleros son el estándar profesional.\n\nEl web scraping puede funcionar para experimentos rápidos, pero para datos hoteleros escalables, fiables y legalmente conformes, el acceso estructurado vía API es la única opción sostenible.\n\nVeetal Connect proporciona datos de tarifas hoteleras en tiempo real, feeds de disponibilidad e inteligencia de competidores a través de una API REST limpia, ayudando a los equipos de travel tech a construir productos más rápidos y fiables sin los dolores de cabeza del scraping.","API Hotelera vs Web Scraping: ¿Cuál Es Mejor para Datos de Viajes?","hotel-api-vs-web-scraping",[826],"recWgr8aeGOBV24uZ","Hotel API vs Web Scraping: Which Is Better for Travel Data?","Choosing between a hotel data API and web scraping is a critical decision for travel tech builders. This guide compares both approaches across reliability, cost, legality, and scalability — and explains why APIs are the professional standard for production use cases.","Elegir entre una API de datos hoteleros y el web scraping es una decisión crítica para los desarrolladores de travel tech. Esta guía compara ambos enfoques en fiabilidad, coste, legalidad y escalabilidad, y explica por qué las APIs son el estándar profesional para casos de uso en producción.","api-hotelera-vs-web-scraping","2026-02-05","## Hotel API vs Web Scraping: The Core Difference\n\nWhen building travel tech products, revenue management tools, or hotel data pipelines, you face a critical architectural decision: should you use a hotel data API or build a web scraper?\n\nBoth approaches can extract hotel pricing, availability, and competitive intelligence — but they differ dramatically in reliability, legality, cost, and scalability.\n\n## What Is a Hotel Data API?\n\nA hotel data API is a structured interface that provides direct, authorized access to hotel data. Providers like Veetal Connect aggregate hotel rates, availability, and competitor data from travel platforms and deliver it in clean, structured formats (JSON/XML) via REST endpoints.\n\n**Key characteristics:**\n- Authorized, contractual data access\n- Structured, consistent data formats\n- Real-time or near-real-time feeds\n- SLA-backed uptime and reliability\n- Dedicated technical support\n\n## What Is Web Scraping for Hotel Data?\n\nWeb scraping involves writing code to automatically browse hotel booking websites and extract price and availability information from the HTML structure of the page.\n\n**Key characteristics:**\n- Requires building and maintaining custom code\n- Data extraction depends on website layout (HTML/CSS structure)\n- Variable data freshness and completeness\n- No official support or guarantees\n- Requires ongoing maintenance as sites redesign\n\n## Direct Comparison: Hotel API vs Web Scraping\n\n| Factor | Hotel Data API | Web Scraping |\n|--------|-----------------|---------------|\n| **Access** | Authorized, contractual | Automatic extraction from public sites |\n| **Data format** | Structured (JSON, XML) | Semi-structured (needs parsing) |\n| **Reliability** | 99.9%+ SLA | Breaks with site updates |\n| **Latency** | Real-time or 15-min | Variable, depends on your crawler |\n| **Maintenance** | Zero (handled by provider) | Continuous (selector updates, fixes) |\n| **Legal standing** | Clear and secure | Variable; depends on terms of service |\n| **Ramp-up time** | Hours to days | Weeks to months |\n| **Scalability** | Unlimited | Limited; scales with infrastructure spend |\n| **Rate parity compliance** | Built-in data validation | Manual monitoring required |\n| **Cost per data point** | Fixed, predictable | Variable (engineering + infrastructure) |\n| **Riskof Bloqueo de IP** | Ninguno | High |\n| **Support** | Dedicated | N/A |\n\n## When Web Scraping Might Make Sense\n\nIn limited cases, web scraping can be a viable option:\n\n- **Tiny dataset**: You need data from 2–3 websites for a one-off analysis, and you're not building a production application.\n- **Low-frequency refresh**: Data updates once a month; changes don't hurt you.\n- **Proof of concept**: You're testing a hypothesis before committing to an API integration. (But move to an API for production.)\n\n## The Hidden Costs of Hotel Web Scraping\n\nMany teams underestimate the true cost of hotel scraping:\n\n**Maintenance**: Hotel booking sites redesign frequently. A single layout change can break your entire data pipeline, requiring emergency fixes.\n\n**Development time**: Building a scraper takes days to months. Building resilient error handling, retry logic, and data validation takes even longer.\n\n**Traffic management**: Major hotel booking sites actively implement traffic management systems to control automated access to their platforms.\n\n**Data quality**: Scraped data is messy. You'll spend weeks building parsers, handling edge cases, and cleaning incomplete records. And if the site changes its layout, your parsers break.\n\n**Infrastructure**: To avoid getting blocked, teams often need multiple IPs, proxies, or distributed crawlers — adding cost and complexity.\n\n**Compliance**: Authorized API access means you're not exposed to legal action, IP bans, or service interruptions.\n\n## Real Use Cases Where Hotel APIs Beat Scraping\n\n**Revenue management systems**: Need real-time competitor rates across 50+ hotels? An API delivers this in milliseconds. Scraping can't match this at scale.\n\n**Travel OTAs**: Building a hotel booking comparison site requires clean, reliable data from hundreds of sources. Scrapers fail under this load.\n\n**Risk management**: APIs provide clear legal standing and SLA-backed reliability. Scrapers expose you to downtime, data loss, and legal risk.\n\n## The Bottom Line: API vs. Scraping in 2024-2025\n\nIn 2024-2025, major travel companies have increasingly implemented traffic management systems to control automated access to their platforms. The data is abundant, the need for it is clear, and the technology to serve it reliably exists.\n\nWeb scraping might work for quick experiments, but for scalable, reliable, legally compliant hotel data, structured API access is the only sustainable choice.\n\nVeetal Connect provides real-time hotel rate data, availability feeds, and competitor intelligence via a clean REST API — helping travel tech teams build faster, more reliable products without the scraping headaches.","We've had this conversation with every serious travel tech team.\n\n\"We have scrapers. They mostly work.\"\n\nHere's what \"mostly work\" actually costs you:\n→ 6–12h/month of engineering time fixing broken selectors\n→ IP management and infrastructure complexity\n→ Data gaps whenever a site redesigns\n→ Unclear compliance boundaries you don't want in your terms of service\n→ No SLA. No support. No accountability.\n\nA hotel data API is how production-grade travel tech teams access hotel rates, availability, and competitor data.\n\nWe wrote the head-to-head comparison: reliability, cost, legality, scalability.\n\nLink in comments 👇\n\n#HotelTech #TravelData #API #WebScraping #TravelStartup",[835],{"filename":836},"hotel-api-vs-web-scraping-thumbnail.webp",{"id":838,"fields":839},"recIufkHgjFSF05aO",{"Header":840,"Body_es":843,"Title_es":844,"Published":802,"Slug_en":845,"Author":846,"Title_en":847,"Summary_en":848,"Summary_es":849,"Slug_es":850,"Date":851,"Body_en":852,"LinkedIn post":853,"Thumbnail":854},[841],{"filename":842},"travel-apis-2025-guide-connect-api-header.webp","## **APIs de viajes: qué son, para qué sirven y por qué Connect API es la mejor opción en 2025**\n## **Introducción**\n[Las APIs están transformando la industria del turismo](https://www.switchfly.com/blog/apis-in-the-travel-industry). Desde la predicción de precios de vuelos hasta la reserva automatizada de billetes, las APIs permiten a las empresas conectar con datos en tiempo real, automatizar procesos y crear experiencias de usuario mucho más inteligentes.\n\nEn 2025, no basta con tener una web atractiva o una app funcional. Las empresas líderes del sector turístico saben que el verdadero valor está en los datos —y, sobre todo, en la capacidad de conectarse a ellos de forma ágil, fiable y escalable.\n\nEn este artículo te explicamos qué es una Travel API, cómo se utilizan en la industria y por qué **[Connect API de Veetal](https://connect-api.veetal.app/)** destaca como una de las mejores soluciones para integrar datos de vuelos.\n\n## **¿Qué es una API de viajes?**\nUna API (Application Programming Interface) es una [interfaz que permite que diferentes sistemas o aplicaciones se comuniquen entre sí](https://traveltradeready.net/what-is-api-in-travel-industry/). En el sector turístico, esto significa acceder a información sobre vuelos, hoteles, precios, disponibilidad y más, sin necesidad de consultar manualmente múltiples plataformas.\n\nPor ejemplo, si quieres mostrar a tus usuarios los precios de vuelos en tiempo real, lo ideal es que te conectes directamente a una API de vuelos que te proporcione esos datos, en lugar de depender de procesos manuales o scrapers inestables.\n\n## **Tipos de Travel APIs más comunes**\n[Existen diferentes tipos de API](https://colorwhistle.com/top-travel-apis-developers/) para el sector turístico, las más comunes son:\n- **APIs de vuelos**: información sobre horarios, precios, disponibilidad, predicción de tarifas y más. Veetal Connect API incluye un endpoint relacionado con vuelos, lo que permite acceder a datos de este tipo. \n- **APIs de hoteles**: disponibilidad de habitaciones, tarifas, imágenes, políticas de cancelación, etc. **Connect API** proporciona datos relacionados con la disponibilidad de habitaciones, tarifas, políticas de cancelación, puntuaciones mínimas, tipo de alojamiento, etc. Veetal Connect API se enfoca principalmente en datos de alojamiento, ofreciendo endpoints que devuelven información detallada sobre la disponibilidad de alojamientos según diversos criterios.\n- **APIs de transporte terrestre**: incluyen trenes, autobuses o vehículos compartidos. Veetal Connect API no proporciona actualmente información directa sobre transporte terrestre, aunque sus datos de alojamiento pueden integrarse con plataformas que gestionen otros medios de transporte.\n- **APIs de actividades y tours**: permiten consultar y reservar actividades turísticas. \n- **APIs de reservas**: procesan pagos y confirman reservas.\n\n## **¿Por qué las empresas travel necesitan APIs en 2025?**\nEl comportamiento del consumidor ha cambiado. [Hoy los usuarios esperan respuestas rápidas, comparativas instantáneas y precios actualizados en tiempo real](https://www.travelport.com/travel-trends-2025-report).\n\nUna API permite:\n- Automatizar tareas y ahorrar tiempo operativo.\n- Integrar múltiples fuentes de datos de forma centralizada.\n- Crear experiencias personalizadas con datos dinámicos.\n- Ofrecer mejores precios y servicios más rápidos que la competencia.\nTodo esto, sin APIs, sería simplemente inviable.\n\n## **Problemas frecuentes con muchas APIs travel del mercado**\nSon diversos [los problemas comunes](https://acropolium.com/blog/travel-api-integration-top-apis-and-reasons-to-implement-them/) que tienen algunas APIs, siendo los más destacados:\n- Integración técnica compleja y mal documentada.\n- Largos tiempos de respuesta.\n- Soporte deficiente o mal automatizado.\n- Costes ocultos o tarifas mal estructuradas.\n- Inestabilidad del servicio.\n\n## **Connect API: una alternativa moderna y eficiente**\n**[Connect API](https://connect-api.veetal.app/?utm_source=chatgpt.com)**[, desarrollada por ](https://connect-api.veetal.app/?utm_source=chatgpt.com)**[Veetal](https://connect-api.veetal.app/)**, nace para ofrecer una alternativa moderna a todos esos problemas.\n\nEs una API centrada en datos de vuelos que destaca por:\n## **1. Soporte dedicado desde el primer día**\nCada cliente de Veetal cuenta con un agente exclusivo que entiende su modelo de negocio, lo guía durante la integración y le ofrece soporte real. Nada de bots ni tickets sin respuesta.\n\n## **2. Rápida y ligera**\nEl rendimiento es uno de los pilares de Connect API. Obtén respuestas en milisegundos y con una estructura limpia, lista para usar en tus sistemas sin necesidad de grandes transformaciones.\n\n## **3. Muy fácil de integrar**\nLa documentación es clara, hay ejemplos funcionales y puedes empezar a testear sin grandes barreras técnicas. Ideal para startups y equipos que no quieren perder semanas en pruebas innecesarias.\n\n## **4. Escalable para empresas en crecimiento**\nDesde pequeños proyectos hasta grandes plataformas, Connect API se adapta al volumen que necesites sin comprometer el rendimiento ni la estabilidad.\n\n## **Ejemplos de lo que puedes hacer con Connect API**\n- **Comparación de precios de vuelos**: Consulta tarifas aéreas actualizadas por origen, destino y fecha, incluyendo detalles como duración, aerolínea, número de escalas y enlaces de reserva directa.\n\n- **Alertas y monitorización de tarifas aéreas**: Crea sistemas automatizados que detecten cambios en los precios de vuelos y notifiquen oportunidades para ahorrar o anticipar picos de demanda.\n\n- **Análisis de demanda hotelera por destino**: Obtén datos precisos sobre la disponibilidad de alojamientos según criterios como estrellas, tipo de alojamiento o políticas de cancelación.\n\n- **Planificación de viajes con base en disponibilidad real**: Combina vuelos y hoteles disponibles para fechas específicas y construye productos turísticos dinámicos.\n\n- **Segmentación avanzada de alojamientos**: Filtra alojamientos por puntuación mínima, distancia al centro, tipo de pensión, número de noches y más.\n\n- **Inteligencia de mercado para turismo y viajes**: Analiza tendencias de oferta y demanda en distintos destinos para informar decisiones estratégicas, tanto en el ámbito aéreo como hotelero.\n\n- **Integración directa en motores de búsqueda y apps de viaje**: Incorpora datos de vuelos y hoteles en tus productos digitales de forma sencilla y centralizada con una única API.\n\n- **Análisis competitivo y benchmarking**: Compara destinos turísticos en función de su disponibilidad de alojamiento para comprender la presión de demanda o detectar oportunidades.\n\n- **Automatización de reportes de disponibilidad**: Integra los endpoints en tu backend para actualizar dashboards internos o enviar reportes automatizados sobre el estado del mercado.\n\n## **Conclusión: las APIs ya no son una opción, son la base del crecimiento**\nEn el competitivo sector turístico de 2025, la diferencia entre una empresa que escala y otra que se queda atrás está en la tecnología que utiliza.\n\nLas APIs no solo aceleran procesos: permiten construir productos mejores. Y si eliges bien la API adecuada, como **[Connect API de Veetal](https://connect-api.veetal.app/)**, estarás apostando por eficiencia, escalabilidad y soporte humano de calidad.\n\n¿Listo para transformar tu estrategia con datos de vuelos? [Conecta con Veetal y descubre cómo empezar con Connect API.](https://connect-api.veetal.app/commercial-meeting)\n","APIs de viajes: qué son, cómo funcionan y por qué Connect API es la mejor opción en 2025","travel-apis-2025-guide-connect-api",[805],"Travel APIs: what they are, how they work and why Connect API is the best choice in 2025","Discover how APIs are transforming tourism—and why Veetal’s Connect API is the ideal solution for integrating flight data quickly and efficiently.\n","Descubre cómo las APIs transforman el turismo y por qué Connect API de Veetal es la solución ideal para integrar datos de vuelos de forma rápida y eficiente.","apis-de-viajes-2025-guia-connect-api","2025-06-03","## **Travel APIs: what they are, what they’re for and why Connect API Is the best choice in 2025**\n## **Introduction**\n[APIs are reshaping the travel industry](https://www.switchfly.com/blog/apis-in-the-travel-industry). From flight-price prediction to automated ticketing, APIs let companies tap real-time data, automate processes and create far smarter user experiences.\nBy 2025 it’s no longer enough to have an attractive website or a slick app. The real value lies in **data**—and, above all, in the ability to connect to it in an agile, reliable and scalable way.\nThis article explains what a travel API is, how the industry uses them, and why **[Veetal’s Connect API](https://connect-api.veetal.app/)** stands out as one of the best solutions for integrating flight data.\n\n## **What Is a Travel API?**\nAn **API (Application Programming Interface)** [is an interface that lets different systems or apps talk to each other](https://traveltradeready.net/what-is-api-in-travel-industry/). In tourism, that means accessing live information on flights, hotels, prices, availability and more—without manually checking multiple platforms.\nFor instance, if you want to show users real-time airfares, the ideal approach is to connect directly to a **flight API** rather than relying on manual processes or unstable scrapers.\n\n## **The Most Common Types of Travel APIs**\n\nThere [are several types of travel APIs](https://colorwhistle.com/top-travel-apis-developers/):\n\n- **Flight APIs**: Schedules, prices, seat availability, fare forecasts and more. **Veetal Connect API** includes a flight endpoint that delivers this data.\n- **Hotel APIs**: Room availability, rates, images, cancellation policies and so on. Connect API supplies detailed accommodation data—room availability, tariffs, minimum ratings, property type, etc.\n- **Ground-transport APIs**: Trains, buses or ride-sharing. (Connect API doesn’t yet offer ground-transport data, though its lodging data can pair with other transport platforms.)\n- **Activity & tour APIs**: Search and book activities and excursions.\n- **Booking APIs**: Handle payments and confirm reservations.\n\n## **Why Travel Companies Need APIs in 2025**\n[Consumer behaviour has changed. Users now expect rapid answers, instant comparisons and live prices.](https://www.travelport.com/travel-trends-2025-report)\n\nWith an API you can:\n- **Automate tasks** and cut operational time\n- **Centralise multiple data sources** in one place\n- **Create personalised experiences** using dynamic data\n- **Offer better prices and faster service** than competitors\n\nWithout APIs, achieving this would be impossible.\n\n## **Common Pain Points with Many Travel APIs**\n\n- [Complex, poorly documented integrations](https://acropolium.com/blog/travel-api-integration-top-apis-and-reasons-to-implement-them/)\n- Long response times\n- Impersonal or automated support\n- Hidden costs or messy pricing tiers\n- Service instability\n\n## **Connect API: A Modern, Efficient Alternative**\n[Developed by **Veetal**, Connect API](https://connect-api.veetal.app/) solves those problems with a flight-centred data service that excels on four fronts:\n\n### **1. Dedicated support from day one**\nEvery Veetal client gets an exclusive agent who understands the business model, guides the integration and provides real help—no bots, no unanswered tickets.\n\n### **2. Fast and lightweight**\nPerformance is a core pillar: responses arrive in milliseconds in a clean structure that drops straight into your systems—no heavy transformations.\n\n### **3. Very easy to integrate**\nClear docs, working examples and ready-made SDKs mean you can start testing with minimal barriers—perfect for start-ups and small teams that don’t want to lose weeks on trial-and-error.\n\n### **4. Scalable for growing businesses**\nFrom small projects to large platforms, Connect API scales to any volume without sacrificing speed or stability.\n\n## **What You Can Do with Connect API**\n### **• Flight-price comparison**\nQuery up-to-date airfares by origin, destination and date—complete with duration, airline, stopovers and direct-booking links.\n\n### **• Fare-alert and monitoring systems**\nAutomate price tracking and notify users of savings opportunities or demand spikes.\n\n### **• Hotel-demand analysis by destination**\nAccess precise lodging availability filtered by stars, property type or cancellation policy.\n\n### **• Real-availability trip planning**\nCombine live flight and hotel inventory for specific dates to build dynamic travel products.\n\n### **• Advanced accommodation segmentation**\nFilter by minimum rating, distance to centre, board type, number of nights and more.\n\n### **• Market intelligence for travel & tourism**\nAnalyse supply-and-demand trends across destinations to guide strategic decisions in both air and hotel segments.\n\n### **• Direct integration into search engines & travel apps**\nFeed flight and hotel data into your digital products through a single, centralised API.\n\n### **• Competitive analysis & benchmarking**\nCompare destinations by lodging availability to gauge demand pressure or spot opportunities.\n\n### **• Automated availability reporting**\nWire endpoints into your backend to update internal dashboards or send scheduled market-status reports.\n\n## **Conclusion: APIs Are No Longer Optional—They’re the Foundation of Growth**\nIn the fiercely competitive travel sector of 2025, the gulf between a company that scales and one that falls behind is defined by its technology.\n\nAPIs don’t just speed up processes; they let you build better products. Pick the right API—**[Veetal’s Connect API](https://connect-api.veetal.app/)**—and you’re choosing efficiency, scalability and quality human support.\n\n**Ready to transform your strategy with flight data?** [Connect with Veetal and find out how to get started with Connect API.](https://connect-api.veetal.app/commercial-meeting)\n\n","Tourism data is complex. Multiple sources, multiple formats, constantly changing.\n\nMost companies spend more time managing data ingestion than actually using the data.\n\nThat's what a travel API is designed to solve.\n\nWhat it handles for you:\n→ Flight data — schedules, fares, routes\n→ Hotel availability and rates in real time\n→ OTA feeds without the scraping overhead\n→ Consistent, normalized data from day one\n\nComplete guide: what travel APIs are, how they work, and why Connect API is the fastest path to production-quality data.\n\nLink in comments 👇\n\n#TravelTech #API #TravelData #ConnectAPI #Tourism",[855],{"filename":856},"travel-apis-2025-guide-connect-api-thumbnail.webp",{"id":858,"fields":859},"recN7H6t1jjChIojA",{"Header":860,"Body_es":863,"Title_es":864,"Published":802,"Slug_en":865,"Author":866,"Title_en":867,"Summary_en":868,"Summary_es":869,"Slug_es":870,"Date":871,"Body_en":872,"LinkedIn post":873,"Thumbnail":874},[861],{"filename":862},"how-to-get-hotel-data-without-scraping-header.webp","# Cómo Obtener Datos Hoteleros Sin Hacer Web Scraping\n\nSi alguna vez has intentado construir un producto de viajes que depende de datos hoteleros, probablemente hayas considerado el web scraping en algún momento. Los datos están ahí mismo, en Booking.com. ¿Por qué no simplemente cogerlos?\n\nLa respuesta corta: porque el scraping de datos hoteleros es una trampa de deuda técnica que nunca termina.\n\n## El Problema del Web Scraping Hotelero\n\nLos sitios de reservas hoteleras cambian la estructura de su web constantemente. Un solo cambio de diseño rompe tus selectores CSS, matando toda tu extracción de datos. Entonces tienes que arreglarlo. Y parchearlo otra vez la semana siguiente.\n\nLas plataformas de reservas hoteleras implementan activamente sistemas de gestión de acceso para controlar el tráfico automatizado. Más allá de los desafíos de gestión de acceso, están los costes de infraestructura, el mantenimiento continuo y la sobrecarga operativa, que se vuelven progresivamente más caros a medida que crecen tus necesidades de datos.\n\n## Los Costes Reales del Scraping de Datos Hoteleros\n\n**Infierno de mantenimiento**: Un rediseño web es un incidente de ingeniería completo. Sitios web como Booking.com rediseñan su frontend trimestralmente. Cada rediseño = selectores rotos = trabajo de ingeniería de emergencia.\n\n**Calidad de datos**: El HTML que scrapeas es desordenado. Necesitas lógica de parseo personalizada para casos límite. Diferentes plataformas usan diferentes estructuras de datos. Combinar datos de múltiples fuentes es un proyecto de meses.\n\n**Sobrecarga operativa**: El scraping hotelero a escala requiere infraestructura distribuida, gestión de resiliencia y gestión de tráfico — añadiendo una sobrecarga operativa y de mantenimiento significativa.\n\n## ¿Qué Deberías Hacer en su Lugar?\n\nEl enfoque moderno es acceder a datos hoteleros a través de una API estructurada. Esto te da:\n\n**Datos limpios y estructurados** — JSON, no parseo de HTML\n**Actualizaciones en tiempo real** — Sin retrasos mientras esperas al siguiente ciclo de scraping\n**Fiabilidad** — Tiempo de actividad respaldado por SLA, no \"depende del tráfico del sitio\"\n**Transparencia operativa** — Sabes exactamente qué datos recibes y cuándo\n**Cumplimiento** — Acceso a datos claro y autorizado\n\n## Cómo Funcionan las APIs de Datos Hoteleros\n\nEn lugar de parsear HTML de Booking.com o Expedia, una API de datos hoteleros te conecta directamente con proveedores de datos que agregan precios, disponibilidad e inteligencia competitiva de múltiples fuentes.\n\nLa Connect API de Veetal, por ejemplo, ofrece:\n- Tarifas hoteleras y disponibilidad en más de 50.000 propiedades\n- Precios de competidores en tiempo real\n- Tendencias de ocupación\n- Datos estructurados (JSON) — sin necesidad de parseo\n- Validación de datos integrada y gestión de errores\n\n## Por Qué los Hoteles y Equipos de Travel Tech Eligen APIs\n\n**Revenue management**: Necesitas tarifas precisas de competidores para optimizar tu propio pricing. Una API te las entrega en tiempo real.\n\n**Motores de reserva**: Construir un sitio de reservas de viajes requiere datos limpios y fiables de cientos de fuentes. Una API resuelve este problema.\n\n**Business intelligence**: La analítica de precios hoteleros requiere datos históricos y calidad de datos consistente. Las APIs proporcionan datos normalizados y auditables.\n\n**Monitorización de mercado**: Conocer las tendencias de precios, los patrones de demanda y los movimientos de la competencia requiere datos fiables. Los scrapers introducen retrasos e inconsistencias.\n\n## Conclusión\n\nEl scraping de datos hoteleros funciona como prueba de concepto, pero falla en producción porque:\n- Los sitios web cambian constantemente\n- La infraestructura escala con dificultad\n- La sobrecarga operativa crece con el tiempo\n- El panorama de cumplimiento es incierto\n\nPara datos hoteleros escalables, fiables y operativamente sólidos, una API estructurada es la opción clara.\n\nVeetal Connect proporciona datos de tarifas hoteleras en tiempo real, feeds de disponibilidad e inteligencia competitiva a través de una API REST limpia — ayudando a los equipos de tecnología hotelera a construir productos más rápidos y fiables sin los dolores de cabeza del scraping.","Cómo Obtener Datos Hoteleros Sin Hacer Web Scraping","how-to-get-hotel-data-without-scraping",[826],"How to Get Hotel Data Without Scraping","Web scraping hotel data is fragile, legally risky, and expensive to maintain. This guide explains the professional alternative: how to access hotel rates, availability, reputation, and competitor data through a structured API — clean, reliable, and production-ready from day one.","El web scraping de datos hoteleros es frágil, tiene riesgos legales y es caro de mantener. Esta guía explica la alternativa profesional: cómo acceder a tarifas, disponibilidad, reputación y datos de competidores a través de una API estructurada.","como-obtener-datos-hoteleros-sin-scraping","2026-03-16","# How to Get Hotel Data Without Scraping\n\nIf you've ever tried to build a travel product that relies on hotel data, you've probably considered web scraping at some point. The data is right there on Booking.com. Why not just grab it?\n\nThe short answer: because scraping hotel data is a technical debt trap that never ends.\n\n## The Problem With Hotel Web Scraping\n\nHotel booking sites change their website structure constantly. A single layout change breaks your CSS selectors, killing your entire data extraction. Then you have to fix it. And patch it again the next week.\n\nHotel booking platforms actively implement access management systems to control automated traffic. Beyond access management challenges, there's infrastructure cost, ongoing maintenance, and operational overhead that gets progressively more expensive as your data needs grow.\n\n## The Real Costs of Hotel Data Scraping\n\n**Maintenance hell**: A web redesign is a full engineering incident. Websites like Booking.com redesign their frontend quarterly. Each redesign = broken selectors = emergency engineering work.\n\n**Data quality**: The HTML you scrape is messy. You need custom parsing logic for edge cases. Different platforms use different data structures. Combining data from multiple sources is a months-long project.\n\n**Operational overhead**: Hotel scraping at scale requires distributed infrastructure, resilience handling, and traffic management — adding significant operational and maintenance overhead.\n\n## What Should You Do Instead?\n\nThe modern approach is to access hotel data through a structured API. This gives you:\n\n**Clean, structured data** — JSON, not HTML parsing\n**Real-time updates** — No delays while you wait for the next scrape cycle\n**Reliability** — SLA-backed uptime, not \"it depends on the site's traffic\"\n**Operational transparency** — You know exactly what data you get and when\n**Compliance** — Clear, authorized data access\n\n## How Hotel Data APIs Work\n\nRather than parsing HTML from Booking.com or Expedia, a hotel data API connects you directly to data providers that aggregate pricing, availability, and competitor intelligence from multiple sources.\n\nVeetal's Connect API, for example, delivers:\n- Hotel rates and availability across 50,000+ properties\n- Real-time competitor pricing\n- Occupancy trends\n- Structured data (JSON) — no parsing required\n- Built-in data validation and error handling\n\n## Why Hotels & Travel Tech Teams Choose APIs\n\n**Revenue management**: You need accurate competitor rates to optimize your own pricing. An API delivers this in real time.\n\n**Booking engines**: Building a travel booking site requires clean, reliable data from hundreds of sources. An API solves this problem.\n\n**Business intelligence**: Hotel pricing analytics require historical data and consistent data quality. APIs provide normalized, auditable data.\n\n**Market monitoring**: Knowing pricing trends, demand patterns, and competitor moves requires reliable data. Scrapers introduce delays and inconsistency.\n\n## The Bottom Line\n\nHotel data scraping works as a proof-of-concept, but it fails in production because:\n- Websites change constantly\n- Infrastructure scales with difficulty\n- The operational overhead grows over time\n- The compliance landscape is uncertain\n\nFor scalable, reliable, and operationally sound hotel data, a structured API is the clear choice.\n\nVeetal Connect provides real-time hotel rate data, availability feeds, and competitor intelligence via a clean REST API — helping hotel tech teams build faster, more reliable products without the scraping headaches.","You're still scraping hotel data.\n\nYour scraper breaks every time Booking.com updates a CSS class.\nYour IP gets blocked before breakfast.\nYour data is inconsistent across sources.\nAnd your engineering team spends more time maintaining scrapers than building product.\n\nThere's a reason companies move to travel data APIs.\n\nWe wrote the guide: how to replace your scrapers with a legal, real-time data feed — one source at a time, in under a week.\n\nLink in comments 👇\n\n#HotelTech #TravelData #API #WebScraping #TravelStartup",[875],{"filename":876},"how-to-get-hotel-data-without-scraping-thumbnail.webp",{"id":878,"fields":879},"recWXkRCv9bDH0194",{"Header":880,"Body_es":883,"Title_es":884,"Published":802,"Slug_en":885,"Author":886,"Title_en":887,"Summary_en":888,"Summary_es":889,"Slug_es":890,"Date":891,"Body_en":892,"LinkedIn post":893,"Thumbnail":894},[881],{"filename":882},"what-is-hotel-rate-parity-header.webp","## ¿Qué Es la Paridad de Tarifas Hoteleras?\n\nLa paridad de tarifas hoteleras (o \"rate parity\") es la práctica de mantener precios de habitaciones consistentes en todos los canales de distribución: desde la web del propio hotel hasta Booking.com, Expedia o cualquier OTA (Agencia de Viajes Online).\n\nEn términos simples: si una habitación doble estándar cuesta 150€ en Booking.com, debería costar 150€ en todos los demás canales también.\n\n## ¿Por Qué Existe la Paridad de Tarifas?\n\nLos acuerdos de paridad de tarifas surgieron para proteger la inversión de las OTAs en marketing hotelero. Si los viajeros siempre pudieran encontrar tarifas más baratas reservando directamente, las OTAs perderían su modelo de negocio.\n\nExisten dos tipos principales de paridad tarifaria:\n\n### Paridad Estricta\n\nTodas las tarifas públicas deben ser idénticas en todos los canales. El hotel no puede ofrecer una tarifa inferior en ningún lugar, incluida su propia web de reservas directas.\n\n### Paridad Estrecha (o Paridad Suave)\n\nEl hotel no puede ofrecer tarifas públicas inferiores en canales de terceros respecto a su web propia. Esto da a los hoteles la libertad de ofrecer tarifas más bajas directamente, pero sin socavar los precios de las OTAs en otras OTAs.\n\n## ¿Es Legal la Paridad de Tarifas?\n\nAquí la situación se complica. Varios países europeos han cuestionado las cláusulas de paridad:\n\n- **Francia** prohibió las cláusulas de paridad amplia en 2015 (Loi Macron)\n- **Alemania**: el Bundeskartellamt declaró ilegales las cláusulas de paridad de Booking.com\n- **UE**: avanza hacia la paridad estrecha como estándar aceptable\n\nEn la práctica, muchas OTAs principales —incluidas Booking.com y Expedia— han pasado a la paridad estrecha para cumplir con las normativas.\n\n## Por Qué Importa la Paridad a los Revenue Managers\n\nPara los revenue managers, la paridad es tanto una limitación como una herramienta estratégica:\n\n**La limitación**: No puedes ofrecer públicamente tarifas más bajas en canales de terceros. Esto restringe tu flexibilidad de precios.\n\n**La oportunidad estratégica**: Entender la paridad te permite usar canales no públicos — tarifas para miembros, programas de fidelización, ofertas exclusivas por email — para impulsar reservas directas sin violar la paridad.\n\n## Infracciones de Paridad: ¿Qué Ocurre?\n\nSi un hotel viola la paridad, las OTAs pueden:\n\n- Reducir su visibilidad en los resultados de búsqueda\n- Cobrar una comisión más elevada\n- En casos extremos, eliminar la propiedad del canal\n\nMonitorizar violaciones de paridad manualmente es prácticamente imposible para cadenas hoteleras que gestionan cientos de propiedades. Aquí es donde las APIs de datos hoteleros se vuelven imprescindibles.\n\n## Cómo Monitorizar la Paridad con una API Hotelera\n\nLas APIs de datos hoteleros modernas como Veetal Connect permiten a los revenue managers:\n\n1. **Monitorizar tarifas en tiempo real** en todas las OTAs simultáneamente\n2. **Detectar violaciones de paridad** automáticamente en cuanto se producen\n3. **Rastrear precios de la competencia** para comparar su posicionamiento\n4. **Construir dashboards de inteligencia tarifaria** que alertan sobre discrepancias\n\nCon datos de tarifas hoteleras estructurados, puedes configurar alertas automáticas cuando tus tarifas en Booking.com, Expedia o Google Hotels se desvíen de la paridad, protegiendo tus relaciones con las OTAs y tu estrategia de precios.\n\n## Paridad vs. Disparidad Tarifaria\n\nLa disparidad tarifaria ocurre cuando las tarifas de un hotel son inconsistentes entre canales, de forma accidental o intencionada. Las causas más comunes son:\n\n- Errores de conversión de divisas\n- Tarifas promocionales sin restricciones adecuadas\n- Revendedores terceros que adquieren y redistribuyen inventario a precios distintos\n- Falta de herramientas de monitorización\n\nLa disparidad puede perjudicarte en ambos sentidos: si las OTAs muestran tarifas más bajas, los huéspedes reservan allí (y pagas comisión); si tu web es más barata pero difícil de encontrar, pierdes ingresos.\n\n## KPIs Clave de Paridad para Revenue Managers\n\n| KPI | Qué Mide |\n|-----|----------|\n| Tasa de Paridad | % de canales con tarifas coincidentes |\n| Índice de Disparidad | Cuánto se desvían las tarifas fuera de paridad |\n| Gap OTA vs. Directo | Diferencia entre tarifas OTA y canal directo |\n| Puntuación de Cumplimiento | Puntuación ponderada en todos los canales monitorizados |\n\n## Preguntas Frecuentes sobre Paridad de Tarifas\n\n**¿Qué es la paridad estrecha?**\nLa paridad estrecha permite a los hoteles ofrecer tarifas más bajas en sus canales directos propios, pero les impide ofrecer tarifas inferiores en una OTA respecto a otra.\n\n**¿Pueden los hoteles ofrecer tarifas más bajas a miembros de fidelización?**\nSí. Las tarifas exclusivas para miembros, precios de programas de fidelización y ofertas por email generalmente están exentas de los acuerdos de paridad, ya que no son públicamente accesibles.\n\n**¿Qué OTAs aplican la paridad de tarifas?**\nBooking.com, Expedia, Hotels.com y Agoda tienen algún tipo de cláusula de paridad, aunque su rigidez varía según el mercado y los cambios regulatorios recientes.\n\n**¿Cómo puedo monitorizar la paridad en todos los canales?**\nUsando una API de datos de tarifas hoteleras como Veetal Connect, puedes acceder a precios en tiempo real de todas las OTAs principales y automatizar la monitorización de paridad en tu sistema de revenue management.\n\n## Conclusión\n\nLa paridad de tarifas es un concepto fundamental que todo revenue manager hotelero debe conocer. Aunque las normativas han relajado los requisitos de paridad estricta en muchos mercados, mantener precios consistentes en todos los canales sigue siendo clave para las relaciones con las OTAs, la confianza en la marca y la optimización de ingresos.\n\nLos mejores revenue managers combinan un profundo conocimiento de las reglas de paridad con herramientas de monitorización de tarifas en tiempo real, asegurándose de poder actuar sobre las oportunidades de precios en el momento en que surgen.","¿Qué Es la Paridad de Tarifas Hoteleras? Guía Completa para Revenue Managers","what-is-hotel-rate-parity",[826],"What Is Hotel Rate Parity? Complete Guide for Revenue Managers","Hotel rate parity ensures consistent room pricing across all distribution channels. This complete guide explains what rate parity means, how it works, its legal status in Europe, and how revenue managers can monitor parity violations using hotel data APIs.","La paridad de tarifas hoteleras garantiza precios consistentes en todos los canales de distribución. Esta guía completa explica qué significa, cómo funciona, su estado legal en Europa y cómo los revenue managers pueden monitorizar violaciones con APIs de datos hoteleros.","que-es-la-paridad-de-tarifas-hoteleras","2026-01-09","## What Is Hotel Rate Parity?\n\nHotel rate parity is the practice of maintaining consistent room rates across all distribution channels — whether that's your hotel's own website, Booking.com, Expedia, or any other OTA (Online Travel Agency).\n\nIn simple terms: if a standard double room costs €150 on Booking.com, it should cost €150 everywhere else too.\n\n## Why Does Rate Parity Exist?\n\nRate parity agreements were originally created to protect OTAs' investment in marketing your hotel. If travelers could always find a cheaper rate by booking directly, OTAs would lose their business model.\n\nThere are two types of rate parity:\n\n### Strict Rate Parity\n\nAll public rates must be identical across all channels. The hotel cannot offer a lower rate anywhere, including its own direct booking website.\n\n### Narrow Rate Parity (or Soft Rate Parity)\n\nThe hotel cannot offer lower public rates on third-party channels than on its own website. This gives hotels the freedom to offer lower rates directly — just not to undercut OTA pricing on other OTAs.\n\n## Is Rate Parity Legal?\n\nThis is where it gets complex. Several European countries have challenged rate parity clauses:\n\n- **France** banned broad rate parity clauses in 2015 (Loi Macron)\n- **Germany** saw Booking.com's rate parity clauses declared illegal by the Bundeskartellamt\n- **EU** has increasingly moved toward narrow parity as the acceptable standard\n\nIn practice, many major OTAs — including Booking.com and Expedia — have shifted to narrow rate parity to comply with regulations.\n\n## Why Rate Parity Matters for Revenue Managers\n\nFor revenue managers, rate parity is both a constraint and a strategic tool:\n\n**The constraint**: You cannot publicly offer lower rates on third-party channels. This limits your pricing flexibility.\n\n**The strategic opportunity**: Understanding parity means you can use non-public channels — member rates, loyalty programs, email-exclusive offers — to drive direct bookings without violating parity.\n\n## Rate Parity Violations: What Happens?\n\nIf a hotel violates rate parity, OTAs can:\n\n- Remove or reduce visibility in search results\n- Charge a higher commission\n- In extreme cases, delist the property\n\nMonitoring parity violations manually is nearly impossible for hotel chains managing hundreds of properties. That's where hotel rate APIs become essential.\n\n## How to Monitor Rate Parity with a Hotel API\n\nModern hotel data APIs like Veetal Connect allow revenue managers to:\n\n1. **Monitor real-time rates** across all OTAs simultaneously\n2. **Detect parity violations** automatically as soon as they appear\n3. **Track competitor pricing** to benchmark your positioning\n4. **Build rate intelligence dashboards** that alert you to discrepancies\n\nWith structured hotel rate data, you can set automated alerts when your rates on Booking.com, Expedia, or Google Hotels drift out of parity — protecting your OTA relationships and your pricing strategy.\n\n## Rate Parity vs. Rate Disparity\n\nRate disparity happens when a hotel's rates are inconsistent across channels — accidentally or intentionally. Common causes include:\n\n- Currency conversion errors\n- Promotional rates not properly restricted\n- Third-party resellers acquiring and redistributing inventory at different prices\n- Lack of monitoring tools\n\nRate disparity can work against you in both directions: if OTAs show lower rates, guests book there (and you pay commission); if your website is cheaper but rarely found, you lose revenue.\n\n## Key Rate Parity KPIs for Revenue Managers\n\n| KPI | What It Measures |\n|-----|------------------|\n| Parity Rate | % of channels with matching rates |\n| Disparity Index | How far out-of-parity rates deviate |\n| OTA vs Direct Rate Gap | Difference between OTA and direct channel rates |\n| Parity Compliance Score | Weighted score across all monitored channels |\n\n## FAQs About Hotel Rate Parity\n\n**What is narrow rate parity?**\nNarrow rate parity allows hotels to offer lower rates on their own direct channels, but prevents them from offering lower rates on one OTA vs. another.\n\n**Can hotels offer lower rates to loyalty members?**\nYes. Member-only rates, loyalty program prices, and email-exclusive offers are generally exempt from parity agreements, as they are not publicly available.\n\n**Which OTAs enforce rate parity?**\nBooking.com, Expedia, Hotels.com, and Agoda all have some form of rate parity clauses, though the strictness varies by market and recent regulatory changes.\n\n**How can I monitor rate parity across all channels?**\nUsing a hotel rate data API like Veetal Connect, you can access real-time pricing from all major OTAs and build automated parity monitoring into your revenue management system.\n\n## Conclusion\n\nRate parity is a fundamental concept every hotel revenue manager must understand. While regulations have relaxed strict parity requirements in many markets, maintaining consistent pricing across channels remains critical for OTA relationships, brand trust, and revenue optimization.\n\nThe best revenue managers combine a deep understanding of parity rules with real-time rate monitoring tools — ensuring they can act on pricing opportunities the moment they arise.","Rate parity isn't just a policy. It's revenue.\n\nWhen your hotel shows €150 on your website but €139 on Booking.com, every guest who spots that gap books through the OTA.\n\nYou pay the commission — for a booking that could have been direct and free.\n\nWhat most revenue teams don't realize:\n→ Parity violations often come from wholesale rate leakage, not the OTA\n→ Manual checks catch maybe 5% of incidents\n→ In Europe, strict parity clauses are banned — but violations still happen constantly\n→ Real-time monitoring catches them before they cost you bookings\n\nComplete guide to hotel rate parity: what it means, the legal landscape across Europe, and how to monitor it automatically.\n\nLink in comments 👇\n\n#RevenueManagement #HotelTech #RateParity #OTA #HospitalityData",[895],{"filename":896},"what-is-hotel-rate-parity-thumbnail.webp",{"id":898,"fields":899},"recZnD2AOVorZaTFj",{"Header":900,"Body_es":903,"Title_es":904,"Published":802,"Slug_en":905,"Author":906,"Title_en":908,"Summary_en":909,"Summary_es":910,"Slug_es":911,"Date":912,"Body_en":913,"LinkedIn post":914,"Thumbnail":915},[901],{"filename":902},"tourism-data-api-vs-scraping-header.webp","## **¿Por qué es mejor usar una API que hacer scraping? Los datos turísticos como ventaja competitiva**\nLa industria del turismo se está transformando radicalmente gracias a los datos. Cada vez más, **las empresas de viajes** (agencias, OTAs, aerolíneas, consultoras) aprovechan la _inteligencia turística_ –combinando datos de vuelos, alojamientos, reputación online y eventos– para mejorar su toma de decisiones. Como señala _Smart Travel News_, \"[la inteligencia artificial y el análisis de datos están remodelando la industria del turismo a escala global](https://www.smarttravel.news/tres-formas-en-que-la-ia-y-los-datos-estan-transformando-el-turismo/#:~:text=La%20inteligencia%20artificial%20y%20el,transformador%20de%20estas%20tecnolog%C3%ADas%20emergentes)\". Contar con **datos turísticos para empresas** en tiempo real (precios, ocupación, demanda, calificaciones, etc.) permite ajustar estrategias comerciales, anticipar tendencias y optimizar recursos. Frente a esto, prácticas tradicionales como el scraping web (raspado manual de páginas) se quedan obsoletas: ofrecen datos desordenados, incompletos o desactualizados. Las agencias y plataformas que siguen usando scraping arriesgan fiabilidad y legalidad. Por eso, soluciones basadas en APIs –como la **Connect API de Veetal**– son la **alternativa al web scraping** más moderna y potente.\n\n## **Limitaciones del web scraping tradicional**\nEl _web scraping_ ha sido popular por automatizar la extracción de datos. Pero presenta importantes **desventajas** para el sector turismo:\n- **Dependencia de la estructura web:** Los scrapers dependen del código HTML del sitio. Si la plataforma fuente cambia su diseño o estructura, el scraper falla. Cada actualización del proveedor (por ejemplo, un cambio en la web de reservas) obliga a rediseñar y probar el scraper nuevamente, encareciendo el mantenimiento.\n- **Bloqueos y fiabilidad:** Muchos sitios implementan medidas de gestión de tráfico y control de acceso. Los scrapers pueden quedar bloqueados o generar datos incompletos. Mantener infraestructura técnica especializada es costoso y nunca garantiza 100% de acceso continuo.\n- **Riesgos legales y éticos:** La legalidad del scraping presenta complejidades operativas. Como advierte Kinsta, \"no todos los datos de la web son legales para scrapear\"; extraer información personal o protegida puede considerarse malicioso y acarrear sanciones ([p. ej., _avisos de retirada DMCA_](https://kinsta.com/es/base-de-conocimiento/que-es-web-scraping/#:~:text=obteniendo%20el%20precio%20correcto)). Según expertos de privacidad, el scraping solo se permite si los datos son _públicos_ y no requieren login, pero aún así debe cumplirse con los términos de servicio, [derechos de autor y protección de datos](https://www.iubenda.com/es/help/111939-is-web-scraping-legal-what-you-need-to-know#:~:text=El%20raspado%20de%20datos%20suele,estar%20permitido%20cuando). En turismo esto es crítico: muchas webs de reservas tienen políticas estrictas. El acceso a datos turísticos debe implementarse de forma responsable, respetando los recursos y políticas de cada plataforma, lo que requiere una infraestructura cuidadosamente diseñada.\n- **Recursos y mantenimiento:** Crear y mantener scrapers requiere conocimientos avanzados (análisis HTML, manejo de errores, almacenamiento). Cada vez que un sitio cambia, hay que reasignar tiempo de desarrollo. A largo plazo, el scraping puede ser más caro en infraestructura (servidores, ancho de banda) y en horas de ingeniería que otras opciones.\n- **Actualización irregular:** El scraping obtiene datos estáticos en el momento de la extracción. Cualquier cambio posterior (nuevos precios, cancelaciones, cambios de inventario) requiere volver a raspar todo el sitio. Esto dificulta tener información _actualizada_ y obliga a programar y mantener scrapers frecuentes.\n\nEn resumen, aunque el scraping puede ser una solución rápida en ciertos casos, sus **limitaciones de fiabilidad, sus altos costes y los riesgos legales** asociados lo hacen poco eficiente para empresas que necesitan datos turísticos limpios y actualizados de forma continua.\n\n## **Ventajas de usar una API de datos estructurados**\nEn contraste, una **API especializada en datos turísticos** ofrece múltiples beneficios:\n\n-**Datos estructurados y limpios:** Las APIs entregan información en formatos estándar (JSON, XML) listos para usar. No es necesario parsear HTML ni filtrar datos irrelevantes. Como explican expertos en datos, las APIs brindan acceso a \"[datos en formatos estructurados que se integran con mínima limpieza](https://www.zenrows.com/blog/web-scraping-vs-api#in-depth-comparison)\", lo que acelera el desarrollo de aplicaciones y análisis.\n\n-**Actualización en tiempo real:** Las APIs permiten extraer datos directamente de la fuente siempre que se necesite. Esto garantiza información _fresca_: tarifas de vuelo o disponibilidad hotelera siempre al día. No hay que esperar a volver a ejecutar un scraper; basta con llamar al endpoint de la API para obtener lo último en precios, inventario o reputación.\n\n-**Estabilidad y seguridad:** A diferencia de un scraper, una API oficial suele ofrecer control de versiones y documentación. Los cambios en los datos se notifican (por ejemplo, mediante versiones de API), evitando que una actualización rompa la integración. Además, las APIs suelen incluir autenticación y manejo de tasas claros, reduciendo riesgos operativos. En general, la estabilidad de una solución API es mucho mayor.\n\n-**Escalabilidad y rendimiento:** Consumir datos vía API es generalmente más rápido que hacer scraping a gran escala. Las APIs optimizan la entrega, reduciendo la latencia. Se puede solicitar grandes volúmenes de datos en unos segundos sin tener que paralelizar scrapers o gestionar múltiples conexiones simultáneas. Esto agiliza tanto prototipos como análisis masivos.\n\n-**Cumplimiento legal:** Al usar una API oficial o diseñada con acuerdos, el marco legal es claro. La empresa proveedora define términos de uso precisos. Con una API, el acceso a datos cumple con normativas y licencias, evitando riesgos de privacidad o propiedad intelectual.\n\nEn definitiva, las APIs de turismo suponen una **alternativa al web scraping** mucho más robusta. Permiten acceder a **datos turísticos para empresas** de forma rápida, fiable y dentro del marco legal. Además, las APIs suelen incluir soporte técnico y documentación, facilitando la integración incluso para equipos no especializados en scraping puro.\n\n## **Conectando con la Connect API de Veetal**\nAnte los retos del scraping, Veetal ofrece la **Connect API**, una solución moderna diseñada para el sector travel. Esta API centraliza fuentes de datos de viajes líderes (por ejemplo, Booking, Expedia, TripAdvisor, etc.) y entrega _datasets integrados_ para tus aplicaciones. En palabras de nuestros clientes:\n\n_\"Lo que más valoramos de la Connect API de Veetal es la tranquilidad que nos da saber que los datos están perfectamente cubiertos. No tenemos que preocuparnos por gestionar un equipo dedicado a la extracción y mantenimiento de los datos ni por las actualizaciones. Los costes son bajos y externalizados, lo que nos permite centrarnos en lo que realmente importa: optimizar nuestras operaciones sin complicaciones.\"_\n\nEn la práctica, **Connect API de Veetal** permite integrar fácilmente datos de vuelos, alojamientos, precios y otras métricas clave.\nSe conecta en segundos mediante unas pocas líneas de código o incluso puede canalizar la información directamente a tu infraestructura. Además, cada cliente cuenta con **soporte humano dedicado**: un agente asignado que acompaña la implementación y uso continuo. Esto asegura que la configuración sea rápida y a medida de tus necesidades.\n\nComo destaca Veetal, su servicio incluye \"Integración de datos de hoteles y vuelos: _acceso instantáneo a información actualizada_ sobre precios, disponibilidad y detalles\", junto con _\"soporte técnico dedicado: ayuda personalizada para la implementación\"_. Estos diferenciales (un agente por cliente y documentación clara) garantizan que no dependes solo de foros o chatbots: tienes asistencia real de expertos.\n\n### **Ventajas clave de Connect API**\n\n- **Instalación ágil:** La Connect API está preparada para usarse de inmediato. No requieres desarrollar tu propio scraper ni gestionar infraestructura especializada. Según Veetal, su solución \"[reduce el tiempo de desarrollo en un 50%](https://www.linkedin.com/feed/update/urn:li:activity:7269312620443172866)\". Con unos clics o llamadas API simples ya accedes al ecosistema de datos.\n\n\n- **Datos especializados:** Obtén _datos turísticos específicos_ listos para análisis. Por ejemplo, Connect API entrega **datos de vuelos y alojamiento actualizados**, incluyendo tarifas, disponibilidad y [demanda](https://www.linkedin.com/feed/update/urn:li:activity:7269315212812427264). También ofrece información sobre eventos locales y tendencias de búsqueda, de modo que puedas anticipar picos de demanda o planificar promociones. Incluso hay datos de **reputación online** (reseñas y puntuaciones) para mejorar la experiencia al cliente. Todo esto viene limpio y estructurado, listo para integrarse en tus sistemas de pricing, CRM o BI.\n\n\n- **Cobertura integral:** Con una sola API accedes a información que de otro modo requeriría múltiples fuentes y scrapers distintos. Connect API agrupa datasets de **vuelos, alojamientos, eventos y demanda de mercado** bajo el mismo techo. Esto simplifica el proceso: no es necesario coordinar extraer datos de varios portales. Todo está centralizado y normalizado.\n\n\n- **Alta confiabilidad:** Los datos de Veetal provienen de fuentes oficiales o procesos certificados. Esto garantiza que la calidad sea muy alta. De hecho, Veetal subraya que Connect API proporciona \"datos frescos y precisos\" con \"información actualizada y precisa de plataformas clave\". Con esta fiabilidad puedes basar tus decisiones de precios y promoción en información _de primera mano_, no en estimaciones inciertas.\n\n\n- **Soporte personalizado:** Cada cliente recibe atención personalizada de un equipo especializado. Este enfoque de \"un agente por cliente\" implica que tienes siempre a quién acudir para dudas de integración o solicitud de datos especiales (datasets a medida). Como resumen Veetal: _\"Nosotros optimizamos los servicios para asegurar el menor coste sin sacrificar calidad. Tu solución, hecha a medida\"_. Este soporte humano es un gran diferenciador frente a soluciones genéricas.\n\n### **Comparativa: Web Scraping vs. Connect API**\n\n|            | Scraping Manual                                                                                          | Veetal Connect API                                                                                                 |\n|--------------------------|----------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------|\n| **Time-to-Market**       | Lento; requiere desarrollo e integración manual                                                          | Rápido; integración sencilla en pocas horas                                                                         |\n| **Costes operativos**    | Altos; requiere un equipo de tecnología interno                                                           | Bajas; coste solo por uso de la API                                                                                 |\n| **Escalabilidad**        | Limitada; crece con dificultades a medida que aumenta la demanda                                          | Escalable; fácil de ampliar a nuevos mercados o más fuentes de datos                                                |\n| **Actualización de datos**| Manual, esporádica y limitada                                                                             | Datos actualizados                                                                                                   |\n| **Estructura de los datos**| Inconsistente, sin filtros y desordenada. HTML desestructurado; requiere limpieza y parseo complejos     | Consistente, escalable y fácil de integrar. JSON/XML estructurado; listo para análisis                             |\n| **Mantenimiento**        | Alto; requiere monitoreo constante. Requiere equipo técnico y actualización constante                     | Mínimo; mantenimiento gestionado por Veetal que gestiona la extracción y actualización                             |\n| **Soporte**              | General o inexistente                                                                                     | Dedicado y personalizado (agente asignado)                                                                           |\n| **Fiabilidad**           | Variable; vulnerable a cambios en web, dependiente de la calidad del scraping                            | Alta; datos validados y garantizados, cambios notificados y bajo soporte                                            |\n| **Aspecto legal**        | Presenta complejidades operativas que requieren cuidadosa gestión del acceso                              | Uso autorizado vía API; términos claros y cumplimiento asegurado                                                    |\n| **Variedad de datos**    | Limitada a páginas individuales; información parcial                                                      | [Amplia: incluye vuelos, alojamientos, reputación online, eventos, etc.](https://connect-api.veetal.app/)          |\n\n\n## **Conclusión**\nEn un sector tan competitivo, **el acceso a datos turísticos fiables marca la diferencia**. Dejar atrás el scraping manual y pasarse a una API especializada es clave.\n\nLa _Connect API de Veetal_ no solo resuelve las limitaciones del scraping, sino que aporta agilidad, precisión y respaldo humano. Con datos de vuelos y alojamientos actualizados, inteligencia sobre demanda de mercado y análisis de reputación, tu empresa podrá optimizar precios, mejorar el inventario y adelantarse a la competencia.\n\n¿Listo para potenciar tu inteligencia turística? **[Solicita una demo de Veetal Connect API](https://connect-api.veetal.app/commercial-meeting)** o agenda una reunión con nuestros expertos. Te mostraremos cómo integrar nuestra solución en minutos y dar el siguiente paso hacia una gestión de datos más eficiente y rentable. [Contáctanos hoy mismo y transforma tus operaciones con datos reales y confiables](https://connect-api.veetal.app/commercial-meeting).","¿Cansado del scraping? Descubre por qué una API es la clave para datos turísticos fiables","tourism-data-api-vs-scraping",[907],"recfWMkrYRj9HKyGN","Tired of scraping? Discover why an API is the key to reliable tourism data","Say goodbye to manual scraping. Tap into precise, always-up-to-date tourism data with an API that’s ready to integrate. Save time, cut costs and scale your business.\n","Di adiós al scraping manual. Accede a datos turísticos precisos y actualizados con una API lista para integrar. Ahorra tiempo, ahorra costes y escala tu negocio.\n","api-vs-scraping-datos-turisticos","2025-04-24","## **Why is it better to use an API than to scrape? Tourism data as a competitive advantage**\nThe tourism industry is being radically reshaped by data. Travel companies—agencies, OTAs, airlines, consultancies—are increasingly harnessing tourism intelligence by combining flight, accommodation, online-reputation and event data to improve decision-making. As _Smart Travel News_ notes, \"[artificial intelligence and data analytics are reshaping the global tourism industry.](https://www.smarttravel.news/tres-formas-en-que-la-ia-y-los-datos-estan-transformando-el-turismo/)\" Real-time tourism data for businesses—prices, occupancy, demand, ratings, and so on—lets them fine-tune commercial strategies, anticipate trends and optimise resources.\nTraditional practices such as web scraping (manually \"scraping\" pages) are now outdated: they deliver messy, incomplete or stale data. Agencies and platforms that still rely on manual scraping risk data reliability and operational sustainability. Modern, powerful API-driven solutions—like **Veetal's Connect API**—are the contemporary alternative to web scraping.\n## **Limitations of Traditional Web Scraping**\nWeb scraping has been popular for automating data extraction, but it poses major drawbacks for tourism:\n\n-**Dependence on website structure**\nScrapers rely on source HTML. A design tweak or structural change breaks the scraper and forces costly re-engineering.\n\n-**Access challenges and reliability issues**\nMany sites implement access management measures. Scrapers can be blocked or return incomplete data. Managing specialised technical infrastructure is expensive and never guarantees 100% uptime.\n\n-**Access challenges and reliability issues**\nWeb scraping presents significant operational complexities. As Kinsta explains, scrapers are vulnerable to site structure changes that break the pipeline and require constant maintenance. In tourism this is critical: many booking sites actively manage access to maintain service stability. These access management systems mean your scraper can become unreliable with minimal notice.\n\n-**Resources and maintenance**\nBuilding and running scrapers demands advanced skills (HTML analysis, error handling, storage). Every source-site change consumes new engineering time, and server/bandwidth costs mount.\n\n-**Irregular updates**\nScraping captures a static snapshot. Any later change—new prices, cancellations—requires another full scrape, making it hard to stay current.\n\nIn short, while scraping can be a quick fix in isolated cases, its reliability issues, high costs and operational complexities make it inefficient for businesses that need clean, continuously updated tourism data.\n\n## **Advantages of Using a Structured-Data API**\nBy contrast, a tourism-specific API offers multiple benefits:\n-**Clean, structured data**\nAPIs deliver information in standard formats (JSON, XML) that are ready to use—no HTML parsing or noise filtering required.\n\n-**Real-time freshness**\nCall an endpoint whenever you need current flight fares or hotel availability—no waiting for the next scrape cycle.\n\n-**Stability and security**\nOfficial APIs provide version control, documentation and predictable changes. Authenticated access and clear rate limits ensure operational reliability.\n\n-**Scalability and performance**\nAn API can deliver large data volumes in seconds without juggling parallel scrapers or multiple connections.\n\n-**Operational reliability and data quality**\nWith an official or licensed API, terms of use are explicit and data access respects privacy and IP regulations, providing clear contractual clarity and eliminating operational ambiguities.\n\nIn short, while scraping can be a quick fix in isolated cases, its reliability issues, high costs and operational complexities make it inefficient for businesses that need clean, continuously updated tourism data.\n\n## **Connecting with Veetal's Connect API**\nTo solve scraping's challenges, **Veetal** offers the **Connect API**, a modern solution built for the travel sector. It centralises leading data sources (Booking, Expedia, TripAdvisor, etc.) and delivers integrated datasets straight to your applications. As said by one of our customers:\n\n\"_What we value most about Veetal's Connect API is the peace of mind it gives us. We don't worry about running a dedicated scraping team or constant updates. Costs are low and externalised, so we can focus on what really matters: optimising our operations without the hassle._\"\n\nIn practice, Connect API lets you integrate flight, accommodation, pricing and other key metrics with just a few lines of code—or stream the information directly into your own infrastructure. Every client gets a dedicated human support agent, ensuring rapid, tailored configuration.\n\n### **Key Benefits of Connect API**\n- **Swift setup**: Connect API is ready to use immediately—no in-house scrapers or specialised technical infrastructure required. Veetal reports a 50% cut in development time.\n- **Specialised data**: Access tourism-specific datasets—flights, accommodation (prices, availability), local events, search trends and online-reputation metrics—all clean and analysis-ready.\n- **Comprehensive coverage**: A single API replaces multiple scrapers and sources, centralising and normalising everything under one roof.\n- **High reliability**: Data comes from official or certified processes, ensuring top-tier quality and freshness.\n- **Personalised support**: Each client works with a dedicated expert—no faceless forums or chatbots.\n\n## **Comparison: Manual Scraping vs Veetal Connect API**\n\n|             | Manual Scraping                                              | Veetal Connect API                                      |\n|--------------------|--------------------------------------------------------------|----------------------------------------------------------|\n| **Time-to-Market** | Slow; manual development & integration                        | Fast; plug-and-play in hours                             |\n| **Operating Costs**| High; in-house tech team needed                               | Low; pay-per-use                                         |\n| **Scalability**    | Limited; struggles as demand grows                            | Easy; extend to new markets or sources                   |\n| **Data Updates**   | Manual, sporadic, limited                                     | Always up-to-date                                       |\n| **Data Structure** | Inconsistent HTML; heavy cleaning                             | Consistent JSON/XML; analysis-ready                      |\n| **Maintenance**    | High; constant monitoring                                     | Minimal; handled by Veetal                               |\n| **Support**        | Generic or none                                               | Dedicated, personalised                                  |\n| **Reliability**    | Variable; breaks on site changes                              | High; validated & guaranteed                             |\n| **Data Variety**   | Limited to individual pages                                   | Wide: flights, accommodation, reputation, events…       |\n\n\n## **Conclusion**\nIn a fiercely competitive sector, access to reliable tourism data is decisive. Leaving manual scraping behind and switching to a specialised API is key. **Veetal's Connect API** not only eliminates scraping's limitations—it delivers agility, precision and human backup. With up-to-date flight and hotel data, demand intelligence and reputation analytics, your company can optimise pricing, improve inventory and stay ahead of the competition.\n\n**Ready to power up your tourism intelligence?**\n[Request a Veetal Connect API demo](https://connect-api.veetal.app/commercial-meeting) or schedule a meeting with our experts. We'll show you how to integrate our solution in minutes and take the next step toward more efficient, profitable data management. **[Contact us today and transform your operations with real, reliable data.](https://connect-api.veetal.app/commercial-meeting)**","Scraping tourism data is a full-time job in disguise.\n\nYou build the scraper. It breaks. You fix it. It breaks again.\n\nSites change. Formats change. You're always catching up.\nMeanwhile, your competitors are spending that time building product.\n\nA tourism data API gives you:\n→ Structured, normalized data from day one\n→ Real-time updates without manual maintenance\n→ Clean, authorized data access\n→ A single endpoint instead of 20 fragile scrapers\n\nWhy an API is the professional standard for reliable tourism data — full guide.\n\nLink in comments 👇\n\n#TravelTech #TourismData #API #WebScraping #TravelStartup",[916],{"filename":917},"tourism-data-api-vs-scraping-thumbnail.webp",{"id":919,"fields":920},"recdj2BeUTrL52p0V",{"Header":921,"Body_es":924,"Title_es":925,"Published":802,"Slug_en":926,"Author":927,"Title_en":928,"Summary_en":929,"Summary_es":930,"Slug_es":931,"Date":932,"Body_en":933,"LinkedIn post":934,"Thumbnail":935},[922],{"filename":923},"real-time-flight-api-2025-header.webp","## **Por qué las APIs de vuelos en tiempo real son esenciales en 2025**\nEn un mercado travel cada vez más dinámico, disponer de **datos aéreos en tiempo real** se ha vuelto imprescindible. \n\nLos viajeros esperan información instantánea sobre vuelos disponibles, horarios y rutas; las agencias y OTAs deben ofrecer respuestas inmediatas para seguir siendo competitivas. De hecho, grandes proveedores de tecnología de viajes ya destacaron este cambio: por ejemplo, en 2017 Sabre anunció _“[actualizaciones en tiempo real de cronogramas de vuelos](https://trafficamerican.com/sabre-primer-sistema-reservas-permite-los-agentes-actualizacion-tiempo-real/#:~:text=Sabre%20es%20el%20primer%20sistema,a%20los%20agentes%20de%20viajes)”_ para mejorar la precisión de sus reservas. \n\nEn este contexto, tres valores clave distinguen a una buena API de vuelos en tiempo real: **disponibilidad actualizada**, **horarios fiables** y **cobertura de rutas amplia**. Estas ventajas ayudan a evitar errores de reserva y a mejorar la experiencia del usuario. En las siguientes secciones analizaremos cada uno de estos beneficios, los retos comunes de las APIs genéricas y cómo la **[Connect API de Veetal](https://connect-api.veetal.app/)** ofrece una solución superior gracias a su integración sencilla, velocidad de respuesta y soporte personalizado.\n\n## **Ventajas para empresas travel al integrar una API de vuelos**\nLas APIs de vuelos en tiempo real abren nuevas posibilidades para las empresas del sector turístico. \nUna primera ventaja fundamental es la **disponibilidad actualizada**. Las plazas de un vuelo se venden y agotan continuamente, por lo que acceder a la información en vivo de cada aerolínea evita vender trayectos ya ocupados o perder oportunidades de venta. \n\nMuchas APIs del mercado ofrecen precisamente **“disponibilidad en tiempo real”**, lo que [permite consultar instantáneamente la disponibilidad de cada vuelo](https://apidog.com/es/blog/travel-apis-types-and-how-it-is-transforming-travel-applications-4/). De este modo, la agencia siempre muestra solo vuelos con plazas reales, mejorando la confianza de los clientes. \n\nAdemás, al contar con datos frescos, es posible automatizar alertas cuando cambian las disponibilidades, reduciendo la sobreventa y optimizando la gestión de inventario.\n\nOtro pilar importante es ofrecer **horarios fiables**. Las plataformas de reservas deben mostrar con precisión los horarios de salida, llegada y posibles cancelaciones. Incluso pequeñas modificaciones en el itinerario pueden confundir al pasajero si no se comunican de inmediato. En la práctica, los sistemas de información en aeropuertos (FIDS) ya utilizan APIs que actualizan los datos de vuelos en pantalla al instante. \n\nPor ejemplo, una solución de señalización digital para el Aeropuerto Trenton-Mercer se integra con APIs de vuelos y muestra en vivo las llegadas y salidas, cambios de puerta, retrasos o cancelaciones de [varias aerolíneas](https://www.digitalavmagazine.com/2019/05/21/el-aeropuerto-trenton-mercer-mejora-la-comunicacion-con-los-viajeros-con-mvix/#:~:text=El%20enfoque%20central%20de%20este,cancelaciones%2C%20retrasos%2C%20n%C3%BAmeros%20de%20puertas). \n\nEste caso ilustra cómo las **actualizaciones en tiempo real** de horarios facilitan la experiencia de viaje: los pasajeros ven siempre la información correcta, y las agencias pueden garantizar itinerarios precisos. \n\nEn suma, una **API de horarios de vuelos** fiable permite reaccionar rápido ante cambios, mejorar la puntualidad percibida y reducir la carga de trabajo manual al gestionar vuelos.\n\nFinalmente, la **cobertura de rutas** es un factor crítico. Una buena API de vuelos en tiempo real debe incluir datos de rutas globales para que la plataforma pueda ofrecer opciones de viaje en todo el mundo. En la práctica, existen API de vuelo que agrupan información de cientos de aerolíneas internacionales. Por ejemplo, FlightGlobal (una fuente líder de datos aéreos) proporciona cronogramas de más de **900 aerolíneas a nivel mundial**. Esto demuestra que es posible cubrir prácticamente cualquier destino. Al integrar estas fuentes en una API unificada, las empresas travel amplían su alcance de rutas sin tener que negociar con cada aerolínea individualmente. \n\nCon esta cobertura global, las plataformas pueden mostrar todas las combinaciones de vuelo relevantes y adaptar rápidamente su oferta si surge una ruta nueva o cambia el itinerario. \n\nEn conjunto, las tres ventajas clave – **horarios siempre actualizados** y **acceso a rutas globales** – permiten que una agencia o OTA mejore su servicio. Los usuarios encuentran vuelos válidos con mayor facilidad y la operación interna se hace más eficiente, ya que todo se consulta dinámicamente en lugar de depender de catálogos estáticos.\n\n## **Principales retos con APIs de terceros**\nAunque las ventajas son claras, muchas soluciones de API genéricas presentan desafíos reales que las empresas deben considerar. Uno de los más comunes son las **integraciones complejas**. \n\nLos proveedores tradicionales suelen conectarse con sistemas legados (como GDS antiguos o bases de datos internas) que no fueron diseñados para interoperar de forma sencilla. VerificadoMarketReports señala que _“la complejidad y el costo de integrar herramientas avanzadas… con la infraestructura existente pueden disuadir”_ [a las aerolíneas](https://www.verifiedmarketreports.com/es/product/flight-scheduling-software-market/#:~:text=,infraestructura%20existente%20pueden%20disuadir%20la). \n\nEn la práctica, esto significa que un desarrollador puede enfrentarse a un proceso tedioso para mapear datos distintos, configurar autenticaciones especiales y mantener adaptadores cada vez que cambian los sistemas. Paradójicamente, algunos proveedores de APIs de vuelo publicitan su **“API fácil de usar”**, prometiendo una _“[integración perfecta](https://es.airnavradar.com/blog/airnav-radarbox-on-demand-api-airspace-data)”_; sin embargo, en muchos casos esas garantías se quedan cortas cuando cada cliente requiere adaptaciones específicas. \n\nTodo ello puede retrasar el proyecto e incrementar costos de desarrollo.\n\nOtro reto habitual es el **soporte genérico**. Cuando una agencia se topa con un problema técnico o una consulta específica, el proveedor de la API puede ofrecer un soporte poco personalizado. En ocasiones el servicio de atención es un centro de llamadas global, con respuestas estándar para todos los clientes. \n\nEsto contrasta con situaciones en que se requiere un trato dedicado: por ejemplo, tener un contacto técnico familiarizado con la aplicación de la agencia puede marcar la diferencia para resolver incidencias rápidamente. Por tanto, la falta de un soporte adaptado al negocio del cliente es un punto débil que las empresas desean evitar.\n\nFinalmente, la **latencia elevada** es otro inconveniente crítico. Algunas APIs de vuelo tardan demasiado en responder debido a procesos complejos de agregación de datos o a infraestructuras saturadas. Para ofrecer una experiencia en _“casi tiempo real”_ es necesario que el sistema responda en milisegundos. Si la latencia es alta, los resultados de búsqueda pueden llegar con retardos o contener datos obsoletos. \n\nEn el contexto actual, donde hasta los teléfonos móviles entregan información al instante, un retraso perceptible puede hacer perder clientes. En resumen, las principales dificultades con APIs de terceros suelen ser la integración complicada con sistemas legados, el soporte poco personalizado, y la velocidad de respuesta insuficiente.\n\n## **Connect API de Veetal: solución moderna y sencilla**\nFrente a estos retos, la **Connect API de Veetal** surge como una alternativa moderna, diseñada específicamente para resolverlos. \n\nEn primer lugar, la **integración sencilla** es uno de sus pilares. Veetal proporciona documentación clara y abundantes SDKs de apoyo para varios lenguajes, de modo que los desarrolladores pueden incorporar la API a su plataforma [con solo unas pocas líneas de código](https://connect-api.veetal.app/). \nDe hecho, la propia conectividad de la Connect API está pensada para ser ultrarrápida: como indica Veetal, se puede _“acceder a datos en actualizados con solo unas pocas líneas de código”_. \nEsto significa que una agencia o OTA puede comenzar a consumir la API en segundos, sin perder semanas en complejas configuraciones. Además, Veetal puede desplegar infraestructura dedicada para cada cliente (por ejemplo, enviar datos directamente al centro de datos del cliente), lo que minimiza la latencia y facilita una integración de datos eficiente.\n\nEn segundo lugar, la **velocidad de respuesta y precisión de los datos** de la Connect API es sobresaliente. Veetal recopila información de vuelo de múltiples proveedores líderes y la entrega actualizada al instante. \nEsto garantiza que los resultados contengan la disponibilidad real de cada trayecto, los últimos horarios de despegue/aterrizaje y todas las rutas vigentes. Gracias a su arquitectura optimizada, las solicitudes se atienden en milisegundos, prácticamente en _“tiempo real”_, evitando retrasos en la búsqueda de vuelos. \nLa Connect API está diseñada para manejar grandes volúmenes de consultas sin degradar el rendimiento, algo esencial cuando hay miles de usuarios buscando vuelos simultáneamente.\n\nPor último, Veetal ofrece un **soporte totalmente personalizado**. \nA diferencia de proveedores con servicio genérico, Veetal asigna un **agente dedicado por cliente**. Esto significa que cada agencia recibe atención prioritaria y especializada, con un interlocutor técnico que conoce su caso concreto. \n\nDe esta forma, cualquier duda o incidencia se resuelve de manera más ágil y eficaz. El equipo de Veetal colabora de cerca con cada empresa para adaptar la Connect API a sus necesidades, desde la configuración inicial hasta el soporte operativo diario. \n\nEn resumen, la Connect API combina integración plug-and-play con datos ultra actualizados y un trato humano a medida, cubriendo así las expectativas más exigentes del sector turístico.\n\n## **Comparativa razonada con otras soluciones**\nEn el mercado existen otras soluciones de datos de vuelo, pero es importante evaluar sus enfoques sin caer en descalificaciones directas. \n\nLos sistemas tradicionales como Sabre o Amadeus (los GDS históricos) ofrecen datos de vuelos, pero fueron concebidos hace décadas y requieren procesos de integración más largos. Empresas como FlightAware o Cirium brindan APIs potentes, pero suelen estructurar el soporte y la facturación de forma masiva, con planes por consulta que pueden resultar inflexibles para cada cliente. \n\nAlgunas startups ofrecen APIs de vuelo independientes, pero muchas de ellas se apoyan aún en datos programados o carecen de cobertura total de rutas. \n\nEn contraste, la Connect API de Veetal está pensada como una solución **nativa cloud API-first**, donde la facilidad de integración y la calidad del servicio son prioridades desde el diseño. \n\nAdemás, Veetal busca estar siempre al día con las fuentes de datos, de modo que incorpora nuevas aerolíneas o cambios legales sin que el cliente tenga que gestionar esas actualizaciones. Así, aunque hay múltiples proveedores de APIs de vuelos, Connect API destaca por aunar velocidad, amplitud de datos y atención dedicada, lo que la convierte en una alternativa moderna y competitiva en el panorama actual.\n\n## **Conclusión**\nEn 2025, las empresas del sector turístico no pueden prescindir de APIs de vuelos en tiempo real si quieren mantener su ventaja competitiva. \n\nContar con **disponibilidad actualizada de vuelos**, **horarios fiables siempre al día** y **cobertura global de rutas** no es un lujo sino una necesidad operativa. Superar los retos de integración, soporte y latencia exige acudir a soluciones diseñadas específicamente para el mundo del turismo. \n\nEn este sentido, la **[Connect API de Veetal](https://connect-api.veetal.app/)** ofrece precisamente eso: una _integración sencilla de datos de vuelos_, alta precisión en los datos actualizados al instante y soporte personalizado para cada cliente. \nSi quieres mejorar tu plataforma de reservas y ofrecer a tus usuarios la mejor experiencia posible, vale la pena probar Connect API. Visita ahora [Veetal Connect API](https://www.veetal.app/) para solicitar una prueba gratuita y descubre cómo puede transformar tu negocio de viajes.\n","API de vuelos en tiempo real en 2025: por qué tu plataforma travel la necesita","real-time-flight-api-2025",[907],"Real-time flight API in 2025: why your travel platform needs it","Discover why a real-time flight API is essential in 2025 for displaying reliable fares, schedules and global routes. Easily integrate data with Veetal Connect API.\n","Descubre por qué una API de vuelos en tiempo real es esencial en 2025 para mostrar tarifas, horarios fiables y rutas globales. Integra datos fácilmente con Veetal Connect API.","api-vuelos-tiempo-real-2025","2025-05-06","## **Why real-time flight APIs are essential in 2025**\nIn an increasingly dynamic travel market, having real-time air-data has become indispensable. Travellers expect instant information on available flights, schedules and routes; agencies and OTAs must deliver immediate answers to stay competitive. Large travel-tech providers flagged this shift years ago—back in 2017 **Sabre** announced “real-time flight-schedule updates” to make its bookings more accurate.\nThree key values now set a good real-time flight API apart: **up-to-date availability, reliable schedules and broad route coverage**. These advantages help prevent booking errors and improve user experience. The following sections examine each benefit, the common hurdles with generic APIs, and how **[Veetal’s Connect API](https://connect-api.veetal.app/)** offers a superior solution through easy integration, fast response times and personalised support.\n\n## **Business Benefits of Integrating a Flight API**\nReal-time flight APIs unlock new possibilities for tourism businesses.\n\n### **1. Up-to-date availability**\nSeats sell out constantly, so live airline data prevents you from selling flights that are already full—or missing potential sales. Many APIs on the market provide **real-time seat availability**, [letting agencies show only flights with real inventory](https://apidog.com/es/blog/travel-apis-types-and-how-it-is-transforming-travel-applications-4/), boosting customer trust. Fresh data also enables automated alerts when availability changes, reducing over-selling and optimising inventory management.\n\n### **2. Reliable schedules**\nBooking platforms must show precise departure, arrival and cancellation times. Even small itinerary tweaks confuse passengers if not communicated instantly. Airport information systems (FIDS) already rely on APIs to update on-screen flight data in real time. For instance, a digital-signage solution at **Trenton–Mercer Airport** [integrates flight APIs to show live arrivals, departures, gate changes, delays or cancellations across multiple airlines](https://www.mvix.com/case-studies/trenton-mercer-airport). This illustrates how real-time schedule updates ease the travel experience: passengers always see the correct info and agencies can guarantee accurate itineraries. A reliable schedule API means faster reactions to changes, better perceived punctuality and less manual workload.\n\n### **3. Global route coverage**\nA solid real-time flight API must include worldwide route data so your platform can offer travel options everywhere. Some APIs aggregate schedules from hundreds of international airlines—**FlightGlobal**, for example, covers timetables for 900 + carriers worldwide. Unifying such sources in a single API lets travel companies broaden route reach without negotiating individually with each airline. With global coverage, platforms can show every relevant flight combination and swiftly adapt if a new route appears or an itinerary changes.\nTogether, these three advantages—live availability, reliable schedules and global route access—let agencies and OTAs deliver stronger service. Users find valid flights more easily and operations become more efficient because everything is queried dynamically instead of relying on static catalogues.\n\n## **Main Challenges with Third-Party APIs**\nDespite the benefits, many generic API solutions create real hurdles.\n\n### **Complex integrations**\nTraditional providers often tie into legacy systems (old GDSs or internal databases) that were never meant to interoperate smoothly. **Verified Market Reports** notes that “[the complexity and cost of integrating advanced tools… with existing infrastructure can deter airlines](https://www.verifiedmarketreports.com/product/flight-scheduling-software-market/#:~:text=,infraestructura%20existente%20pueden%20disuadir%20la).” In practice, developers face tedious work mapping disparate data, configuring special authentication and maintaining adapters whenever systems change—even when a provider advertises an “[easy-to-use API](https://www.airnavradar.com/blog/airnav-radarbox-on-demand-api-airspace-data)”.\n\n### **Generic support**\nWhen an agency hits a technical snag, the API provider may only offer one-size-fits-all support—global call centres with standard replies. Yet a dedicated contact who knows the agency’s implementation can be crucial for quick issue resolution. Lack of tailored support is a clear weak point.\n\n### **High latency**\nSome flight APIs respond too slowly because of heavy data-aggregation pipelines or overloaded infrastructure. For a “near real-time” experience results must come back in milliseconds; otherwise searches feel sluggish or contain stale data. In today’s instant-information world, noticeable delay costs bookings.\nIn short, common problems with third-party flight APIs include **complex legacy integration, impersonal support and inadequate response speed**.\n\n## **Veetal Connect API: A Modern, Straightforward Solution**\n**Veetal’s Connect API** tackles these challenges head-on.\n\n### **Easy integration**\nVeetal supplies clear documentation and multiple SDKs, so developers can plug the API [into their platform with just a few lines of code](https://connect-api.veetal.app/). The connectivity is designed to be ultra-fast: you can “access up-to-date data with just a few lines of code”. Veetal can even deploy dedicated infrastructure—e.g. pushing data straight into the client’s data centre—minimising latency and streamlining data flow.\n\n### **Lightning response & data accuracy**\nConnect API merges flight information from leading providers and delivers it instantly. Results always reflect the real seat inventory, latest departure/arrival times and every active route. Thanks to an optimised architecture, requests are served in milliseconds, truly “real time”, and the API handles high traffic without performance loss—crucial when thousands of users search simultaneously.\n\n### **Fully personalised support**\nUnlike suppliers with generic service, Veetal assigns each client a dedicated agent. Agencies get priority, specialised help from someone who understands their specific case. Veetal collaborates closely from initial setup to day-to-day operations, adapting Connect API to each customer’s needs.\nIn short, Connect API combines **plug-and-play integration, ultra-fresh data and tailored human support**, meeting the travel sector’s highest expectations.\n\n## **Reasoned Comparison with Other Solutions**\nSeveral other flight-data solutions exist, but their approaches differ:\n- **Legacy GDSs** like Sabre or Amadeus provide flight data but were conceived decades ago and usually involve longer integration projects.\n- **Data leaders** such as FlightAware or Cirium deliver powerful APIs, yet their one-size pricing and support models can feel inflexible.\n- **Start-ups** offer stand-alone flight APIs, but many still rely on scheduled data or lack full route coverage.\n\nBy contrast, Veetal’s **cloud-native, API-first** Connect API prioritises integration ease and service quality from the outset. Veetal keeps data sources current, adding new airlines or regulatory changes without burdening the client. This blend of speed, breadth and dedicated attention makes Connect API a modern, competitive option.\n\n## **Conclusion**\nIn 2025, travel businesses cannot afford to skip real-time flight APIs if they want to stay ahead. Live seat availability, always-accurate schedules and global route coverage are operational necessities, not luxuries. Overcoming integration, support and latency hurdles requires solutions purpose-built for tourism—and **[Veetal’s Connect API](https://connect-api.veetal.app/)** delivers exactly that: simple flight-data integration, instant accuracy and bespoke support.\nIf you aim to improve your booking platform and give users the best possible experience, **it’s worth trying Connect API**. [Visit **Veetal Connect API** now to request a free trial and see how it can transform your travel business](https://connect-api.veetal.app/commercial-meeting).\n","Flight data is perishable. Stale by design.\n\nA fare that was €89 at 9am is €134 at 9:15am.\nA schedule that was accurate yesterday is cancelled today.\n\nIf your travel platform isn't showing real-time flight data, you're not showing flight data — you're showing history.\n\nWhat a real-time flight API delivers:\n→ Live fares and availability\n→ Global route coverage\n→ Schedule updates as they happen\n→ One integration, maintained by us — not your team\n\nWhy your travel platform needs it in 2025 — full breakdown.\n\nLink in comments 👇\n\n#FlightData #TravelTech #API #Aviation #TravelStartup",[936],{"filename":937},"real-time-flight-api-2025-thumbnail.webp",{"id":939,"fields":940},"receQ9UE5IPdS3eYM",{"Header":941,"Body_es":944,"Title_es":945,"Published":802,"Slug_en":946,"Author":947,"Title_en":948,"Summary_en":949,"Summary_es":950,"Slug_es":951,"Date":952,"Body_en":953,"LinkedIn post":954,"Thumbnail":955},[942],{"filename":943},"what-is-rate-parity-header.webp","Un hotel lista una habitación a 140€ en su propia web. La misma habitación aparece en Booking.com a 119€.\n\nEsto es una violación de paridad de tarifas — y es uno de los problemas más comunes y costosos en la gestión de ingresos hoteleros. Sin embargo, la mayoría de los directores generales solo descubren los problemas de paridad semanas después de que ya hayan dañado su canal directo.\n\nEsta guía explica exactamente qué es la paridad de tarifas, por qué importa, cómo ocurren las violaciones y cómo los equipos de revenue modernos la monitorizan y la aplican automáticamente.\n\n## ¿Qué Es la Paridad de Tarifas?\n\nLa paridad de tarifas es un acuerdo contractual entre un hotel y una OTA (Agencia de Viajes Online) que obliga al hotel a ofrecer el mismo precio — o uno superior — en otros canales respecto al que ofrece en esa OTA.\n\nEn términos prácticos: si tu habitación está listada a 150€ en Booking.com, las cláusulas de paridad de tarifas normalmente te impiden anunciar una tarifa más baja en Expedia, en tu propia web o en cualquier otro canal público.\n\nLa lógica, desde la perspectiva de la OTA, es simple: han invertido en marketing, tecnología y captación de clientes. No quieren que los hoteles desvíen reservas una vez que los clientes descubren la propiedad a través de la plataforma de la OTA.\n\n## Tipos de Cláusulas de Paridad de Tarifas\n\nNo todos los acuerdos de paridad de tarifas son iguales. Entender la diferencia importa para tu estrategia de distribución.\n\n### Paridad estricta (o estrecha)\nEl hotel debe ofrecer a la OTA la misma tarifa o inferior en todos los canales públicos, incluyendo la web directa del hotel. Es la forma más restrictiva y ha sido objeto de escrutinio regulatorio en varios países europeos.\n\n### Paridad flexible (o amplia)\nEl hotel puede ofrecer tarifas más bajas en su propia web directa y a través de programas de fidelización, pero debe mantener la paridad en todos los canales OTA. Cada vez más hoteles negocian hacia este modelo tras los cambios regulatorios en Francia, Alemania, Italia y Austria.\n\n### Paridad de Mejor Tarifa Disponible (BAR)\nEl hotel garantiza a la OTA la mejor tarifa disponible públicamente. Similar a la paridad estricta pero a veces se aplica de forma más acotada.\n\n## Por Qué las Violaciones de Paridad Son Más Comunes de Lo Que Crees\n\nLa mayoría de los hoteles no violan la paridad de tarifas intencionalmente. Las violaciones suelen ocurrir por:\n\n**Errores de pricing dinámico.** Los sistemas de revenue management que ajustan tarifas automáticamente pueden crear discrepancias de paridad temporales, especialmente entre múltiples canales con diferentes frecuencias de actualización.\n\n**Promociones y descuentos.** Una venta flash o un descuento para miembros aplicado en un canal sin actualizar los demás crea violaciones instantáneas.\n\n**Conversión de divisas.** Cuando las tarifas se establecen en una moneda y se convierten entre canales, las diferencias de redondeo pueden crear aparentes violaciones de paridad.\n\n**Revendedores de terceros.** Los mayoristas y bed banks a veces venden inventario hotelero por debajo de la tarifa acordada, creando violaciones que están fuera del control directo del hotel pero de las que sigue siendo contractualmente responsable.\n\n**Retrasos del sistema.** Cuando una actualización de tarifa se aplica en el PMS pero aún no se ha propagado a todos los canales OTA conectados, hay una ventana de violación de paridad.\n\n## El Impacto en el Negocio de las Violaciones de Paridad\n\n### Para los hoteles\nLas violaciones de paridad de tarifas dañan el canal directo. Cuando las OTAs muestran sistemáticamente precios más bajos, los huéspedes aprenden a consultar siempre las OTAs primero — incluso para propiedades que conocen y en las que confían. El hotel paga comisión OTA por reservas que podrían haber sido directas.\n\nLas violaciones también pueden activar cláusulas de penalización en los contratos con OTAs, incluyendo la depriorización en los rankings de búsqueda de Booking.com o Expedia — lo que puede tener un impacto significativo en la visibilidad y la ocupación.\n\n### Para los revenue managers\nLas violaciones de paridad no descubiertas hacen que los datos de ingresos no sean fiables. Si los datos de precios de competidores muestran discrepancias que parecen movimientos de mercado, pero que en realidad son violaciones de paridad, las decisiones de pricing basadas en esos datos serán erróneas.\n\n## Cómo Monitorizar la Paridad de Tarifas\n\n### Monitorización manual (no recomendada)\nComprobar manualmente tus propias tarifas en todos los canales es lento y poco fiable. Detecta violaciones después de que hayan ocurrido, no en tiempo real.\n\n### Monitorización automatizada de paridad vía API\nLos equipos de revenue modernos usan APIs de datos en tiempo real para monitorizar la paridad automáticamente. Así funciona:\n\n1. **Configura tu hotel y canales.** Define qué OTAs y canales directos monitorizar.\n2. **Configura la recopilación continua de tarifas.** La API recoge tus tarifas y las de tus competidores en todos los canales de forma programada o en tiempo real.\n3. **Detecta discrepancias automáticamente.** El sistema marca cuando cualquier canal muestra una tarifa por debajo de tu umbral de paridad definido.\n4. **Alerta y corrige.** Se envían alertas al revenue manager, que puede corregir la violación antes de que genere un daño significativo.\n\nLos datasets de [datos de tarifas hoteleras](/dataset/hotel-rates) y [precios de competidores](/dataset/hotel-competitors) de Veetal Connect están diseñados específicamente para este caso de uso — proporcionando a los equipos de revenue visibilidad en tiempo real en todos los canales desde una única integración.\n\n## Paridad de Tarifas vs. Revenue Management: Encontrar el Equilibrio\n\nLa paridad estricta de tarifas puede entrar en conflicto con una buena gestión de ingresos. Si estás obligado a mostrar el mismo precio en todos los canales públicos, pierdes la capacidad de usar el pricing específico por canal como herramienta estratégica.\n\nLa tendencia en los mercados europeos avanza hacia acuerdos de paridad más flexibles que permiten descuentos en la web directa. Si actualmente estás sujeto a paridad estricta, merece la pena revisar tus contratos con OTAs — especialmente dado que los reguladores de varios países de la UE han dictaminado que las cláusulas de paridad estricta son anticompetitivas.\n\n**Estrategias que funcionan dentro de las restricciones de paridad:**\n- Tarifas de programa de fidelización (generalmente exentas de las cláusulas de paridad)\n- Paquetes y ofertas combinadas (habitación + desayuno, habitación + parking)\n- Ofertas de última hora comunicadas por email o CRM\n- Tarifas exclusivas para miembros en tu web directa\n\n## FAQ\n\n**¿Es la paridad de tarifas un requisito legal?**\nNo. La paridad de tarifas es una obligación contractual, no un requisito legal. La legalidad de las cláusulas de paridad estricta ha sido cuestionada en varios países europeos, y algunas jurisdicciones han restringido o prohibido su uso.\n\n**¿Puedo ofrecer tarifas más bajas a miembros de fidelización?**\nGeneralmente sí. La mayoría de los acuerdos de paridad con OTAs eximen las tarifas de programas de fidelización o descuentos directos para miembros, ya que no son visibles públicamente para todos los usuarios.\n\n**¿Qué pasa si violo la paridad de tarifas?**\nLas consecuencias varían según el contrato y la OTA. Las penalizaciones comunes incluyen: advertencias y solicitudes de corrección, depriorización temporal en los resultados de búsqueda, aumentos de comisión o, en casos graves, rescisión del contrato.\n\n**¿Con qué frecuencia debería comprobar mis tarifas para cumplimiento de paridad?**\nPara una gestión activa de ingresos, la monitorización de tarifas debería ser continua o al menos cada hora. Las comprobaciones diarias puntuales son insuficientes para hoteles con estrategias de pricing dinámico.\n\n## Conclusión\n\nLa paridad de tarifas es uno de los aspectos más malentendidos y menos monitorizados de la distribución hotelera. Las violaciones ocurren constantemente — a menudo sin que el hotel se dé cuenta — y el impacto acumulado en el canal directo puede ser significativo.\n\nLa solución es la monitorización automatizada en tiempo real en todos los canales. Con la API de datos adecuada, el cumplimiento de la paridad se convierte en un proceso de fondo en lugar de un dolor de cabeza manual.\n\n[Explora los datos de tarifas hoteleras de Veetal Connect](/dataset/hotel-rates) para ver cómo funciona la monitorización automatizada de paridad en la práctica.","¿Qué es la Paridad de Tarifas? Guía Completa para Hoteles","what-is-rate-parity",[826],"What Is Rate Parity? A Complete Guide for Hotels","Rate parity is the agreement between hotels and OTAs that prevents hotels from offering lower prices on other channels. This guide explains what it means, why violations are more common than you think, and how modern revenue teams use data APIs to monitor parity automatically.","La paridad de tarifas es el acuerdo entre hoteles y OTAs que impide ofrecer precios más bajos en otros canales. Esta guía explica qué significa, por qué las violaciones son más comunes de lo que crees y cómo monitorizarla automáticamente.","que-es-la-paridad-de-tarifas","2026-04-01","A hotel lists a room at €140 on its own website. The same room appears on Booking.com for €119.\n\nThis is a rate parity violation — and it's one of the most common and costly problems in hotel revenue management. Yet most general managers only discover parity issues weeks after they've already damaged their direct channel.\n\nThis guide explains exactly what rate parity is, why it matters, how violations happen, and how modern revenue teams monitor and enforce it automatically.\n\n## What Is Rate Parity?\n\nRate parity is a contractual agreement between a hotel and an OTA (Online Travel Agency) that requires the hotel to offer the same price — or a higher price — on other channels compared to what it offers on that OTA.\n\nIn practical terms: if your room is listed at €150 on Booking.com, rate parity clauses typically prevent you from advertising a lower rate on Expedia, on your own website, or on any other public channel.\n\nThe logic, from the OTA's perspective, is simple: they've invested in marketing, technology, and customer acquisition. They don't want hotels to funnel bookings away once customers discover the property through the OTA's platform.\n\n## Types of Rate Parity Clauses\n\nNot all rate parity agreements are the same. Understanding the difference matters for your distribution strategy.\n\n### Strict (or narrow) rate parity\nThe hotel must offer the OTA the same or lower rate across all public channels, including the hotel's own direct website. This is the most restrictive form and has faced regulatory scrutiny in several European countries.\n\n### Flexible (or wide) rate parity\nThe hotel can offer lower rates on its own direct website and through loyalty programs, but must maintain parity across all OTA channels. More hotels are negotiating toward this model following regulatory changes in France, Germany, Italy, and Austria.\n\n### Best Available Rate (BAR) parity\nThe hotel guarantees the OTA the best publicly available rate. Similar to strict parity but sometimes applied more narrowly.\n\n## Why Rate Parity Violations Are More Common Than You Think\n\nMost hotels don't violate rate parity intentionally. Violations typically happen due to:\n\n**Dynamic pricing errors.** Revenue management systems that adjust rates automatically can create temporary parity discrepancies, especially across multiple channels with different update frequencies.\n\n**Promotions and discounts.** A flash sale or member discount applied on one channel without updating others creates instant violations.\n\n**Currency conversion.** When rates are set in one currency and converted across channels, rounding differences can create apparent parity violations.\n\n**Third-party resellers.** Wholesalers and bed banks sometimes sell hotel inventory below the agreed rate, creating violations that are outside the hotel's direct control but for which they are still contractually responsible.\n\n**System delays.** When a rate update is applied in the PMS but hasn't yet propagated to all connected OTA channels, there's a window of parity violation.\n\n## The Business Impact of Rate Parity Violations\n\n### For hotels\nRate parity violations damage the direct channel. When OTAs consistently show lower prices, guests learn to always check OTAs first — even for properties they know and trust. The hotel pays OTA commission on bookings that could have been direct.\n\nViolations can also trigger penalty clauses in OTA contracts, including deprioritization in search rankings on Booking.com or Expedia — which can have a significant impact on visibility and occupancy.\n\n### For revenue managers\nUndiscovered parity violations make revenue data unreliable. If competitor pricing data shows discrepancies that seem like market movements, but are actually parity violations, pricing decisions based on that data will be flawed.\n\n## How to Monitor Rate Parity\n\n### Manual monitoring (not recommended)\nSpotchecking your own rates across channels manually is time-consuming and unreliable. It catches violations after the fact, not in real time.\n\n### Automated parity monitoring via API\nModern revenue teams use real-time data APIs to monitor parity automatically. Here's how it works:\n\n1. **Configure your hotel and channels.** Define which OTAs and direct channels to monitor.\n2. **Set up continuous rate collection.** The API collects your rates and your competitors' rates across all channels on a scheduled or real-time basis.\n3. **Detect discrepancies automatically.** The system flags when any channel shows a rate below your defined parity threshold.\n4. **Alert and correct.** Alerts are sent to the revenue manager, who can correct the violation before it creates significant damage.\n\nVeetal Connect's [hotel rate data API](/dataset/hotel-rates) and [competitor pricing](/dataset/hotel-competitors) datasets are designed specifically for this use case — giving revenue teams real-time visibility across all channels from a single integration.\n\n## Rate Parity vs. Revenue Management: Finding the Balance\n\nStrict rate parity can conflict with good revenue management. If you're required to show the same price on all public channels, you lose the ability to use channel-specific pricing as a strategic tool.\n\nThe trend in European markets is moving toward more flexible parity agreements that allow direct website discounts. If you're currently locked into strict parity, it's worth reviewing your OTA contracts — especially given that regulators in multiple EU countries have ruled that strict parity clauses are anticompetitive.\n\n**Strategies that work within parity constraints:**\n- Loyalty program rates (typically exempt from parity clauses)\n- Packages and bundled offers (room + breakfast, room + parking)\n- Last-minute deals communicated through email or CRM\n- Member-only rates on your direct website\n\n## FAQ\n\n**Is rate parity legally required?**\nNo. Rate parity is a contractual obligation, not a legal requirement. The legality of strict parity clauses has been challenged in several European countries, and some jurisdictions have restricted or banned their use.\n\n**Can I offer lower rates to loyalty members?**\nTypically yes. Most OTA parity agreements exempt loyalty program rates or direct member discounts, as these are not publicly visible to all users.\n\n**What happens if I violate rate parity?**\nConsequences vary by contract and OTA. Common penalties include: warnings and requests to correct, temporary deprioritization in search results, commission increases, or in severe cases, contract termination.\n\n**How often should I check my rates for parity compliance?**\nFor active revenue management, rate monitoring should happen continuously or at least hourly. Daily spot-checks are insufficient for hotels with dynamic pricing strategies.\n\n## Conclusion\n\nRate parity is one of the most misunderstood and under-monitored aspects of hotel distribution. Violations happen constantly — often without the hotel even realizing it — and the cumulative impact on the direct channel can be significant.\n\nThe solution is automated, real-time monitoring across all channels. With the right data API in place, parity compliance becomes a background process rather than a manual headache.\n\n[Explore Veetal Connect's hotel rate data](/dataset/hotel-rates) to see how automated parity monitoring works in practice.","If you're a revenue manager not monitoring rate parity in real time — you're losing direct bookings every day.\n\nThe math:\n→ Guest finds your room at €150 on your website\n→ Checks Booking.com: €135\n→ Books through the OTA\n→ You pay 18% commission on a booking that could have been free\n\nThis happens at scale. Every day. And most teams don't catch it until the quarterly review.\n\nWhat fixes it: structured rate and competitor data feeds that show your own rates across every OTA channel — and flag disparities automatically.\n\nWe wrote the complete guide to rate parity. Link in comments 👇\n\n#RevenueManagement #HotelTech #RateParity #OTA #HospitalityTech",[956],{"filename":957},"what-is-rate-parity-thumbnail.webp",{"id":959,"fields":960},"recq1GMD5x1SMzWEO",{"Header":961,"Body_es":964,"Title_es":965,"Published":802,"Slug_en":966,"Author":967,"Title_en":968,"Summary_en":969,"Summary_es":970,"Slug_es":971,"Date":972,"Body_en":973,"LinkedIn post":974,"Thumbnail":975},[962],{"filename":963},"flight-price-tracking-2025-api-header.webp","## **Cómo hacer seguimiento de precios de vuelos en 2025 (y por qué Connect API es la mejor opción)**\n## **Introducción**\nEn el mundo acelerado del sector travel, [el _timing_ lo es todo](https://www.sciencedirect.com/science/article/pii/S0022247X1930486X). Tanto si eres una agencia de viajes, una plataforma de metabúsqueda o un sistema de reservas, saber cómo y cuándo cambian los precios de los vuelos puede marcar la diferencia entre cerrar una venta o perderla frente a la competencia.\nPero hacer un seguimiento efectivo de los precios de los vuelos —con precisión, actualizado y a gran escala— no siempre es fácil. Por suerte, en 2025, nuevas herramientas y tecnologías están haciendo que sea mucho más accesible.\nEn este artículo te explicamos cómo monitorizar los precios de vuelos de forma eficiente, y por qué la **Connect API de Veetal** es un gran aliado para las empresas que quieren integrar datos de vuelos de forma ágil, fiable y con soporte personalizado.\n\n## **Por qué es importante hacer seguimiento de precios en 2025**\nEl precio de los vuelos [es más dinámico que nunca](https://www.econometricsociety.org/publications/econometrica/2022/03/01/welfare-effects-dynamic-pricing-evidence-airline-markets). Las aerolíneas [ajustan las tarifas constantemente según la demanda, la temporada, la competencia o factores externos](https://dspace.mit.edu/handle/1721.1/128436) como el precio del combustible o eventos geopolíticos.\nPara las empresas del sector travel, poder seguir estos cambios significa:\n- Conseguir mejores tarifas para tus usuarios.\n- Generar alertas de precios o campañas automatizadas basadas en fluctuaciones.\n- Ofrecer recomendaciones actualizadas y más inteligentes.\n- Mejorar márgenes gracias a estrategias de reventa predictiva.\n\n**En resumen: anticiparte a los precios de los vuelos es anticiparte al mercado.**\n\n### **Métodos para seguir los precios de los vuelos**\n\nExisten tres métodos principales que utilizan las empresas para monitorizar tarifas aéreas:\n\n1. **Seguimiento manual**: Consiste en visitar portales de aerolíneas u OTAs uno a uno para registrar precios. Es un método lento, propenso a errores y completamente inviable cuando se requiere trabajar con grandes volúmenes de datos o múltiples rutas.\n2. **Desarrollar un sistema propio de scraping**: Implica montar y mantener una infraestructura técnica interna para extraer datos directamente desde webs públicas. Este enfoque **requiere un equipo dedicado**, es **costoso en recursos y tiempo**, y suele ser **poco escalable**. Además, las páginas web cambian constantemente, lo que obliga a mantener y actualizar el sistema de forma continua para evitar interrupciones en la recolección de datos.\n3. **Utilizar APIs de datos de vuelos**: Permite acceder a información actualizada, estructurada y lista para usar a través de un proveedor fiable. Es la opción más eficiente, estable y escalable actualmente, ideal para empresas que necesitan integrar datos a gran escala sin complicaciones técnicas ni riesgos legales.\n\n## **Cómo elegir la API adecuada para seguimiento de precios**\nA la hora de elegir una API para monitorizar precios de vuelos, deberías valorar:\n\n- **Actualización de datos**: ¿La información está actualizada casi en tiempo real?\n- **Velocidad**: ¿Cuánto tarda en devolver resultados?\n- **Facilidad de integración**: ¿Necesitas un equipo técnico avanzado o puedes integrarla fácilmente?\n- **Soporte**: ¿Recibes ayuda humana o esperas tickets por días?\n- **Escalabilidad**: ¿Puede crecer contigo a medida que tu negocio crece?\n\nAquí es donde la **Connect API de Veetal** marca la diferencia.\n## **Qué hace diferente a Connect API**\nVeetal ha creado Connect API con un objetivo claro: [permitir a las empresas del sector turístico integrar datos de vuelos de forma rápida, sencilla y fiable](https://arxiv.org/abs/2411.01636).\nEsto es lo que la hace única:\n\n### **1. Soporte dedicado para cada cliente**\nA diferencia de muchos proveedores, Veetal asigna un agente exclusivo a cada cliente. Nada de esperas interminables o tickets impersonales: tienes a alguien que conoce tu caso y responde de forma directa.\n\n### **2. Integración rápida y sencilla**\nConnect API está pensada para desarrolladores. Con documentación clara, ejemplos prácticos y SDKs disponibles, puedes ponerla en marcha en pocos días.\n\n### **3. Datos actualizados**\nNecesitas precios fiables ahora mismo, no del día anterior. Connect API ofrece acceso ágil y preciso a tarifas de vuelo actualizadas, lo que te permite reaccionar al instante.\n\n### **4. Escalable desde el primer día**\nTanto si haces 100 como 100.000 peticiones al día, Connect API está preparada. Su rendimiento es robusto y estable, adaptado a negocios en crecimiento.\n\n### **Usos potenciales de Connect API**\nConnect API tiene un gran potencial en diversas áreas del sector turístico. [¿Quieres una lógica de _pricing_ dinámico? ¿Crear alertas personalizadas? ¿Acceder a datos más limpios y rápidos?](https://link.springer.com/article/10.1057/s41272-023-00462-6) **Connect API lo hace posible. **\n\nA continuación, te explicamos cómo puede ayudarte en cada una de estas aplicaciones:\n\n- **Cadenas hoteleras**\nPara las cadenas hoteleras, el acceso a datos de vuelos no es solo una ventaja informativa, sino una herramienta estratégica para la toma de decisiones. A través de la Connect API, estas empresas pueden conocer la **disponibilidad, precios y rutas** entre ciudades clave, lo que les permite **anticiparse a picos de demanda** según la conectividad aérea y ajustar sus tarifas hoteleras de forma dinámica.\nAdemás, al cruzar datos de vuelos con su propia ocupación histórica, las cadenas pueden detectar patrones de comportamiento, planificar campañas específicas según mercados emisores y **optimizar la distribución de inventario en fechas de alta presión aérea**.\n\n- **Revenue Management Systems (RMS):**\nLa API es una herramienta poderosa para ajustar precios dinámicamente. Gracias a la integración con datos de tarifas de vuelos y demanda de vuelos, se posibilita la opción de optimizar los precios según las fluctuaciones del mercado. Este tipo de análisis predictivo es clave para maximizar tus márgenes de beneficio y ajustar estrategias de precios de manera eficiente.\n\n- **Motores de reservas:**\nLos motores de reservas se benefician enormemente de Connect API. Con acceso a tarifas de vuelos actualizadas al instante, puedes proporcionar una experiencia de usuario más fluida y precisa, mostrando las opciones más rentables y actualizadas. Esto mejora la satisfacción del usuario y aumenta las probabilidades de conversión.\n\n- **Startups del sector travel:**\nLa Connect API permite a las startups del sector turístico acelerar el desarrollo de nuevas soluciones sin perder tiempo en integraciones complejas. Puedes integrar datos de vuelos y utilizarlo para potenciar tu plataforma o servicio desde el primer momento, asegurando que tu solución esté siempre alineada con las tendencias actuales del mercado.\n\n- **Plataformas de alertas:**\nSi gestionas una plataforma de alertas de precios de vuelos, Connect API es ideal para configurar notificaciones personalizadas. Utilizando los datos actualizados de tarifas de vuelos, puedes ofrecer alertas inteligentes basadas en cambios de precios, promociones o fluctuaciones de la demanda. Los usuarios siempre estarán informados de las mejores tarifas y podrán tomar decisiones informadas.\n\n## **Resumen: monitoriza mejor, crece más rápido**\nHacer seguimiento de precios en 2025 ya no es solo observar tarifas, sino tener la infraestructura adecuada.\n\nTécnicas obsoletas como el _scraping_ o la monitorización manual [ya no son sostenibles. Las APIs son el futuro, pero no todas ofrecen lo mismo](https://dspace.mit.edu/handle/1721.1/122707).\n\n**Connect API de Veetal** te ofrece una forma más inteligente de usar datos de vuelos: rapidez, escalabilidad, facilidad y soporte humano real.\n¿Quieres saber más? \n[Contacta con **Veetal** y descubre cómo **Connect API** puede impulsar tu estrategia con datos de vuelos.](https://connect-api.veetal.app/commercial-meeting)\n","Las mejores herramientas de predicción de precios de vuelos en 2025: potencia tu estrategia con Connect API","flight-price-tracking-2025-api",[826],"The best flight-price prediction tools in 2025: super-charge your strategy with Connect API","Discover the top flight-price prediction solutions for 2025—and how Veetal’s Connect API can boost your profitability and operational agility.\n","Descubre las mejores soluciones de predicción de precios de vuelos en 2025 y cómo Connect API de Veetal puede mejorar tu rentabilidad y agilidad operativa.\n","seguimiento-precios-vuelos-2025-api","2025-05-22","## **How to track flight prices in 2025 (and Why Connect API Is Your Best Bet)**\n## **Introduction**\nIn the fast-moving travel world, [timing is everything](https://www.sciencedirect.com/science/article/pii/S0022247X1930486X). Whether you run a travel agency, a metasearch platform or a booking engine, knowing **how** and **when** airfares change can mean the difference between closing a sale or losing it to the competition.\nYet tracking flight prices—accurately, in real time and at scale—isn’t always easy. Fortunately, in 2025 new tools and technologies make the job far more accessible.\nThis article explains how to monitor airfares efficiently, and why **Veetal’s Connect API** is a great ally for businesses that want to integrate flight data quickly, reliably and with personalised support.\n\n## **Why Price Tracking Matters in 2025**\n[Airfares are more dynamic than ever](https://www.econometricsociety.org/publications/econometrica/2022/03/01/welfare-effects-dynamic-pricing-evidence-airline-markets). Airlines [adjust ticket prices constantly in response to demand, seasonality, competition or external factors](https://dspace.mit.edu/handle/1721.1/128436) such as fuel costs or geopolitical events.\n\nFor travel businesses, being able to follow those changes means:\n- Securing better fares for your users\n- Triggering price alerts or automated campaigns based on fluctuations\n- Offering smarter, always-up-to-date recommendations\n- Improving margins via predictive resale strategies\n\n**In short: anticipate flight prices, anticipate the market.**\n\n## **Methods for Tracking Flight Prices**\nBusinesses typically rely on three main methods to monitor airfares:\n\n1. **Manual tracking**: Visiting airline or OTA sites one by one to record prices—a slow, error-prone approach that becomes unworkable with large data volumes or many routes.\n2. **Building an in-house scraping system**: Setting up and maintaining internal infrastructure to extract data directly from public sites. This approach demands a dedicated team, is resource-intensive and seldom scales well. Websites change constantly, so the system must be updated non-stop to avoid data-collection gaps.\n3. **Using flight-data APIs**: Accessing live, structured, ready-to-use information from a reliable provider—the most efficient, stable and scalable option for companies that need large-scale data with no technical headaches or legal risk.\n\n## **How to Choose the Right Price-Tracking API**\nWhen picking an API to monitor flight prices, consider:\n\n- **Data freshness:** Is the information near real time?\n- **Speed:** How fast are the responses?\n- **Ease of integration:** Do you need a heavy tech team, or can you plug it in quickly?\n- **Support:** Will you get human help—or wait days for ticket replies?\n- **Scalability:** Can the solution grow with your business?\n\nThis is where **Veetal’s Connect API** stands out.\n\n## **What Makes Connect API Different?**\nVeetal built **Connect API** with one clear goal: [let travel companies integrate flight data quickly, simply and dependably](https://arxiv.org/abs/2411.01636).\n\n### **1. Dedicated support for every client**\nUnlike many providers, Veetal assigns an exclusive agent to each customer. No endless queues or impersonal tickets—you talk to someone who knows your case and answers directly.\n\n### **2. Fast, straightforward integration**\nConnect API is developer-friendly. Clear docs, practical examples and ready-made SDKs mean you can be up and running in days.\n\n### **3. Always-fresh data**\nYou need reliable fares **now**, not yesterday. Connect API gives quick, precise access to updated airfares so you can react instantly.\n\n### **4. Built-in scalability**\nWhether you make 100 or 100,000 requests a day, Connect API is ready. Its performance is robust and steady, tailored for growing businesses.\n\n## **Potential Uses for Connect API**\nConnect API has huge potential across the travel sector:\n\n- ### **Hotel chains**\n\nAccess to flight data becomes a strategic decision-making tool—anticipate demand peaks based on air connectivity and adjust room rates dynamically. Cross-reference flight trends with historical occupancy to plan targeted campaigns and optimise inventory during high-pressure dates.\n\n- ### **Revenue-management systems (RMS)**\n\nIntegrate fare data and demand signals to fine-tune dynamic pricing, maximising margins with predictive strategies.\n\n- ### **Booking engines**\n\nDeliver a smoother, more accurate user experience by showing the most current, cost-effective flight options—boosting satisfaction and conversion rates.\n\n- ### **Travel start-ups**\n\nAccelerate product development without wrestling with complex integrations. Plug in flight data from day one and keep your platform aligned with market trends.\n\n- ### **Alert platforms**\n\nSet up intelligent notifications based on fare changes, promotions or demand shifts. Users stay informed of the best prices and make smarter decisions.\n\n## **Summary: Track Better, Grow Faster**\nPrice tracking in 2025 isn’t just about watching fares—[it’s about having the **right infrastructure** in place.](https://dspace.mit.edu/handle/1721.1/122707) Outdated techniques like manual monitoring or scraping are no longer sustainable. APIs are the future, but not all APIs are equal.\n**Veetal’s Connect API** offers a smarter way to use flight data: speed, scalability, ease—and real human support.\n**Want to know more?**[ Contact Veetal](https://chatgpt.com/c/68383e84-9f70-8001-8ba7-3cf9aeb234bc#) and discover how Connect API can power your strategy with live flight data.\n\n","The travel companies winning on price aren't guessing.\n\nThey're using structured flight price data to spot patterns, forecast demand, and price intelligently — before their competitors react.\n\nThe top flight-price prediction approaches for 2025:\n→ Historical fare trend analysis\n→ Seasonal demand modeling\n→ Real-time competitive price monitoring\n→ Route-level availability signals\n\nAll of them require one thing: reliable, normalized flight data you don't have to scrape or maintain.\n\nWe benchmarked the best tools and explained how Connect API plugs into each approach.\n\nLink in comments 👇\n\n#FlightData #RevenueManagement #TravelTech #PriceIntelligence #ConnectAPI",[976],{"filename":977},"flight-price-tracking-2025-api-thumbnail.webp",{"id":979,"fields":980},"recrzlKVhWr1DhVoa",{"Header":981,"Body_es":984,"Title_es":985,"Featured":802,"Published":802,"Slug_en":986,"Author":987,"Title_en":988,"Summary_en":989,"Summary_es":990,"Slug_es":991,"Date":992,"Body_en":993,"Thumbnail":994},[982],{"filename":983},"best-hotel-data-apis-2026-header.webp","# Mejores APIs de datos hoteleros en 2026: comparativa (tarifas, reseñas, paridad)\n\nUna API de datos hoteleros es un servicio REST que devuelve tarifas, disponibilidad, reseñas y paridad de precios de hoteles en JSON estructurado, sin que tengas que construir y mantener tus propios parsers de HTML. Cuál es la mejor API de datos hoteleros en 2026 depende de lo que necesites de verdad: precios en vivo entre OTAs, corpus de reseñas para reputación, o un feed de rate shopping gestionado sobre tu competitor set. **Veetal Connect API** cubre las tres cosas en una sola plataforma y añade eventos, vuelos y datos de PMS que los scrapers de hotel puros no ofrecen — pero no es la respuesta correcta para todos los casos, y esta comparativa dice también dónde no lo es.\n\n## Por qué cuesta tanto conseguir datos hoteleros\n\nLa escala del inventario explica casi todo el problema. Solo Booking.com lista **unas 4,4 millones de propiedades en más de 220 países y territorios**: alrededor de 500.000 hoteles, moteles y resorts, más unos 3,9 millones de casas, apartamentos y otros alojamientos ([Booking Holdings, Form 10-K FY2025](https://www.sec.gov/Archives/edgar/data/1075531/000107553126000009/bkng-20251231.htm)). Y eso es una sola OTA. Los precios cambian según fecha, ocupación, régimen, política de cancelación, dispositivo y nivel de fidelización, y cada OTA los modela a su manera.\n\nDe ahí salen dos consecuencias:\n\n- **Un precio suelto no significa nada sin su contexto.** \"120 €\" no sirve de nada si no sabes la fecha de entrada, la ocupación, el régimen, las condiciones de cancelación y si es tarifa móvil o Genius.\n- **La cobertura es una decisión de producto, no técnica.** Ningún proveedor cubre todas las OTAs. Elige el que cubra los canales en los que realmente vendes.\n\n## Los cinco criterios que de verdad separan a los proveedores\n\nLa mayoría de comparativas de \"mejor API de hoteles\" comparan solo por precio. Estos son los criterios que deciden si una API sobrevive al contacto con producción:\n\n1. **Dominios de dato cubiertos** — ¿solo tarifas y disponibilidad, o también reseñas, paridad, eventos y vuelos?\n2. **En vivo vs pre-procesado** — ¿te dan una consulta bajo demanda, o un feed programado con histórico que puedes graficar?\n3. **Contexto de la tarifa** — ¿la respuesta lleva régimen, política de cancelación, ocupación, dispositivo y flags de fidelización, o solo un número?\n4. **Modelo de identidad** — ¿cómo le dices a la API *qué* hotel es, y funciona entre OTAs distintas?\n5. **Modelo de precio** — planes planos, créditos por llamada, o por propiedad.\n\n## Tabla comparativa\n\n| | Veetal Connect API | StayAPI | Makcorps | SerpApi | Amadeus Self-Service |\n|---|---|---|---|---|---|\n| Tarifas | Booking, Expedia, Google Hotels, Hotels.com, Airbnb | Cobertura OTA amplia, incl. Agoda, Trip.com, VRBO | Comparación de precios en muchas OTAs | Solo SERP de Google Hotels | Más de 150.000 hoteles, contenido GDS/directo |\n| Reseñas | Booking, Expedia, Google Hotels, TripAdvisor, Hotels.com | Fuerte (su mejor cluster) | No | Reseñas de Google vía SERP | Solo puntuaciones de sentimiento |\n| Parity score | **Sí** (compset gestionado) | No | No | No | No |\n| Eventos | **Sí** (impacto en roomnights) | No | No | No | Solo vuelos |\n| Vuelos | **Sí** | No | No | SERP de Google Flights | **Sí** |\n| PMS | **Sí** | No | No | No | No |\n| Feed programado + histórico | **Sí** | No | No | No | No |\n| Idiomas | **EN + ES** | Solo EN | Solo EN | Solo EN | Solo EN |\n| Modelo de precio | Por créditos; 100 créditos gratis, sin tarjeta | No publicado; demo/bajo petición | Por llamada; 30 llamadas de prueba | 25–275 $/mes según volumen | Capa gratuita y luego pago por llamada |\n\n*Cobertura y precios verificados en julio de 2026. StayAPI retiró los precios públicos de su web; las cifras que circulaban en torno a 49 $/mes ya no aparecen listadas.*\n\n## Cuándo usar cada una\n\n**Usa SerpApi** si solo necesitas resultados de Google Hotels o Google Flights y ya eres cliente de SerpApi para datos de búsqueda. Es un scraper de SERP con una superficie de hoteles, no un producto de hospitality: obtienes lo que muestra la página de resultados de Google, nada más.\n\n**Usa Makcorps** si quieres el precio por llamada más barato posible para comparar precios entre muchas OTAs y no necesitas reseñas, paridad ni histórico. Es una consulta de precio, y no pretende ser otra cosa.\n\n**Usa Amadeus Self-Service** si estás construyendo flujos de reserva y necesitas contenido oficial respaldado por GDS y tarifas reservables. Es la herramienta correcta cuando quieres *transaccionar*, no comparar precios públicos de la competencia en OTAs.\n\n**Usa StayAPI** si tu prioridad es la amplitud de OTAs — en particular Agoda, Trip.com o VRBO, que Veetal no sirve — y un producto de reseñas potente en inglés. Su cobertura de reseñas marca por marca es sinceramente su punto más fuerte.\n\n**Usa Veetal Connect API** si necesitas más de un dominio de dato, quieres un feed de rate shopping gestionado en vez de consultas sueltas, o trabajas en mercados de habla hispana. Es, además, la única de la lista con documentación y soporte en español.\n\n## Qué hacen realmente las tres familias de API\n\nVeetal divide su superficie en tres familias bajo el esquema `/v2/{family}/...`, que es justo la parte para la que los demás no tienen equivalente:\n\n- **Account API** — gratis. Resuelve identidad: tus [alojamientos](https://connect-api.veetal.app/es/tipo-datos/alojamientos) y su `slug`, tu competitor set, ubicaciones, vuelos y ejecuciones de import. Aquí no se gasta ni un crédito.\n- **Feed API** — lecturas baratas de datos **pre-procesados y almacenados** a partir de imports programados sobre las entidades que configuraste. Es la capa de grado RMS: tarifas diarias de tu compset, parity score, reputación, PMS, eventos.\n- **Real Time API** — consultas en vivo bajo demanda de cualquier hotel en cualquier OTA soportada. Consume créditos, es cacheable de 0 a 24 h, o `no_cache=true` para forzar datos frescos.\n\nUn informe diario de tarifas de un hotel y su competencia se pide así:\n\n```\ncurl --request GET \\\n  --url 'https://api.veetal.app/v2/feed/accommodation/{accommodation_slug}/rate?rate_date=2026-08-14&ota=booking&adults=2&regime=ad' \\\n  --header 'veetal-api-key: YOUR_API_KEY'\n```\n\nDevuelve precio, tipo de habitación, régimen, política de cancelación y flags Genius/móvil por competidor: el contexto que convierte un número en algo utilizable. Entre los filtros están `regime` (alo, ad, mp, pc, ti), `cancel_policy`, `min_rates` para quedarte solo con la tarifa mínima por competidor y fecha, e `import_id` para leer un import histórico concreto.\n\nPara precios multi-OTA en vivo, `realtime_hotel_parity` devuelve una tarifa por OTA en todos los canales de Google Hotel Ads para una estancia dada, en 4–14 segundos: es el motor de la [detección de disparidad de tarifas](https://connect-api.veetal.app/es/dataset/disparidad-hotelera).\n\n## Lo que no tiene nadie más\n\nTres de los dominios de Veetal no tienen equivalente entre los proveedores de arriba:\n\n- **Parity score** — una puntuación calculada de tu hotel frente a tu compset gestionado en un rango de fechas, no una lista de precios que tienes que comparar tú. El concepto está explicado en [¿Qué es la paridad de tarifas hoteleras?](https://connect-api.veetal.app/es/blog/que-es-la-paridad-de-tarifas-hoteleras).\n- **Eventos con impacto en demanda hotelera** — asistencia y audience mix convertidos en **roomnights**, presión hotelera diaria contra el inventario real de la ciudad, ventana de reserva y distribución geográfica por anillo × categoría hotelera. Ningún otro proveedor de esta lista lo ofrece.\n- **Datos de PMS** — regímenes, tipos de habitación, rate plans, inventario y reservas de tus propios sistemas, cruzados con los datos de mercado anteriores.\n\n## Un caso real: una agencia de revenue\n\nUna agencia de revenue que gestiona 40 hoteles necesita, cada mañana: el precio de cada hotel y el de sus cinco competidores para los próximos 90 días, un chequeo de paridad entre OTAs, y un aviso cuando un evento de ciudad va a disparar la demanda.\n\nCon una API de consulta de precios, eso son 40 hoteles × 5 competidores × 90 fechas de llamadas bajo demanda, cada día, más tu propio almacenamiento, programación y deduplicación — y aun así no tienes ni parity score ni señal de eventos. Con la capa Feed, el compset se configura una vez, los imports corren programados, y la agencia lee las [tarifas de hoteles](https://connect-api.veetal.app/es/dataset/tarifas-hoteles) y la paridad como informes ya calculados, con los [eventos](https://connect-api.veetal.app/es/dataset/eventos) marcando los picos de demanda. La capa Real Time queda entonces reservada para las comprobaciones puntuales que de verdad necesitan ser en vivo.\n\nEsa es la diferencia práctica entre un scraper con envoltorio REST y una plataforma de datos de grado RMS.\n\n## ¿Y por qué no scrapearlo tú mismo?\n\nScrapear páginas de OTAs es un problema de mantenimiento, no un desarrollo puntual:\n\n- **La maqueta cambia sin avisar.** Cada cambio de marcado rompe tu parser en silencio, y te enteras por datos malos, no por una excepción.\n- **Las medidas anti-bot y los captchas** te limitan justo cuando necesitas volumen.\n- **Obtienes HTML crudo, no datos.** El régimen, las condiciones de cancelación y los flags de fidelización hay que volver a deducirlos por cada OTA y cada idioma.\n- **No escala.** Concurrencia, proxies, reintentos y deduplicación se convierten en un coste permanente de equipo.\n\nUna API te da JSON estable y normalizado, con timestamps y metadata. El intercambio completo lo tratamos en [API hotelera vs web scraping](https://connect-api.veetal.app/es/blog/api-hotelera-vs-web-scraping) y en [Cómo obtener datos hoteleros sin scraping](https://connect-api.veetal.app/es/blog/como-obtener-datos-hoteleros-sin-scraping).\n\n## Preguntas frecuentes\n\n**¿Cuál es la mejor API de datos hoteleros en 2026?**\nNo hay un ganador único para todos los casos. Para necesidades multi-dominio (tarifas + reseñas + paridad + eventos) y para mercados de habla hispana, Veetal Connect API es la plataforma única más completa. Para máxima amplitud de OTAs en inglés — incluidas Agoda, Trip.com y VRBO — StayAPI cubre más canales. Si solo necesitas Google Hotels, SerpApi basta. Para flujos de reserva, usa Amadeus.\n\n**¿Qué OTAs cubre Veetal Connect API?**\nBooking.com, Expedia, Google Hotels, Hotels.com y Airbnb para tarifas y disponibilidad; Booking, Expedia, Google Hotels, TripAdvisor y Hotels.com para reputación. Veetal no sirve Agoda, Trip.com ni VRBO.\n\n**¿Cuál es la diferencia entre la Feed API y la Real Time API?**\nLa Feed API devuelve datos pre-procesados de imports programados sobre entidades que has configurado: baratos de leer y con histórico. La Real Time API trae datos en vivo bajo demanda de cualquier hotel, consume créditos y es cacheable de 0 a 24 h. Feed es para monitorización recurrente; Real Time, para consultas puntuales.\n\n**¿Cuánto cuesta una API de datos hoteleros?**\nLos modelos varían: SerpApi cobra 25–275 $/mes según volumen de búsquedas, Makcorps cobra por llamada, Amadeus tiene capa gratuita y luego pago por llamada, y StayAPI ya no publica precios. Veetal funciona con créditos mensuales en los planes Seed, Grow, Bloom y Enterprise, con descuento por pago anual y créditos extra disponibles — consulta los [precios actuales](https://connect-api.veetal.app/es/precios).\n\n**¿Existe alguna API de datos hoteleros gratis?**\nLa mayoría de proveedores ofrecen una prueba, no un producto gratuito. Veetal Connect API te da **100 créditos gratis sin tarjeta de crédito**. Makcorps ofrece 30 llamadas de prueba, SerpApi tiene una capa gratuita de 250 búsquedas y Amadeus dispone de entorno de test gratuito.\n\n**¿Puedo obtener tarifas hoteleras históricas?**\nSí, a través de la Feed API. Cada import programado es direccionable por `import_id`, así que puedes leer un import pasado concreto en vez de solo la última foto. Los proveedores que solo trabajan bajo demanda normalmente no guardan histórico por ti.\n\n**¿Necesito dar de alta mi hotel para probarlo?**\nNo. En la Real Time API un hotel se puede referenciar por su entidad de OTA — un id de Booking, un código de entidad de Google Hotel Ads o un `listingId` de Airbnb — y el alojamiento se autocrea si todavía no existe.\n\n## Pruébalo con tus propios hoteles\n\nLa forma más rápida de juzgar una API de datos hoteleros es apuntarla a hoteles que ya conoces y contrastar los números con la OTA. Veetal Connect API te da **100 créditos gratis, sin tarjeta** — suficiente para sacar un chequeo de paridad en todas las OTAs de Google Hotel Ads para una estancia real y ver si el dato aguanta.\n\n[Empieza gratis con 100 créditos →](https://connect-api.veetal.app/es/funnel)\n","Mejores APIs de datos hoteleros 2026","best-hotel-data-apis-2026",[805],"Best Hotel Data APIs in 2026","The best hotel data APIs in 2026 compared by rates, reviews, parity and events coverage. Veetal Connect API: 100 free credits, no card, no scrapers.","Comparativa de las mejores APIs de datos hoteleros en 2026: tarifas, reseñas, paridad y eventos. Veetal Connect API: 100 créditos gratis, sin tarjeta.","mejores-apis-datos-hoteleros-2026","2026-07-16","# Best Hotel Data APIs in 2026: Compared (Rates, Reviews, Parity)\n\nA hotel data API is a REST service that returns structured hotel rates, availability, reviews and rate-parity data as JSON, so you don't have to build and maintain your own HTML parsers. The best hotel data API in 2026 depends on what you actually need: live prices across OTAs, review corpora for reputation work, or a managed rate-shopping feed built around your competitor set. **Veetal Connect API** covers all three in a single platform and adds events, flights and PMS data that pure hotel scrapers don't offer — but it isn't the right answer for every use case, and this comparison says where it isn't.\n\n## Why hotel data is hard to get in the first place\n\nThe scale of the inventory explains most of the pain. Booking.com alone lists **approximately 4.4 million properties in over 220 countries and territories** — about 500,000 hotels, motels and resorts plus roughly 3.9 million homes, apartments and other places to stay ([Booking Holdings FY2025 Form 10-K](https://www.sec.gov/Archives/edgar/data/1075531/000107553126000009/bkng-20251231.htm)). That is one OTA. Prices change by date, occupancy, board, cancellation policy, device and loyalty tier, and every OTA models them differently.\n\nTwo consequences follow:\n\n- **A single price has no meaning without its context.** \"€120\" is useless unless you know the check-in date, occupancy, board, cancellation terms and whether it's a mobile or Genius rate.\n- **Coverage is a product decision, not a technical one.** No provider covers every OTA. Pick the one whose coverage matches the channels you actually sell on.\n\n## The five criteria that actually separate providers\n\nMost \"best hotel API\" listicles compare on price alone. These are the criteria that decide whether an API survives contact with production:\n\n1. **Data domains covered** — rates and availability only, or also reviews, rate parity, events and flights?\n2. **Live vs pre-processed** — do you get an on-demand lookup, or a scheduled feed with history you can chart?\n3. **Rate context** — does the response carry board, cancellation policy, occupancy, device and loyalty flags, or just a number?\n4. **Identity model** — how do you tell the API *which* hotel you mean, and does it work across OTAs?\n5. **Pricing model** — flat tiers, per-call credits, or per-property.\n\n## Comparison table\n\n| | Veetal Connect API | StayAPI | Makcorps | SerpApi | Amadeus Self-Service |\n|---|---|---|---|---|---|\n| Rates | Booking, Expedia, Google Hotels, Hotels.com, Airbnb | Broad OTA coverage incl. Agoda, Trip.com, VRBO | Price comparison across many OTAs | Google Hotels SERP only | 150,000+ hotels, GDS/direct content |\n| Reviews | Booking, Expedia, Google Hotels, TripAdvisor, Hotels.com | Strong (its best cluster) | No | Google reviews via SERP | Sentiment scores only |\n| Parity score | **Yes** (managed compset) | No | No | No | No |\n| Events | **Yes** (roomnights impact) | No | No | No | Flights only |\n| Flights | **Yes** | No | No | Google Flights SERP | **Yes** |\n| PMS | **Yes** | No | No | No | No |\n| Scheduled feed + history | **Yes** | No | No | No | No |\n| Languages | **EN + ES** | EN only | EN only | EN only | EN only |\n| Pricing model | Credit-based; 100 free credits, no card | Not published; demo/on request | Per-call; 30 free trial calls | $25–$275/mo by search volume | Free tier, then pay-per-call |\n\n*Coverage and pricing verified July 2026. StayAPI removed public pricing from its site; figures previously quoted around $49/month are no longer listed.*\n\n## When to use each one\n\n**Use SerpApi** if you only need Google Hotels or Google Flights results and you're already a SerpApi customer for search data. It's a SERP scraper with a hotel surface, not a hospitality product — you get what Google's results page shows, nothing more.\n\n**Use Makcorps** if you want the cheapest possible per-call price comparison across many OTAs and you don't need reviews, parity or history. It's a price lookup, and it's honest about that.\n\n**Use Amadeus Self-Service** if you're building booking flows and need official GDS-backed content and shoppable rates. It's the right tool when you intend to *transact*, not to benchmark competitors' public OTA prices.\n\n**Use StayAPI** if your priority is broad OTA coverage — particularly Agoda, Trip.com or VRBO, which Veetal does not serve — and a strong reviews product in English. Its brand-by-brand reviews coverage is genuinely its strongest area.\n\n**Use Veetal Connect API** if you need more than one data domain, want a managed rate-shopping feed rather than raw lookups, or operate in Spanish-speaking markets.\n\n## What the three API families actually do\n\nVeetal splits its surface into three families under a `/v2/{family}/...` scheme, which is the part most competitors have no equivalent for:\n\n- **Account API** — free. Resolves identity: your [accommodations](https://connect-api.veetal.app/data-type/accommodations) and their `slug`, your competitor set, locations, flights and import runs. Nothing costs credits here.\n- **Feed API** — cheap reads of **pre-processed, stored** data from scheduled imports over the entities you configured. This is the RMS-grade layer: daily rates for your compset, parity score, reputation, PMS, events.\n- **Real Time API** — on-demand live lookups of any hotel on any supported OTA. Consumes credits, cacheable 0–24h, or `no_cache=true` to force fresh data.\n\nA daily rate report for a hotel and its competitor set looks like this:\n\n```\ncurl --request GET \\\n  --url 'https://api.veetal.app/v2/feed/accommodation/{accommodation_slug}/rate?rate_date=2026-08-14&ota=booking&adults=2&regime=ad' \\\n  --header 'veetal-api-key: YOUR_API_KEY'\n```\n\nThat returns price, room type, board, cancellation policy and Genius/mobile flags per competitor — the context that makes a number usable. Filters include `regime` (alo, ad, mp, pc, ti), `cancel_policy`, `min_rates` for just the cheapest rate per competitor per date, and `import_id` to read a specific historical import.\n\nFor live multi-OTA pricing, `realtime_hotel_parity` returns one rate per OTA across all channels on Google Hotel Ads for a given stay, in 4–14 seconds — that's the engine behind [rate disparity detection](https://connect-api.veetal.app/dataset/hotel-disparities).\n\n## The parts nobody else has\n\nThree of Veetal's domains have no equivalent among the providers above:\n\n- **Parity score** — a computed score for your hotel against your managed compset over a date range, not just a list of prices you diff yourself. See [What Is Hotel Rate Parity?](https://connect-api.veetal.app/blog/what-is-hotel-rate-parity) for the concept.\n- **Events with hotel-demand impact** — attendance and audience mix converted into **roomnights**, daily hotel pressure against the city's actual inventory, booking window, and geographic distribution by ring × hotel category. No other provider on this list ships this.\n- **PMS data** — boards, room types, rate plans, inventory and reservations from your own property systems, joined to the market data above.\n\n## A real use case: a revenue agency\n\nA revenue agency managing 40 hotels needs, every morning: each hotel's price and its five competitors' prices for the next 90 days, a parity check across OTAs, and a heads-up when a city event is about to spike demand.\n\nWith a price-lookup API, that's 40 hotels × 5 competitors × 90 dates of on-demand calls, every day, plus your own storage, scheduling and dedup — and you still have no parity score or event signal. With the Feed layer, the compset is configured once, imports run on schedule, and the agency reads [hotel rates](https://connect-api.veetal.app/dataset/hotel-rates) and parity as pre-computed reports, with [events](https://connect-api.veetal.app/dataset/events) flagging the demand spikes. The Real Time layer is then reserved for the ad-hoc checks that genuinely need to be live.\n\nThat's the practical difference between a scraper with a REST wrapper and an RMS-grade data platform.\n\n## Why not just scrape it yourself?\n\nScraping OTA pages is a maintenance problem, not a one-off build:\n\n- **Layouts change without notice.** Every markup change silently breaks your parser, and you find out from bad data, not from an exception.\n- **Anti-bot measures and captchas** throttle you exactly when you need volume.\n- **You get raw HTML, not data.** Board, cancellation terms and loyalty flags have to be re-derived per OTA, per locale.\n- **It doesn't scale.** Concurrency, proxies, retries and dedup become a permanent team cost.\n\nAn API gives you stable, normalised JSON with timestamps and metadata. We covered the full trade-off in [Hotel API vs Web Scraping](https://connect-api.veetal.app/blog/hotel-api-vs-web-scraping) and [How to Get Hotel Data Without Scraping](https://connect-api.veetal.app/blog/how-to-get-hotel-data-without-scraping).\n\n## Frequently asked questions\n\n**What is the best hotel data API in 2026?**\nThere isn't one winner for every case. For multi-domain needs (rates + reviews + parity + events) and for Spanish-speaking markets, Veetal Connect API is the broadest single platform. For maximum OTA breadth in English — including Agoda, Trip.com and VRBO — StayAPI covers more channels. For Google Hotels only, SerpApi is sufficient. For booking flows, use Amadeus.\n\n**Which OTAs does Veetal Connect API cover?**\nBooking.com, Expedia, Google Hotels, Hotels.com and Airbnb for rates and availability; Booking, Expedia, Google Hotels, TripAdvisor and Hotels.com for reputation. Veetal does not serve Agoda, Trip.com or VRBO.\n\n**What's the difference between the Feed API and the Real Time API?**\nThe Feed API returns pre-processed data from scheduled imports over entities you configured — cheap to read, with history. The Real Time API fetches live data on demand for any hotel, consumes credits, and is cacheable from 0 to 24 hours. Feed is for recurring monitoring; Real Time is for ad-hoc lookups.\n\n**How much does a hotel data API cost?**\nModels differ: SerpApi charges $25–$275/month by search volume, Makcorps charges per call, Amadeus has a free tier then pay-per-call, and StayAPI no longer publishes pricing. Veetal uses monthly credits across Seed, Grow, Bloom and Enterprise plans, with a discount for annual billing and extra credits available — see [current pricing](https://connect-api.veetal.app/pricing).\n\n**Is there a free hotel data API?**\nMost providers offer a trial rather than a free product. Veetal Connect API gives you **100 free API credits with no credit card**. Makcorps offers 30 trial calls; SerpApi has a 250-search free tier; Amadeus has a free test environment.\n\n**Can I get historical hotel rates?**\nYes, through the Feed API. Each scheduled import is addressable by `import_id`, so you can read a specific past import instead of only the latest snapshot. On-demand-only providers generally don't retain history for you.\n\n**Do I need to give you my hotel's identity to test it?**\nNo. In the Real Time API a hotel can be referenced by its OTA entity — a Booking id, a Google Hotel Ads entity code, or an Airbnb `listingId` — and the accommodation is auto-created if it doesn't exist yet.\n\n## Try it with your own hotels\n\nThe fastest way to judge a hotel data API is to point it at hotels you already know and check the numbers against the OTA. Veetal Connect API gives you **100 free credits, no credit card** — enough to pull a parity check across every OTA on Google Hotel Ads for a real stay and see whether the data holds up.\n\n[Start free with 100 API credits →](https://connect-api.veetal.app/funnel)\n",[995],{"filename":996},"best-hotel-data-apis-2026-thumbnail.webp",{"id":998,"fields":999},"recvjaWHfPku0ouaE",{"Header":1000,"Body_es":1003,"Title_es":1004,"Published":802,"Slug_en":1005,"Author":1006,"Title_en":1007,"Summary_en":1008,"Summary_es":1009,"Slug_es":1010,"Date":1011,"Body_en":1012,"LinkedIn post":1013,"Thumbnail":1014},[1001],{"filename":1002},"veetal-connect-api-tourism-data-access-header.webp","## **Potencia tu negocio turístico con la Connect API de Veetal: acceso directo a datos clave**\n\nEn un sector tan dinámico como el turístico, [los datos no solo importan: lo son todo](https://mize.tech/blog/data-analytics-in-tourism-industry-what-is-it-benefits-how-its-used-real-life-examples/). Saber anticiparse a la demanda, ajustar precios en tiempo real, entender los comportamientos de los viajeros o detectar tendencias emergentes no es opcional, es una necesidad. Pero ¿cómo hacerlo cuando los datos están fragmentados, desestructurados o son inaccesibles?\nAhí es donde entra la **Connect API de Veetal**, [la solución de datos centralizados que permite a las empresas del sector turístico acceder a datasets actualizados, estructurados y fáciles de integrar](https://acropolium.com/blog/travel-api-integration-top-apis-and-reasons-to-implement-them/), sin las limitaciones del scraping manual ni la complejidad técnica de desarrollos a medida.\n## \n## **¿Qué es la Connect API?**\nLa **Connect API** es la plataforma de datos creada por **Veetal**, nacida a partir del desarrollo de su propio sistema de Revenue Management. Hoy, esta API se presenta como una herramienta independiente pensada para quienes necesitan acceder directamente a los datos que nutren las decisiones de negocio en el sector turístico.\nEn lugar de ofrecer un software cerrado, la Connect API permite que **agencias de revenue, desarrolladores, cadenas hoteleras, plataformas de BI, motores de reserva o integradores PMS** accedan a los datos en crudo, listos para alimentar sus propias herramientas.\nAdemás, su instalación es más rápida que otras soluciones del mercado, cuenta con una estructura de datos coherente y escalable, y ofrece algo que muchos competidores han olvidado: **trato humano**. Cada cliente de Veetal cuenta con un agente de soporte personalizado, lo que garantiza una implementación ágil y una atención cercana.\n## \n## **¿Qué datasets incluye?**\nVeetal Connect API ofrece un ecosistema de datos clave para quienes trabajan en pricing, inteligencia de mercado, previsión de demanda o desarrollo de productos digitales en el sector turístico. A continuación, exploramos sus principales fuentes:\n### \n### **1. Alojamientos**\nAccede a [información detallada y actualizada sobre la oferta de alojamientos](https://connect-api.veetal.app/data-type/accommodations) en todo el mundo, ideal para desarrolladores, agencias de viajes y plataformas de reservas que buscan integrar datos precisos y en tiempo real.\n\n**Tarifas por Habitación y Hotel**\nConsulta las tarifas más recientes por habitación y por establecimiento, incluyendo:\n- Precios por noche para diferentes tipos de habitaciones.\n- Tarifas según ocupación.\n- Información sobre promociones y descuentos disponibles.\n\n**Tipos de Establecimientos**\nExplora una amplia variedad de tipos de alojamiento, tales como:\n- Hoteles (1 a 5 estrellas)\n- Apartamentos turísticos\n- Hostales y pensiones\n- Bed & Breakfast\n- Resorts y complejos vacacionales\n- Alojamientos rurales y ecológicos\n\n**Categoría del Alojamiento**\nIdentifica la categoría oficial de cada establecimiento basada en estándares internacionales y locales, facilitando la comparación y selección según las preferencias del viajero.\n\n**Ubicación Geográfica Precisa**\nObtén datos geográficos exactos para cada alojamiento, incluyendo:\n- Dirección completa y coordenadas GPS.\n- Proximidad a puntos de interés turístico y transporte público.\n- Zonas y barrios destacados en cada ciudad.\n\n**Servicios y Comodidades (Amenities)**\nDescubre los servicios y comodidades que ofrece cada alojamiento, como:\n- Wi-Fi gratuito\n- Desayuno incluido\n- Piscina y gimnasio\n- Estacionamiento\n- Accesibilidad para personas con movilidad reducida\n- Política de mascotas\n\n**Caso de uso real (1 de 2):** Una cadena hotelera internacional española utiliza esta fuente para monitorizar tarifas y disponibilidad de la competencia en más de 30 destinos clave. \n\n**Caso de uso real (2 de 2):** Una cadena hotelera internacional española utiliza esta fuente para actualizar precios de forma dinámica para sus habitaciones en más de 15 destinos clave.\n### \n### **2. Vuelos**\nAccede a [datos precisos sobre rutas aéreas internacionales y nacionales](https://connect-api.veetal.app/data-type/flights), ideales para análisis turísticos, predicción de demanda y desarrollo de soluciones de viaje inteligentes. Esta información proviene de integraciones con Kayak y otras fuentes confiables.\n\n**¿Qué incluye esta fuente de datos sobre vuelos?**\n\n- **Número de vuelos** disponibles entre pares de ciudades (origen/destino) en fechas específicas.\n- **Temporalidad y estacionalidad** de cada ruta, útil para identificar tendencias de viaje.\n- **Información por aerolínea**, incluyendo nombre, logo, horarios y duración de vuelos.\n- **Precios actualizados** por trayecto, en euros, con enlaces directos de reserva.\n- **Detalles del vuelo**: horarios de salida y llegada, número de escalas, duración total.\n- **Ubicación precisa**: nombres y códigos IATA de aeropuertos y ciudades de origen y destino.\n\n**¿Para qué se puede utilizar esta información?**\n\n- **Análisis de flujos turísticos** entre ciudades o regiones.\n- **Estimación de picos de demanda** aérea según temporada y rutas.\n- **Modelos predictivos (forecast)** aplicados a turismo, movilidad y economía.\n- **Optimización de estrategias comerciales** para agencias de viajes, aerolíneas y plataformas de reservas.\n### \n### **3. Reputación Online**\nCentraliza y analiza [la reputación digital de alojamientos a través de plataformas clave](https://connect-api.veetal.app/data-type/reputation) como **Booking**, **TripAdvisor**, **Expedia** y **Hotels.com**, con datos estructurados ideales para inteligencia competitiva y mejora del posicionamiento de marca.\n\n**¿Qué información se recopila?**\n- **Valoraciones globales** por portal (puntuación media sobre 100).\n- **Número total de reseñas** de usuarios, segmentadas por canal.\n- **Ranking en su categoría** y posición relativa frente a competidores.\n- **Evolución temporal y comparativa** entre plataformas.\n- **Análisis temático y por aspectos** específicos:\n    - Calidad del sueño\n    - Limpieza\n    - Ubicación\n    - Atención del personal\n    - Relación calidad-precio\n- Estado general del establecimiento\n\n**¿Para qué se utiliza esta información?**\n\n- **Auditoría de reputación online** para alojamientos turísticos.\n- **Agencias de marketing y branding** que gestionan presencia digital.\n- **Consultoras de estrategia reputacional** que elaboran reportes comparativos.\n- **Modelos de análisis de sentimiento y percepción del cliente**.\n### \n### **4. Demanda de mercado**\nAccede a [datos predictivos sobre la **intención real de viaje hacia destinos turísticos**](https://kodytechnolab.com/blog/predictive-analytics-in-travel/). Nuestra API [proporciona curvas temporales de demanda](https://connect-api.veetal.app/data-type/market) que permiten anticipar tendencias en el sector turístico.\n\n**¿Qué te permite obtener este recurso?**\n- **Curvas de demanda diaria** segmentadas por ciudad y fecha.\n- Identificación de **picos de demanda** y periodos valle.\n- **Ventanas de reserva** y comportamiento anticipado del viajero.\n\n**¿Por qué es clave para tu estrategia?**\n- Mejora tu **[forecast hotelero](https://www.trustinsights.ai/insights/webinars-events/predictive-analytics-tourism-hospitality/)**[ y optimiza la **estrategia de revenue management**](https://www.trustinsights.ai/insights/webinars-events/predictive-analytics-tourism-hospitality/).\n- Planifica promociones y disponibilidad según **patrones de intención de viaje reales**.\n- Imprescindible para OTAs, destinos turísticos, aerolíneas, turoperadores y agencias de marketing digital.\n### \n### **5. Eventos**\nExplora [un dataset estructurado](https://connect-api.veetal.app/data-type/events) con [información clave sobre eventos](https://www.smartness.com/en/blog/impact-event-hotel-rates) que influyen directamente en la **ocupación hotelera** y la **dinámica turística local**. Accede a datos enriquecidos que permiten anticipar fluctuaciones en la demanda y ajustar estrategias de negocio en tiempo real.\n**¿Qué incluye este recurso?**\n- **Calendario de eventos** por ciudad, con fechas de inicio, fin y duración total.\n- **Clasificación por tipo de evento**: culturales, deportivos, ferias, congresos, entretenimiento, etc.\n- **Estimación de asistencia** y perfil sociodemográfico de los asistentes:\n    - Distribución por edad (jóvenes, adultos, mayores)\n    - Tipología: parejas, familias, solteros, viajeros de negocios, deportistas, etc.\n- **Localización geográfica precisa** (latitud, longitud, ciudad, país).\n- **Repetición anual o puntual** según la naturaleza del evento.\n\n**¿Por qué es relevante para tu negocio?**\n- **Modelado avanzado de variaciones de precios hoteleros** según proximidad temporal y relevancia del evento.\n- **Toma de decisiones informadas** para operadores turísticos, OTAs, consultoras y destinos inteligentes.\n- **Optimización de campañas de marketing geolocalizado y planificación de recursos** en función del perfil del visitante.\n\n**Caso de uso real**\nVeetal proporciona datos de eventos locales y regionales a consultoras turísticas que modelan variaciones de precios según la proximidad y el impacto esperado de cada evento.\n\n### **¿Por qué elegir Connect API en lugar de recurrir al scraping?**\n\nPorque los datos no deberían ser una barrera, sino una ventaja. La **Connect API de Veetal** está diseñada para ofrecer acceso directo, estructurado y fiable a información turística crítica, sin las limitaciones económicas, técnicas, legales y operativas que suelen acompañar al **scraping manual**.\n\nAdemás, **la integración de la Connect API** no solo mejora la calidad y disponibilidad de los datos, sino que **reduce drásticamente el tiempo necesario para implementarlos** en tus herramientas. Esto se traduce en un **time-to-market más rápido** y una mayor **flexibilidad** en las decisiones que tomes para tu negocio.\n\nPor otro lado, recurrir al scraping implica altos **costes operativos** derivados de tener que mantener un equipo de tecnología dedicado a la extracción, limpieza y estructuración de datos. Sin mencionar las **limitaciones de escalabilidad**, ya que, a medida que crecen las necesidades de datos, las soluciones de scraping pueden volverse ineficaces y difíciles de mantener.\n\nSi todavía tienes dudas sobre las diferencias fundamentales entre ambos enfoques, te recomendamos leer nuestro artículo:\n[ ](https://docs.google.com/document/d/1LfZnEClM2eQ9J_RvwPvb4WHeCia2ulE2jSuixP5VLeg/edit?tab=t.0)**\\\"¿Por qué es mejor usar una API que hacer scraping? Los datos turísticos como ventaja competitiva.\\\"**\n\nMientras tanto, aquí tienes una comparativa clara:\n\n|              | Scraping Manual                                           | Connect API de Veetal                                 |\n|---------------------------|-----------------------------------------------------------|--------------------------------------------------------|\n| **Time-to-Market**         | Lento; requiere desarrollo e integración manual           | Rápido; integración sencilla en pocas horas            |\n| **Costes operativos**      | Altos; requiere un equipo de tecnología interno           | Bajas; coste solo por uso de la API                    |\n| **Escalabilidad**          | Limitada; crece con dificultades a medida que aumenta la demanda | Escalable; fácil de ampliar a nuevos mercados o más fuentes de datos |\n| **Actualización de datos** | Esporádica, manual y limitada                             | Datos actualizados                                     |\n| **Estructura de los datos**| Inconsistente y desordenada                               | Consistente, escalable y fácil de integrar             |\n| **Mantenimiento**          | Alto; requiere monitoreo constante                        | Mínimo; mantenimiento gestionado por Veetal            |\n| **Soporte**                | General o inexistente                                     | Soporte personalizado y humano                         |\n| **Fiabilidad**             | Variable; dependiente de la calidad del scraping          | Alta; datos validados y garantizados                   |\n\n\n### **Ventajas clave de Connect API sobre scraping:**\n1. **Reducción en el Time-to-Market:** Con la **Connect API**, puedes acceder a los datos prácticamente de inmediato, sin la necesidad de implementar una solución compleja de scraping. Esto significa que tu equipo de tecnología puede centrarse en lo que realmente importa: mejorar el producto final, no en gestionar la extracción y depuración de datos.\n2. **Costes Reducidos:** Mantener un equipo interno dedicado al scraping no es económico. Requiere desarrolladores, ingenieros y recursos para manejar fallos, cambios en las estructuras de las páginas web, y asegurar la calidad de los datos extraídos. Con la **Connect API**, eliminas estos gastos y solo pagas por lo que consumes.\n3. **Escalabilidad sin Límites:** Cuando los volúmenes de datos aumentan o los mercados cambian, el scraping se convierte en un cuello de botella. Con la **Connect API**, la escalabilidad es simple y directa. A medida que crecen tus necesidades, puedes ampliar el acceso a más fuentes de datos sin tener que reestructurar tus procesos.\n\n**Fácil, rápido y sin complicaciones**\nA diferencia de muchas soluciones técnicas, la Connect API de Veetal está [pensada para facilitar la vida a los equipos de tecnología](https://www.switchfly.com/blog/apis-in-the-travel-industry), marketing, data o revenue. Su implementación puede completarse en cuestión de horas, y **puedes probarla sin riesgo**, con 100 créditos gratuitos y **sin necesidad de tarjeta de crédito**.\nAdemás, nuestra documentación está[ disponible online](https://connect-api.veetal.app/), y nuestro equipo técnico acompaña cada integración de forma personalizada.\n## \n## **¿Quién ya está usando la Connect API?**\nDesde **cadenas hoteleras** hasta **sistemas de revenue management** y **consultoras especializadas**, múltiples actores del sector turístico ya utilizan la Connect API de Veetal para tomar decisiones basadas en datos confiables, actualizados y listos para usar.\nYa sea para actualizar tarifas por habitación, monitorizar reputación online, comparar precios frente a la competencia, analizar valoraciones de usuarios o extraer información clave sobre la demanda por ciudad, la Connect API se adapta a tus necesidades sin obligarte a cambiar tus herramientas.\n**Una única API, múltiples usos estratégicos. Los datos los ponemos nosotros, el valor lo construyes tú.**\n## \n## **¿Y si empezamos hoy?**\nSi estás construyendo algo en el sector turístico y necesitas datos fiables, actuales y listos para usar, la Connect API es el punto de partida ideal.\n[Solicita una reunión aquí](https://connect-api.veetal.app/commercial-meeting).\n\n\n","Connect API de Veetal: la API de datos turísticos para empresas inteligentes","veetal-connect-api-tourism-data-access",[826],"Veetal Connect API: the tourism data API for smart companies","Get up-to-date tourism data with Veetal’s Connect API—flights, accommodation, online reputation and more, no scraping, no fuss.","Accede a datos turísticos actualizados con Connect API de Veetal: vuelos, alojamientos, reputación online y más, sin scraping ni complicaciones.\n","veetal-connect-api-datos-turisticos","2025-04-01","## **Boost your tourism business with Veetal’s Connect API: direct access to key data**\nIn a sector as dynamic as travel, [data doesn’t just matter—it’s everything](https://mize.tech/blog/data-analytics-in-tourism-industry-what-is-it-benefits-how-its-used-real-life-examples/). Being able to anticipate demand, adjust prices in real time, understand traveller behaviour or spot emerging trends is no longer optional; it’s a necessity. But how can you do that when data is fragmented, unstructured or simply inaccessible?\nThat’s where **Veetal’s Connect API** comes in—[the centralised data solution that lets tourism-industry businesses tap into updated, structured datasets that integrate easily](https://acropolium.com/blog/travel-api-integration-top-apis-and-reasons-to-implement-them/), without the limits of manual scraping or the technical burden of bespoke developments.\n## **What is the Connect API?**\n**[Connect API](https://connect-api.veetal.app/)** is Veetal’s data platform, born from the development of its own Revenue Management system. Today it stands alone as a tool for anyone who needs direct access to the data that drives business decisions in travel.\nInstead of offering a closed piece of software, Connect API allows **revenue agencies, developers, hotel chains, BI platforms, booking engines or PMS integrators** to pull raw data—ready to feed their own tools.\nImplementation is faster than alternative solutions, the data model is coherent and scalable, and it offers something many competitors have forgotten: **human service**. Every Veetal client has a dedicated support agent, ensuring a smooth roll-out and close, personal attention.\n## **Which datasets are included?**\nVeetal Connect API delivers a key data ecosystem for professionals in pricing, market intelligence, demand forecasting or digital-product development in tourism. Below are its main sources:\n\n### **1. Accommodations**\nAccess detailed, [up-to-date information on accommodation supply worldwide](https://connect-api.veetal.app/data-type/accommodations)—ideal for developers, travel agencies and booking platforms seeking precise, real-time data.\n- **Room & Hotel Rates**\n    - Nightly prices for different room types\n    - Rates by occupancy\n    - Information on promotions and discounts\n\n- **Establishment Types**\n    - Hotels (1–5 stars)\n    - Tourist apartments\n    - Hostels & guest-houses\n    - Bed & Breakfasts\n    - Resorts & holiday complexes\n    - Rural & eco-lodges\n\n- **Accommodation Category**\n    - Official category per international and local standards, making comparison easy.\n    - Precise Geographical Location\n    - Full address & GPS coordinates\n    - Proximity to tourist sights & public transport\n    - Key neighbourhoods in each city\n\n- **Services & Amenities**\n    - Free Wi-Fi\n    - Breakfast included\n    - Pool & gym\n    - Parking\n    - Accessibility features\n    - Pet-friendly policies\n\n**Real use case (1 of 2):** A Spanish international hotel chain uses this feed to monitor competitor rates and availability in 30+ key destinations.\n\n**Real use case (2 of 2):** The same chain dynamically updates its own room prices across 15+ strategic destinations.\n### \n### **2. Flights**\nGet [accurate data on domestic and international air routes](https://connect-api.veetal.app/data-type/flights)—perfect for tourism analysis, demand prediction and smart travel solutions. Information comes from Kayak integrations and other reliable sources.\n**What’s inside?**\n- Number of available flights between city pairs (origin/destination) on specific dates\n- Seasonality of each route\n- Airline info: name, logo, schedules, flight duration\n- Up-to-date prices per leg (EUR) with direct booking links\n- Flight details: departure & arrival, stops, total duration\n- Exact locations: airport & city names plus IATA codes\n\n**Uses**\n- Analyse tourist flows between cities or regions\n- Estimate air-demand peaks by season and route\n- Build predictive models for tourism, mobility and economics\n- Optimise commercial strategies for agencies, airlines and OTAs\n### \n### **3. Online Reputation**\nCentralise and analyse [accommodation reputation across key platforms](https://connect-api.veetal.app/data-type/reputation)—Booking, TripAdvisor, Expedia, Hotels.com—with structured data ideal for competitive intelligence and brand-positioning.\n**Collected data**\n- Overall ratings per portal (0-100)\n- Total user reviews, broken down by channel\n- Category ranking & relative position versus competitors\n- Time-series evolution and cross-platform comparison\n- Topic-level analysis:\n    - Sleep quality\n    - Cleanliness\n    - Location\n    - Staff service\n    - Value for money\n    - Overall condition\n\n**Applications**\n- Online-reputation audits for accommodations\n- Marketing & branding agencies managing digital presence\n- Reputation-strategy consultancies compiling comparative reports\n- Sentiment and customer-perception analysis models\n### \n### **4. Market Demand**\n[Access predictive data on the real intent to travel to destinations](https://kodytechnolab.com/blog/predictive-analytics-in-travel/). Our API [provides demand curves over time, letting you anticipate tourism trends](https://connect-api.veetal.app/data-type/market).\n\n**What you get**\n- Daily demand curves by city and date\n- Peak-demand and low-season identification\n- Booking-window insights and early-bird behaviour\n\n**Why it matters**\n- Improve [hotel forecasting and optimise revenue management](https://www.trustinsights.ai/insights/webinars-events/predictive-analytics-tourism-hospitality/)\n- Plan promotions and availability around real travel-intent patterns\n- Essential for OTAs, DMOs, airlines, tour operators and digital-marketing agencies\n### \n### **5. Events**\nExplore [a structured dataset](https://connect-api.veetal.app/data-type/events) with [key information on events that directly affect hotel](https://www.smartness.com/en/blog/impact-event-hotel-rates) occupancy and local tourism dynamics. Tap into enriched data to anticipate demand fluctuations and tweak strategy in real time.\n**Included**\n- City-level event calendar with start, end and duration\n- Classification by event type: cultural, sports, trade shows, conferences, entertainment, etc.\n- Attendance estimates and attendee profiles:\n    - Age distribution (youth, adults, seniors)\n    - Segments: couples, families, solo travellers, business, athletes…\n- Precise location (lat/long, city, country)\n- Annual recurrence or one-off status\n\n**Why it’s relevant**\n- Advanced modelling of hotel-price variations by temporal proximity and event relevance\n- Informed decision-making for tour operators, OTAs, consultancies & smart destinations\n- Fine-tuned geo-marketing campaigns and resource planning based on visitor profiles\n\n**Real use case:** Veetal supplies local- and regional-event data to tourist consultancies that model price variations according to each event’s proximity and expected impact.\n## \n## **Why choose Connect API instead of scraping?**\nBecause data should be an advantage, not a hurdle. Veetal’s Connect API is built to give you direct, structured, reliable access to critical tourism information—without the economic, technical, legal and operational headaches of manual scraping.\nIntegration doesn’t just improve data quality and availability—it **dramatically shortens your time-to-market** and grants more flexibility in business decisions.\nScraping, by contrast, incurs high operating costs: you need a dedicated tech team to extract, clean and structure data, and scalability is limited—once your data needs grow, scraped solutions become inefficient and hard to maintain.\nIf you still have doubts about the fundamental differences, check out our article: **“Why is it better to use an API than to do scraping? Tourist data as a competitive advantage.”**\nMeanwhile, here’s a clear comparison:\n\n|          | **Manual Scraping**                             | **Veetal Connect API**                             |\n|---------------------|--------------------------------------------------|----------------------------------------------------|\n| **Time-to-Market**  | Slow; requires manual development & integration | Fast; easy integration in hours                   |\n| **Operating Costs** | High; in-house tech team needed                | Low; pay only for API use                         |\n| **Scalability**     | Limited; struggles as demand grows             | Scalable; extend to new markets or data sources easily |\n| **Data Updates**    | Sporadic, manual, limited                      | Always up to date                                 |\n| **Data Structure**  | Inconsistent and messy                         | Consistent, scalable, easy to integrate           |\n| **Maintenance**     | High; constant monitoring                      | Minimal; handled by Veetal                        |\n| **Support**         | Generic or none                                | Personal, human support                           |\n| **Reliability**     | Variable; depends on scrape quality            | High; validated, guaranteed data                  |\n\n### **Key advantages of Connect API over scraping**\n- **Shorter Time-to-Market:** Access data almost instantly—no complex scraping setup—so your tech team can focus on enhancing the end product, not on data extraction and cleaning.\n- **Lower Costs:** Maintaining an internal scraping team isn’t cheap. With Connect API, you remove these expenses and pay only for what you consume.\n- **Unlimited Scalability:** As data volumes rise or markets shift, scraping becomes a bottleneck. Connect API scales effortlessly; just add new sources—no need to rebuild processes.\n\n## **Easy, fast and hassle-free**\nUnlike many tech solutions, Veetal’s Connect API [is built to make life easier for tech, marketing, data or revenue teams](https://www.switchfly.com/blog/apis-in-the-travel-industry). Implementation takes just hours, and you can test risk-free with **100 free credits and no credit card required**.\n[Our documentation is online](https://connect-api.veetal.app/), and our tech team supports every integration personally.\n## \n## **Who’s already using the Connect API?**\nFrom hotel chains to revenue-management systems and specialist consultancies, many players in tourism already rely on Veetal’s Connect API to make decisions based on trustworthy, up-to-date, ready-to-use data.\nWhether you need to update room rates, monitor online reputation, benchmark prices, analyse user reviews or extract city-level demand insights, Connect API adapts to your processes without forcing you to change tools.\n**One API, multiple strategic uses. We supply the data—you build the value.**\n\n## **Shall we get started today?**\nIf you’re building something in the tourism sector and need reliable, current, ready-to-use data, **Connect API is the perfect starting point.** \n[Request a meeting here](https://connect-api.veetal.app/commercial-meeting).\n","Most travel companies are dealing with the same data problem.\n\nMultiple sources. Different formats. No single source of truth.\nScrapers that break. Feeds that go stale. Pipelines that need constant maintenance.\n\nVeetal Connect API is built for companies that want the data — not the data infrastructure.\n\nWhat you get:\n→ Hotel rates, availability, and competitor data\n→ Flight schedules, fares, and route information\n→ Online reputation data across platforms\n→ One integration, normalized format, production-ready from day one\n\nSmart travel companies don't build data pipelines. They connect to one.\n\nLink in comments 👇\n\n#TravelTech #TourismData #API #ConnectAPI #Veetal",[1015],{"filename":1016},"veetal-connect-api-tourism-data-access-thumbnail.webp",{"id":1018,"fields":1019},"recylNDOCCjei1rC7",{"Header":1020,"Body_es":1023,"Title_es":1024,"Published":802,"Slug_en":1025,"Author":1026,"Title_en":1027,"Summary_en":1028,"Summary_es":1029,"Slug_es":1030,"Date":1031,"Body_en":1032,"LinkedIn post":1033,"Thumbnail":1034},[1021],{"filename":1022},"price-competitiveness-travel-agencies-real-time-data-veetal-connect-api-header.webp","## El problema (sin tecnicismos)\n\nLos feeds/ficheros de mayoristas son útiles, pero son **fotos**. El mercado se mueve en **vídeo**.\n\n- **Desfase de precios**: si tu precio y el de la OTA no cuadran, pierdes credibilidad y CTR.  \n- **OTAs secundarias y fugas de tarifa**: cuando aflora *leakage*, el undercut público erosiona tu margen.  \n- **Vuelos cada vez más dinámicos**: el *dynamic pricing* (y *dynamic offers*) acelera cambios; si tus datos no son frescos, **llegas tarde por definición**.\n\n## Lo que hacemos con Veetal Connect API (y por qué funciona)\n\nCon **Veetal Connect API** cruzamos tus fuentes (por ejemplo, bedbanks e inventario propio) con **lo que ve el usuario final** en Booking, Expedia y metasearch. Resultado: **datos listos para decidir**, alertas de disparidad y acciones claras para recuperar margen y conversión.\n\n**En concreto:**\n- **Ingesta automática** de bedbanks/CSV/APIs y **normalización** (hoteles, room-rates, monedas, impuestos/régimen).  \n- **Comparativa en tiempo real** por hotel/fecha/régimen/dispositivo/geo.  \n- **Alertas de disparidad y accuracy** con umbrales configurables (por ejemplo, undercut >2%).  \n- **Extensión a vuelos** para no quedarte atrás con *dynamic pricing/offer management*.\n\n## Caso práctico (simplificado y realista)\n\nUna agencia integra sus feeds de mayoristas con **Veetal Connect API**:\n\n- En un hotel de Madrid, detectamos que el precio público en su web está **+8%** frente a Booking.  \n- En un MAD–CDG, la agencia aparece **−5%** frente a Expedia (oportunidad clara de captación).\n\nCon esa **foto en vivo**, ajustan reglas de precio/canal y **recuperan reservas** que antes se escapaban. Lo importante no es el número exacto, sino **verlo a tiempo** y **actuar**.\n\n## Tiempo y ROI (números de servilleta)\n\nHablemos claro: esto va de **ahorro de horas** y **ventas que no se escapan**.\n\n- **Menos horas manuales** limpiando y cazando disparidades.  \n- **Más visibilidad en metas** gracias a mejor *price accuracy*.  \n- **Menos fuga de margen** al detectar *leakage* y undercutting **antes** de que impacte la campaña.\n\n**Mini-cálculo:** si gestionas 10.000 búsquedas/semana, conviertes al 2% y el ticket medio es 300 €, subir a **2,3%** gracias a mejor paridad/accuracy implica **+9.000 €** semanales en ventas brutas. Con costes constantes, el **payback** suele llegar **en semanas, no meses**.\n\n## Cómo lo implementamos sin fricción (10–15 días)\n\n1. **Conectar y mapear**: integramos tus fuentes (bedbanks, inventario propio) y normalizamos equivalencias.  \n2. **Comparar en vivo**: activamos datasets de OTAs/metasearch y generamos alertas de disparidad/accuracy.  \n3. **Umbrales y acciones**: reglas tipo “si undercut >X% → ajustar precio/canal y abrir ticket con partner”.  \n4. **Gobernanza de canal**: documentamos casos de *leakage* con evidencia para negociar y cortar la sangría.  \n5. **Escalar a vuelos**: añadimos lógica de *dynamic offers* para mantener coherencia en toda la experiencia.\n\n## Por qué Veetal Connect API\n\n- **Datos frescos y estructurados**, listos para BI o tu propio dashboard.  \n- **Comparativa manzana-con-manzana** (régimen, impuestos, dispositivo, geolocalización).  \n- **Diseñado para agencias**: disparidad, disponibilidad, tarifas, competidores, reputación y vuelos en un solo flujo.\n\n## Conclusión\n\nCompetir hoy significa **ver lo mismo que ve tu cliente en ese segundo** y reaccionar. Con **Veetal Connect API** tienes los datos comparativos **listos para decidir** para que ajustes precio y canal con seguridad.\n\n👉 **¿Lo vemos con tus datos? [Solicita una demo](https://connect-api.veetal.app/book-call)** y en una semana tendrás tus gaps reales sobre la mesa.","Cómo potenciar la competitividad de precios en agencias de viajes con datos en tiempo real","price-competitiveness-travel-agencies-real-time-data-veetal-connect-api",[826],"How to Boost Price Competitiveness in Travel Agencies with Real-Time Data","Every week I see the same pattern: you connect bedbanks, push campaigns, and at the crucial moment an OTA shows a **different price** than yours. That’s where visibility, clicks, and bookings slip away. The honest question is: **does your public price match what the customer sees on Booking or Expedia in that very second?** If you’re not sure, you’re deciding with incomplete information.","Cada semana veo lo mismo: conectas bedbanks, empujas campañas y, en el momento clave, una OTA muestra **otro precio** distinto al tuyo. Ahí se van visibilidad, clics y reservas. La pregunta honesta es: **¿tu precio público coincide con lo que ve el cliente en Booking o Expedia en ese segundo?** Si no lo sabes con certeza, estás decidiendo con información incompleta.","competitividad-precios-agencias-viajes-datos-tiempo-real-veetal-connect-api","2025-09-10","## The Problem (in plain language)\n\nBedbank feeds/files are useful, but they’re **photos**. The market moves in **video**.\n\n- **Price mismatch**: when your price and the OTA’s don’t align, you lose credibility and CTR.  \n- **Secondary OTAs and rate leakage**: when *leakage* surfaces, public undercutting erodes your margin.  \n- **Flights are increasingly dynamic**: *dynamic pricing* and *dynamic offers* accelerate changes; if your data isn’t fresh, **you’re late by definition**.\n\n## What We Do with Veetal Connect API (and why it works)\n\nWith **Veetal Connect API**, we cross your sources (e.g., bedbanks and your own inventory) with **what the end user actually sees** on Booking, Expedia, and metasearch. The result: **decision-ready data**, disparity alerts, and clear actions to recover margin and conversion.\n\n**Specifically:**\n- **Automatic ingestion** of bedbanks/CSV/APIs and **normalization** (hotels, room-rates, currencies, taxes/board).  \n- **Real-time comparison** by hotel/date/board/device/geo.  \n- **Disparity and accuracy alerts** with configurable thresholds (e.g., undercut >2%).  \n- **Flight coverage** so you keep pace with *dynamic pricing/offer management*.\n\n## Practical Case (simple and realistic)\n\nA travel agency integrates its wholesaler feeds with **Veetal Connect API**:\n\n- For a Madrid hotel, we detect the public price on their site is **+8%** versus Booking.  \n- On MAD–CDG, the agency appears **−5%** versus Expedia (clear acquisition opportunity).\n\nWith that **live snapshot**, they adjust price/channel rules and **win back bookings** that were slipping away. The key isn’t the exact number—it’s **seeing it in time** and **acting**.\n\n## Time & ROI (back-of-the-napkin)\n\nLet’s be direct: this is about **saving hours** and **not losing sales**.\n\n- **Fewer manual hours** cleaning data and hunting disparities.  \n- **More metasearch visibility** thanks to better *price accuracy*.  \n- **Less margin leakage** by spotting *leakage* and undercutting **before** it impacts your campaigns.\n\n**Quick math:** if you handle 10,000 searches/week, convert at 2%, and your AOV is €300, increasing to **2.3%** via better parity/accuracy yields **+€9,000** in weekly gross sales. With steady costs, **payback** typically comes **in weeks, not months**.\n\n## How We Implement with Low Friction (10–15 days)\n\n1. **Connect & map**: we integrate your sources (bedbanks, own inventory) and normalize equivalences.  \n2. **Compare live**: we activate OTA/metasearch datasets and generate disparity/accuracy alerts.  \n3. **Thresholds & actions**: rules like “if undercut >X% → adjust price/channel and open a partner ticket.”  \n4. **Channel governance**: we document *leakage* cases with evidence to negotiate and stop the bleeding.  \n5. **Scale to flights**: we add *dynamic offers* logic for consistency across the full journey.\n\n## Why Veetal Connect API\n\n- **Fresh, structured data**, ready for BI or your own dashboard.  \n- **Like-for-like comparison** (board, taxes, device, geolocation).  \n- **Built for agencies**: disparity, availability, rates, competitors, reputation, and flights in one flow.\n\n## Conclusion\n\nCompeting today means **seeing exactly what your customer sees in that second** and reacting. With **Veetal Connect API**, you get **decision-ready comparative data** to adjust price and channel with confidence.\n\n👉 **Want to see it with your data? [Request a demo](https://connect-api.veetal.app/book-call)** and get your real gaps on the table in one week.","Your travel agency has a price competitiveness problem — and you might not even know it.\n\nHere's the scenario that plays out dozens of times a day:\n→ You load rates from your bedbanks\n→ You set your prices\n→ A customer searches, finds an OTA showing a lower price\n→ They book there. You lose the margin.\n\nThe honest question: does your public price match what the customer sees on Booking or Expedia at that exact second?\n\nIf you're not sure — you're deciding with incomplete information.\n\nThe solution isn't better negotiation with bedbanks. It's visibility. Real-time competitor price data, channel by channel, property by property.\n\nFull guide to price competitiveness for travel agencies. Link in comments 👇\n\n#TravelAgency #TravelTech #PriceCompetitiveness #RevenueManagement #TravelData",[1035],{"filename":1036},"price-competitiveness-travel-agencies-real-time-data-veetal-connect-api-thumbnail.webp",[1038,1051,1058,1065],{"id":805,"fields":1039},{"Image":1040,"Posts":1043,"Name":1050},[1041],{"filename":1042},"jordi.webp",[838,1044,1045,795,1046,1047,979,1048,1049],"recT9LYMDMzQNizg9","recDH5do5O5GJI9O4","recE4uVfQku4hVqcQ","recjUYg6ixyobefzL","recfFFygSM37vJnLs","rec63WaoDsSHM4dZx","Jordi Codina",{"id":826,"fields":1052},{"Image":1053,"Posts":1056,"Name":1057},[1054],{"filename":1055},"cristian.webp",[959,998,1018,817,878,858,939],"Cristian Monjo",{"id":907,"fields":1059},{"Image":1060,"Posts":1063,"Name":1064},[1061],{"filename":1062},"marcal.webp",[919,898],"Marçal Panareda",{"id":1066,"fields":1067},"rechAYR9oLVZnIEE6",{"Image":1068,"Name":1071},[1069],{"filename":1070},"ferran.webp","Ferran García",[1073,1106,1137,1170,1201,1229,1262,1296,1329,1359,1386,1414,1441,1469,1496,1525,1552,1580,1607,1634,1663,1691,1717,1744,1775],{"id":423,"fields":1074},{"Prompt":1075,"Minutes":1076,"Title_en":1077,"Datasets":1078,"Published":802,"Build_en":1079,"Needs_import":802,"Seo_description_en":1080,"Endpoint":1081,"Summary_en":1082,"Seo_title_en":1083,"Seo_description_es":1084,"Steps_es":1085,"Order":1086,"Requires":1087,"Summary_es":1089,"Faqs_es":1090,"Seo_title_es":1091,"Build_es":1092,"Date":1093,"Slug_en":1094,"Icon":1095,"Faqs_en":1096,"Slug_es":1097,"Import_entity":33,"Intro_en":1098,"Steps_en":1099,"Curl":1100,"Layer":10,"Title_es":1101,"Intro_es":1102,"Kind":1103,"Call_text_en":1104,"Call_text_es":1105},"Use my Veetal Connect data to build a reputation scorecard for my hotel\nagainst the hotels I compete with.\n\nI want to know where my guest scores beat the set and where they drag, by\ncategory and by OTA, and how that lines up with review volume. Work out what\ndata you need and fetch it.\n\nBuild it as a single self-contained HTML page, plain HTML and CSS:\n\n- A table with one row per property and one column per rating category, one\n  block per OTA.\n- My hotel pinned to the top and visually separated.\n- Colour each cell by whether it is above or below the set average for that\n  category, so my weak spots are obvious.\n- A short summary: my strongest category, my weakest, and the OTA where I\n  stand worst against the set.\n- Show total reviews next to each property — a high score on few reviews is\n  not the same signal as a high score on thousands.\n- Google reports topics guests mention with a sentiment instead of category\n  scores: show those as their own block, not mixed into the category table.\n- Leave anything the data does not carry visibly blank.\n\nClean and readable, works in light and dark.",10,"Reputation Pulse",[158],"A reputation scorecard: your hotel next to its comp set, category by category and OTA by OTA, with the categories where you lead or trail called out and review counts for context.","Read the guest score, review volume and category breakdown of your hotel and its competitor set across Booking.com, TripAdvisor and Google from one Veetal Connect API call.","GET /v2/feed/accommodation/{slug}/reputation","Your guest score, review volume and category breakdown across every OTA, against your comp set.","Reputation Pulse — Hotel Rating & Reviews API — Veetal Connect API","Lee la nota, el volumen de reseñas y el desglose por categoría de tu hotel y su compset en Booking.com, TripAdvisor y Google desde una llamada a Veetal Connect API.","## Consigue tu API key\n\nCrea tu cuenta y copia tu key. Empiezas gratis con 100 créditos.\n\n## Elige tu hotel\n\nLista los alojamientos de tu cuenta y copia el slug del hotel que quieras puntuar.\n\n## Lee el desglose\n\nUna llamada devuelve la nota, las categorías de rating y el total de reseñas de tu hotel y de cada competidor, en todas las OTAs de tu último import.",4,[33,452,1088],"import","Tu nota, volumen de reseñas y desglose por categoría en todas las OTAs, frente al compset.","## ¿Qué OTAs cubre?\n\nTodas las que consultó el import. Un import por defecto cubre Booking.com, TripAdvisor y Google; Expedia y Hotels.com entran si las pides. Cada entrada lleva la OTA de la que viene, y con `?provider=` acotas la respuesta a una sola.\n\n## ¿Qué categorías devuelve?\n\nLas que publica cada OTA — limpieza, confort, ubicación, personal, calidad-precio y demás. Google es la excepción: no puntúa por categorías, cuenta cuántas reseñas mencionan cada tema y cómo de positivas son esas menciones, así que una entrada de Google trae `topics` con su sentimiento en vez de `category_score`.\n\n## ¿Incluye el texto de las reseñas?\n\nNo. Este endpoint devuelve las notas. Para las reseñas individuales y su contenido, usa el endpoint de reseñas del mismo alojamiento.\n\n## ¿Cubre también a mis competidores?\n\nSí. Una llamada devuelve tu alojamiento y cada competidor de tu compset configurado, que es justo lo que hace posible la comparación.\n\n## ¿Cada cuánto cambia?\n\nLos ratings se mueven despacio, así que es dato almacenado y refrescado según la programación de tu cuenta, no una consulta en vivo en cada petición. Cada import deja una foto: con `import_id` o `import_date` lees una anterior y construyes el histórico de la nota.","Pulso de reputación — API de rating y reseñas de hotel — Veetal Connect API","Un scorecard de reputación: tu hotel junto a su compset, categoría a categoría y OTA a OTA, con las categorías donde ganas o pierdes señaladas y el número de reseñas como contexto.","2026-08-19","reputation-pulse","types/reputation","## Which OTAs does it cover?\n\nEvery OTA the import consulted. A default import covers Booking.com, TripAdvisor and Google; Expedia and Hotels.com come in when you ask for them. Each entry carries the OTA it comes from, and `?provider=` narrows the response to one.\n\n## Which categories are returned?\n\nThe categories each OTA publishes — cleanliness, comfort, location, staff, value and so on. Google is the exception: it does not score categories, it counts how many reviews mention each topic and how positive those mentions are, so a Google entry brings `topics` with its sentiment instead of `category_score`.\n\n## Does it include the review text?\n\nNo. This endpoint returns the scores. For the individual reviews and their content, use the reviews endpoint of the same accommodation.\n\n## Does it cover my competitors too?\n\nYes. One call returns your accommodation and each competitor in your configured set, which is what makes the comparison possible.\n\n## How often does it change?\n\nRatings move slowly, so this is stored data refreshed on your account schedule rather than fetched live on every request. Each import leaves a snapshot: pass `import_id` or `import_date` to read an older one and build the history of a score.","pulso-reputacion","Reputation moves rate power. This recipe reads the guest score, the review count and the category breakdown of your hotel and every competitor in your set, on each OTA the import covered — Booking.com, TripAdvisor and Google by default, plus Expedia and Hotels.com when you ask for them. Every entry says which OTA it comes from.","## Get your API key\n\nCreate your account and copy your key. Start free with 100 API credits.\n\n## Pick your hotel\n\nList the accommodations on your account and copy the slug of the hotel you want to score.\n\n## Read the breakdown\n\nOne call returns the score, the rating categories and the total reviews for your hotel and each competitor, on every OTA of your latest import.","curl \"https://api.veetal.app/v2/feed/accommodation/YOUR_HOTEL_SLUG/reputation\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Pulso de reputación","La reputación mueve tu capacidad de tarifa. Esta receta lee la nota, el número de reseñas y el desglose por categoría de tu hotel y de cada competidor de tu compset, en cada OTA que cubrió el import — Booking.com, TripAdvisor y Google por defecto, más Expedia y Hotels.com si las pides. Cada entrada dice de qué OTA viene.","mcp","One request returns the score, the review count and the category breakdown for your hotel and each competitor, on every OTA of the latest import. Swap in your hotel slug and your key. Add `?provider=booking` to narrow it to a single OTA.","Una petición devuelve la nota, el número de reseñas y el desglose por categoría de tu hotel y de cada competidor, en todas las OTAs del último import. Pon el slug de tu hotel y tu key. Añade `?provider=booking` para acotarlo a una sola OTA.",{"id":472,"fields":1107},{"Prompt":1108,"Minutes":1076,"Title_en":1109,"Datasets":1110,"Published":802,"Build_en":1111,"Seo_description_en":1112,"Endpoint":1113,"Summary_en":1114,"Seo_title_en":1115,"Seo_description_es":1116,"Steps_es":1117,"Order":43,"Requires":1118,"Summary_es":1119,"Featured":802,"Faqs_es":1120,"Demo_text_es":1121,"Seo_title_es":1122,"Build_es":1123,"Date":1093,"Slug_en":1124,"Demo_text_en":1125,"Icon":1126,"Faqs_en":1127,"Slug_es":1128,"Demo_url":1129,"Intro_en":1130,"Steps_en":1131,"Curl":1132,"Layer":10,"Title_es":1133,"Intro_es":1134,"Kind":1103,"Call_text_en":1135,"Call_text_es":1136},"Use my Veetal Connect data to build an \"Event Demand Radar\" for Barcelona,\ncovering the next 12 months.\n\nI want to know which events will drive hotel demand in the city, how hard they'll\npush it, and when to price for them. Work out what data you need and fetch it.\n\nBuild it as a single self-contained web page I can open and share:\n\n- A year view: one bar per month showing how much hotel demand that month carries.\n  I click a month to explore it.\n- The selected month: its events ranked by how hard they squeeze the city, each\n  showing how busy it gets and how many roomnights it brings.\n- An event detail: how demand builds and fades day by day, which hotel tiers absorb\n  it, when the booking window opens and closes, who actually shows up - separating\n  the people who sleep in a hotel from locals who don't - and how far out from the\n  venue they stay.\n- Surface where attendance is misleading: big crowds that generate little hotel\n  demand, and smaller events that generate a lot.\n- Flag anything that pushes the city past its room capacity.\n\nTwo layouts, switchable: a full page, and a compact floating widget pinned to the\nbottom-right corner that shows the month navigator and that month's top events.\n\nClean and modern, works in light and dark. Use only real values from my data -\nnever invent numbers. If something isn't available, leave it out.","Event Demand Radar",[85],"A demand calendar for any city: events ranked by how hard they squeeze hotel inventory, each with a day-by-day roomnights curve split by hotel tier, the booking window, who actually sleeps in a hotel versus locals who don't, and how far from the venue they stay.","Turn a city's events into hotel demand: roomnights per day, pressure vs. room inventory and booking window, from one Veetal Connect API call.","GET /v2/feed/events/{location_id}","Every event that will move hotel demand in a city, with roomnights, pressure and booking window.","Event Demand Radar — Hotel Demand from City Events API — Veetal","Convierte los eventos de una ciudad en demanda hotelera: roomnights por día, presión vs. inventario y ventana de reserva, desde una sola llamada a Veetal Connect API.","## Consigue tu API key\n\nCrea tu cuenta y copia tu key. Empiezas gratis con 100 créditos.\n\n## Elige tu ciudad\n\nLista las ubicaciones configuradas en tu cuenta y copia el id de la ciudad que quieres seguir.\n\n## Pide el feed de eventos\n\nIndica un rango de fechas y un impacto mínimo. Cada evento vuelve con su demanda hotelera ya calculada.",[20],"Cada evento que moverá la demanda hotelera de una ciudad, con roomnights, presión y ventana de reserva.","## ¿De dónde sale el impacto hotelero?\n\nVeetal combina un catálogo de eventos con un modelo de impacto hotelero que estima la asistencia, la reparte en perfiles de audiencia y la convierte en roomnights, presión sobre el inventario de habitaciones de la ciudad, ventana de reserva y distribución geográfica.\n\n## ¿Esto es scraping en vivo?\n\nNo. Eventos es un dataset Feed pre-procesado, así que es rápido de leer y ya viene enriquecido. Recibes JSON estructurado, no páginas en bruto.\n\n## ¿Por qué no basta con contar asistentes?\n\nLa asistencia por sí sola engaña. Una fiesta de barrio puede reunir más de un millón de personas y generar menos roomnights que un festival internacional de 60.000 visitantes, porque la mayoría son locales que no reservan habitación. El modelo separa ambos casos.\n\n## ¿Qué significa la presión?\n\nEs la parte del inventario de habitaciones de la ciudad que el evento demanda una noche concreta. Puede superar el 100%, lo que significa que la demanda supera a las habitaciones disponibles — una señal de lleno total.","Un dashboard funcional construido con datos reales de Barcelona: 92 eventos en 12 meses, con navegación por meses, detalle por evento y formato de widget flotante.","Radar de Demanda por Eventos — API de demanda hotelera — Veetal","Un calendario de demanda para cualquier ciudad: eventos ordenados por cuánto aprietan el inventario hotelero, cada uno con su curva diaria de roomnights repartida por categoría de hotel, la ventana de reserva, quién duerme de verdad en un hotel frente a los locales que no, y a qué distancia del recinto se alojan.","event-demand-radar","A working dashboard built on real Barcelona data: 92 events across 12 months, with month navigation, per-event detail and a floating widget layout.","types/events","## Where does the hotel impact come from?\n\nVeetal combines an events catalogue with a hotel-impact model that estimates attendance, splits it into audience profiles, and converts it into roomnights, pressure against the city room inventory, booking window and geographic distribution.\n\n## Is this live scraping?\n\nNo. Events is a pre-processed Feed dataset, so it is fast to read and already enriched. You get structured JSON, not raw pages.\n\n## Why not just count attendance?\n\nAttendance alone misleads. A street festival can draw over a million people and generate fewer roomnights than a 60,000-visitor international festival, because most attendees are locals who don't book a room. The model separates the two.\n\n## What does pressure mean?\n\nIt is the share of the city's room inventory the event demands on a given night. It can exceed 100%, which means demand outstrips the rooms available — a sell-out signal.","radar-demanda-eventos","https://claude.ai/code/artifact/40ff4ac3-3774-4709-89f2-930e4ec6db6a","See which events will fill a city before your comp-set does. For every event: the extra hotel roomnights it generates, how hard it presses the city's room inventory, and the booking window you need to price ahead of.","## Get your API key\n\nCreate your account and copy your key. Start free with 100 API credits.\n\n## Pick your city\n\nList the locations configured on your account and copy the id of the city you want to track.\n\n## Pull the events feed\n\nAsk for a date range and a minimum impact. Every event comes back with its hotel demand already modelled.","curl \"https://api.veetal.app/v2/feed/events/YOUR_LOCATION_ID?from_date=2026-08-01&to_date=2027-07-31&min_impact=medium\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Radar de Demanda por Eventos","Descubre qué eventos llenarán una ciudad antes que tu competencia. Para cada evento: las roomnights extra que genera, cuánto presiona el inventario de habitaciones de la ciudad, y la ventana de reserva por delante de la cual debes tarificar.","One request returns every event with its hotel impact already modelled. Swap in your location id and your key.","Una petición devuelve todos los eventos con su impacto hotelero ya calculado. Pon tu id de ubicación y tu key.",{"id":1138,"fields":1139},"rec7RB6yEqFaoBjHL",{"Minutes":1076,"Title_en":1140,"Published":802,"Build_en":1141,"Seo_description_en":1142,"Endpoint":1143,"Summary_en":1144,"Seo_title_en":1145,"Seo_description_es":1146,"Steps_es":1147,"Body_es":1148,"Body_en":1149,"Order":1150,"Summary_es":1151,"Faqs_es":1152,"Seo_title_es":1153,"Build_es":1154,"Date":1155,"Slug_en":1156,"Icon":1157,"Faqs_en":1158,"Slug_es":1159,"Dashboard_url":1160,"Intro_en":1161,"Steps_en":1162,"Curl":1163,"Layer":1164,"Title_es":1165,"Intro_es":1166,"Kind":1167,"Call_text_en":1168,"Call_text_es":1169},"Control what you spend in credits","A read of your billing period you can defend: the feed/realtime/account split, who triggered each run, which answers came from cache, the exact arithmetic behind any charge, and the three estimators that price a scenario before you commit.","Read your Veetal billing period properly: feed vs realtime credits, who triggered each run, the exact credit calculation behind any charge, and how to estimate before you spend.","GET /v2/account/customer-info","Answer what you spent, why a given line cost what it cost, and what a new scenario would cost — with the step-by-step credit calculation the dashboard hides behind one icon.","Control your Veetal credit spend — Veetal","Lee bien tu periodo de facturación de Veetal: créditos feed y realtime, quién lanzó cada ejecución, el cálculo exacto detrás de cualquier cargo y cómo estimar antes de gastar.","## Parte el total como cobra el producto\n\nEn Billing / Usage, lee la barra de resumen: los créditos feed, realtime y account son tres economías distintas. El feed cobra por entidad y por día de visibilidad, el realtime por petición. Revisa el selector de Period — es el periodo de facturación y arrastra el plan vigente entonces.\n\n## Averigua quién lanzó el gasto\n\nEn la tabla, TRIGGER señala al culpable: scheduled es tu automatización, manual es una persona, api es tu integración, recovery es un reintento. CACHED te dice por qué algunas líneas no cuestan nada.\n\n## Abre el cálculo\n\nEl último icono de ACTIONS abre Calculation details, que enseña la multiplicación en sí: base executions x número de entidades x días de visibilidad x créditos por unidad. Ahí una línea de 437 créditos deja de ser un misterio y se convierte en dos palancas que puedes mover.\n\n## Estima antes de gastar\n\nEl diálogo de import estima la ejecución, el estimador del schedule añade el equivalente mensual, y la pestaña de Simulaciones pone precio a un escenario entero sin gastar nada.\n\n## Saca los números\n\nExport te da el periodo en XLSX, una fila por línea. No hay endpoint público de consumo: customer-info devuelve tu plan y tus límites, no tus créditos.","Al terminar sabrás responder tres preguntas con números leídos de la pantalla en vez de a ojo: **cuánto he gastado, por qué esa línea concreta ha costado lo que ha costado, y cuánto me costaría hacer X.**\n\n**Qué necesitas:** nada. Todo lo de aquí es gratis de leer, y el simulador es gratis de usar.\n\n## Primero el chip, luego la pantalla\n\nEl chip de créditos de la cabecera es la versión de un vistazo — consumido en el periodo, y un aviso si te has pasado. Al pulsarlo entras en [Billing · Usage](https://dashboard.veetal.app/billing/usage), que es donde está la respuesta de verdad.\n\nEmpieza por la barra de resumen, porque parte el total igual que cobra el producto:\n\n![La barra de resumen del consumo](/images-webp/recipes/control-your-credit-spend/01-usage-summary.webp)\n\nLos créditos **Feed**, **Realtime** y **Account** son tres economías distintas. El Feed se cobra por ejecución de import — por entidad y por día de visibilidad. El Realtime se cobra por petición. El de Account es casi gratis y solo aparece porque algunos endpoints tienen precio. Súmalos y tienes **Total credits**; multiplícalo por tu **Cost** por 1.000 créditos y tienes los euros.\n\nEl selector de **Period** importa más de lo que parece: es el periodo *de facturación*, y arrastra el plan que estaba vigente entonces. No respondas \"cuánto gastamos\" desde el periodo actual si la pregunta era del mes pasado.\n\n## Lee la tabla antes de concluir nada\n\n![La tabla de consumo con sus columnas de trigger y caché](/images-webp/recipes/control-your-credit-spend/02-usage-table.webp)\n\nDos columnas hacen casi toda la explicación:\n\n- **TRIGGER** — quién lo lanzó. `scheduled` es tu propia automatización, `manual` es alguien pulsando el botón en el dashboard, `api` es tu integración llamando, `recovery` es Veetal reintentando un fallo. Cuando una factura te sorprenda, esta columna suele señalar al culpable.\n- **CACHED** — si la respuesta vino de caché. Una respuesta cacheada no cobra o cobra menos, y es la primera explicación de \"¿por qué esta no me ha costado nada?\".\n\nEn la tabla de arriba se ve el mes entero de un vistazo: tres ejecuciones de **Accommodation Rates** a **437 créditos** cada una lanzadas por `api`, una de **Reputation** a 20 lanzada por `scheduled`, dos imports de **Booking Location Search** a **0,32** lanzados a mano, y un puñado de llamadas real-time de **Booking Search** a **1,18**. Tres ejecuciones disparadas por api se llevan más de la mitad del periodo.\n\n## ¿Por qué ha costado *eso*? — el cálculo\n\nEsta es la parte que casi nadie encuentra. El último icono de **ACTIONS** abre **Calculation details**, y enseña la aritmética, no un resumen de ella:\n\n![El cálculo de créditos desglosado paso a paso](/images-webp/recipes/control-your-credit-spend/03-calculation-details.webp)\n\nLéelo de abajo arriba:\n\n```\n0,0328 (base executions) × 19 (alojamientos) × 14 (visibilityDays) × 50 (créditos/unidad) = 436,07\n```\n\nAsí que los 437 créditos no eran ningún misterio: **19 hoteles, 14 días de visibilidad hacia delante, 50 créditos por unidad**. Lo que te dice de inmediato cuáles son las dos palancas —bajar el número de entidades o bajar la ventana de visibilidad— y más o menos cuánto ahorraría cada una. El diálogo trae además `pricePerCreditApplied` y `costCalculation`, para que veas los euros y no solo los créditos.\n\nNo reconstruyas esto a mano nunca. La fórmula vive en el producto y cambia según la API; este diálogo es la autoridad.\n\n## Antes de gastar: estima, no adivines\n\nHay dos estimadores que corren *antes* de que se mueva el dinero:\n\n- **El diálogo de import.** Todo import Feed enseña un **Estimated cost** con las entidades y los parámetros que has elegido. Cambia los días de visibilidad y míralo moverse.\n- **El estimador del schedule.** Al crear o editar una programación te enseña el coste por ejecución *y* el equivalente mensual según la frecuencia elegida. Ese segundo número es el que decide si un schedule diario tiene sentido.\n\nY para la pregunta grande —*\"¿cuánto nos costaría cubrir 40 hoteles y 3 ciudades?\"*— están las [Simulaciones](https://dashboard.veetal.app/billing/simulations): montas el escenario, le añades las APIs con sus parámetros y lees los totales. No gasta nada. Es la herramienta correcta para dimensionar un plan o responder a un cliente, y gana a la cuenta de la servilleta.\n\n## Sacarlo del dashboard\n\n**Export** te da el periodo en XLSX, una fila por línea de consumo, que es lo que quieres para cuadrarlo contra tus propios números. **Billing data** guarda los datos de facturación, y en [Invoices](https://dashboard.veetal.app/billing/invoices) están las facturas emitidas con su PDF.\n\nUna cosa que la API *no* hace hoy: no hay ningún endpoint público que devuelva tu consumo. `GET /v2/account/customer-info` te da el plan, los límites de concurrencia, las IPs autorizadas, el webhook y tus schedules —útil para conocer tus techos— pero las cifras de créditos viven en el dashboard y en el export XLSX.\n\n## Qué pasa después\n\nSi el patrón que encuentras es \"nos pasamos siempre\", en [Plans](https://dashboard.veetal.app/billing/plans) se cambia de tramo —mensual o anual, con el descuento anual— y un downgrade pendiente se puede cancelar desde esa misma pantalla hasta que entre en vigor. Si el patrón es \"hay una API que se lo come todo\", la pestaña **Usage** de esa API enseña la misma tabla ya filtrada, que suele ser la vía rápida para dar con el schedule culpable.","By the end you will be able to answer three questions with numbers off the screen instead of guesses: **what have I spent, why did that particular line cost what it cost, and what would it cost me to do X.**\n\n**What you need:** nothing. Everything here is free to read, and the simulator is free to run.\n\n## The chip, then the screen\n\nThe credits chip in the header is the glance version — consumed this period, and a warning if you have gone over. Clicking it takes you to [Billing · Usage](https://dashboard.veetal.app/billing/usage), which is where the real answer lives.\n\nStart with the summary bar, because it splits the total the way the product actually charges:\n\n![The usage summary bar](/images-webp/recipes/control-your-credit-spend/01-usage-summary.webp)\n\n**Feed**, **Realtime** and **Account** credits are three different economics. Feed is charged per import execution — per entity, per day of visibility. Realtime is charged per request. Account is nearly free and only appears because some endpoints have a price. Add them up and you get **Total credits**; multiply by your **Cost** per 1.000 credits and you get the euros.\n\nThe **Period** selector matters more than it looks: it is the *billing* period, and it carries the plan that was in force then. Don't answer \"how much did we spend\" from the current period if the question was about last month.\n\n## Read the table before you conclude anything\n\n![The usage table with its trigger and cached columns](/images-webp/recipes/control-your-credit-spend/02-usage-table.webp)\n\nTwo columns do most of the explaining:\n\n- **TRIGGER** — who started it. `scheduled` is your own automation, `manual` is somebody pressing the button in the dashboard, `api` is your integration calling in, `recovery` is Veetal retrying a failure. When a bill surprises you, this column usually names the culprit.\n- **CACHED** — whether the answer came from cache. A cached response costs nothing or less, and it is the first explanation for \"why was this one free?\".\n\nIn the table above the whole month is visible at a glance: three **Accommodation Rates** runs at **437 credits** each triggered by `api`, one **Reputation** run at 20 triggered by `scheduled`, two **Booking Location Search** imports at **0,32** each launched by hand, and a handful of **Booking Search** real-time calls at **1,18**. Three api-triggered runs account for more than half the period.\n\n## Why did *that* cost that? — the calculation\n\nThis is the part most people never find. The last icon in **ACTIONS** opens **Calculation details**, and it shows the arithmetic, not a summary of it:\n\n![The credit calculation broken down step by step](/images-webp/recipes/control-your-credit-spend/03-calculation-details.webp)\n\nRead it bottom up:\n\n```\n0.0328 (base executions) × 19 (accommodations) × 14 (visibilityDays) × 50 (credits/unit) = 436.07\n```\n\nSo the 437 credits were not a mystery: **19 hotels, 14 days of forward visibility, 50 credits per unit**. Which immediately tells you the two levers — drop the entity count or drop the visibility window — and roughly what each would save. The dialog also carries `pricePerCreditApplied` and `costCalculation`, so you can see the euros as well as the credits.\n\nNever reconstruct this by hand. The formula lives in the product and it changes per API; this dialog is the authority.\n\n## Before you spend: estimate, don't guess\n\nTwo estimators run *before* the money moves:\n\n- **The import dialog.** Every Feed import shows an **Estimated cost** with the entities and parameters you picked. Change the visibility days and watch it move.\n- **The schedule estimator.** When you create or edit a schedule, it shows the cost per run *and* the monthly equivalent for the frequency you chose. That second number is the one that decides whether a daily schedule is sane.\n\nAnd for the bigger question — *\"what would it cost us to cover 40 hotels and 3 cities?\"* — there is [Simulations](https://dashboard.veetal.app/billing/simulations): you build the scenario, add the APIs with their parameters, and read the totals. It spends nothing. It is the right tool for sizing a plan or answering a customer, and it beats arithmetic on a napkin.\n\n## Getting it out of the dashboard\n\n**Export** gives you the period as XLSX, one row per consumption line, which is what you want for reconciling against your own numbers. **Billing data** holds the invoicing details, and [Invoices](https://dashboard.veetal.app/billing/invoices) has the issued invoices with their PDFs.\n\nOne thing the API does *not* do today: there is no public endpoint that returns your consumption. `GET /v2/account/customer-info` gives you the plan, the concurrency limits, the authorised IPs, the webhook and your schedules — useful for knowing your ceilings — but the credit figures live in the dashboard and in the XLSX export.\n\n## What happens next\n\nIf the pattern you find is \"we are consistently over\", [Plans](https://dashboard.veetal.app/billing/plans) is where you change tier — monthly or annual, with the annual discount — and a pending downgrade can be cancelled from the same screen until it takes effect. If the pattern is \"one API is eating everything\", the per-API **Usage** tab on that API's page shows the same table filtered, which is usually a faster way to find the offending schedule.",15,"Responde cuánto has gastado, por qué una línea concreta costó lo que costó y cuánto costaría un escenario nuevo — con el cálculo de créditos paso a paso que el dashboard esconde tras un icono.","## ¿Por qué esta petición no me ha costado nada?\n\nMira la columna CACHED. Una respuesta servida desde caché no cobra o cobra menos que una fresca. El segundo sitio donde mirar es TRIGGER: una ejecución que no lanzaste tú puede ser un schedule o un reintento de recovery.\n\n## ¿Qué es exactamente un crédito?\n\nUna unidad de trabajo, con precio distinto según la API. Los endpoints realtime cobran por petición. Los imports Feed cobran por entidad y por día de visibilidad, multiplicado por una cifra de créditos por unidad que es propia de esa API. El diálogo de Calculation details enseña la multiplicación exacta de cualquier línea, que es la única forma fiable de saberlo.\n\n## ¿Por qué un import son 437 créditos y otro 0,32?\n\nPorque la fórmula multiplica. El de 437 cubría 19 alojamientos por 14 días de visibilidad a 50 créditos por unidad; el de 0,32 era una sola búsqueda de destino para una noche. El número de entidades y la ventana de visibilidad son las dos palancas, y las dos se ven en el diálogo de import antes de lanzar.\n\n## ¿Cómo sé lo que va a costar algo antes de ejecutarlo?\n\nTres sitios, de menor a mayor: el Estimated cost del diálogo de import, las cifras por ejecución y mensual del estimador del schedule, y la pestaña de Simulaciones para un escenario entero. Los tres son gratis.\n\n## ¿Puedo sacar mi consumo por API?\n\nHoy no. No hay endpoint público de consumo. GET /v2/account/customer-info devuelve tu plan, los límites de concurrencia, las IPs autorizadas, el webhook y tus schedules, pero no los créditos consumidos. Para el consumo, usa el dashboard o el export a XLSX.\n\n## El chip dice que me he pasado del plan. ¿Qué pasa ahora?\n\nEl consumo por encima de tu plan se factura on demand a tu precio por crédito, que aparece en la barra de resumen como Cost por 1.000 créditos. La pestaña Plans es donde se cambia de tramo si eso pasa a ser la norma y no la excepción.","Controla tu consumo de créditos — Veetal","Una lectura de tu periodo que puedes defender: el reparto feed/realtime/account, quién lanzó cada ejecución, qué respuestas vinieron de caché, la aritmética exacta detrás de cualquier cargo y los tres estimadores que ponen precio a un escenario antes de comprometerte.","2026-08-20","control-your-credit-spend","types/custom","## Why did this request cost me nothing?\n\nLook at the CACHED column. A response served from cache costs nothing or less than a fresh one. The second place to look is TRIGGER: a run you didn't start yourself may be a schedule or a recovery retry.\n\n## What exactly is a credit?\n\nA unit of work, priced differently per API. Realtime endpoints charge per request. Feed imports charge per entity and per day of visibility, times a credits-per-unit figure that belongs to that API. The Calculation details dialog shows the exact multiplication for any line, which is the only reliable way to know.\n\n## Why is one import 437 credits and another 0,32?\n\nBecause the formula multiplies. The 437 one covered 19 accommodations across 14 days of visibility at 50 credits per unit; the 0,32 one was a single location search for one night. Entity count and visibility window are the two levers, and both are visible in the import dialog before you launch.\n\n## How do I find out what something will cost before running it?\n\nThree places, in order of size: the Estimated cost in the import dialog, the per-run and monthly figures in the schedule estimator, and the Simulations tab for a whole scenario. All three are free.\n\n## Can I pull my consumption over the API?\n\nNot today. There is no public usage endpoint. GET /v2/account/customer-info returns your plan, concurrency limits, authorised IPs, webhook and schedules, but not credits consumed. For consumption, use the dashboard or the XLSX export.\n\n## The credits chip says I have exceeded my plan. What happens?\n\nConsumption above your plan is billed on demand at your price per credit, which appears in the summary bar as Cost per 1.000 credits. The Plans tab is where you change tier if that becomes the norm rather than the exception.","controlar-tu-consumo","https://dashboard.veetal.app/billing/usage","Credits are the money of the product, and most of the surprise in a bill comes from two columns and one dialog nobody opens. Here is where the numbers are, how the multiplication works, and how to estimate before you spend instead of after.","## Split the total the way the product charges\n\nOn Billing / Usage, read the summary bar: feed, realtime and account credits are three different economics. Feed charges per entity and per day of visibility, realtime per request. Check the Period selector — it is the billing period and carries the plan in force then.\n\n## Find who triggered the spend\n\nIn the table, TRIGGER names the culprit: scheduled is your automation, manual is a person, api is your integration, recovery is a retry. CACHED tells you why some lines cost nothing.\n\n## Open the calculation\n\nThe last icon in ACTIONS opens Calculation details, which shows the multiplication itself: base executions x entity count x visibility days x credits per unit. That is where a 437-credit line stops being a mystery and becomes two levers you can pull.\n\n## Estimate before you spend\n\nThe import dialog estimates the run, the schedule estimator adds the monthly equivalent, and the Simulations tab prices a whole scenario without spending anything.\n\n## Get the numbers out\n\nExport gives you the period as XLSX, one row per line. There is no public usage endpoint: customer-info returns your plan and limits, not your credits.","curl \"https://api.veetal.app/v2/account/customer-info\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"\n\n# devuelve plan.name, plan.concurrent_requests, authorized_ips,\n# webhook y schedules — no el consumo en créditos","account","Controla lo que gastas en créditos","Los créditos son el dinero del producto, y casi todas las sorpresas de una factura salen de dos columnas y un diálogo que nadie abre. Aquí está dónde viven los números, cómo funciona la multiplicación y cómo estimar antes de gastar en vez de después.","code","What the API can tell you about your account: plan, concurrency limits, authorised IPs, webhook and schedules. Not your credits — those live in the dashboard and the XLSX export.","Lo que la API sí te cuenta de tu cuenta: plan, límites de concurrencia, IPs autorizadas, webhook y schedules. Tus créditos no — esos viven en el dashboard y en el export XLSX.",{"id":456,"fields":1171},{"Minutes":1076,"Title_en":1172,"Datasets":1173,"Published":802,"Build_en":1174,"Seo_description_en":1175,"Endpoint":1176,"Summary_en":1177,"Seo_title_en":1178,"Seo_description_es":1179,"Steps_es":1180,"Body_es":1181,"Body_en":1182,"Order":1183,"Summary_es":1184,"Faqs_es":1185,"Seo_title_es":1186,"Build_es":1187,"Date":1188,"Slug_en":1189,"Icon":1190,"Faqs_en":1191,"Slug_es":1192,"Dashboard_url":1193,"Intro_en":1194,"Steps_en":1195,"Curl":1196,"Layer":1164,"Title_es":1197,"Intro_es":1198,"Kind":1167,"Call_text_en":1199,"Call_text_es":1200},"Add your hotel and the comp set you price against",[116],"A hotel registered on your account with its slug and its OTA profiles detected, up to ten competitors attached to it, and the free call that reads the set back — which is where the comparison recipes get the slugs they loop over.","Register a hotel on Veetal, check the OTA profiles it resolved and attach up to ten competitors — the account setup every rate, parity and reputation endpoint assumes.","GET /v2/account/accommodation/{accommodation}/competitors","The hotel is half the setup. Without the competitors attached, every rate, parity and reputation answer comes back about you alone — which is a price list, not a comparison.","Add a hotel and its competitor set — Veetal Connect API","Da de alta un hotel en Veetal, comprueba los perfiles de OTA que resuelve y engánchale hasta diez competidores — el montaje de cuenta que dan por hecho las APIs de tarifas, paridad y reputación.","## Da de alta el hotel\n\nEn Accommodations, Add accommodations. Busca en Booking por nombre, pega la URL de la ficha cuando la búsqueda sea ambigua, o sube un .csv/.xls para hacerlo en bloque.\n\n## Mira qué perfiles ha encontrado\n\nLa pantalla de confirmación enseña en qué OTAs tiene ficha el hotel de verdad. Una OTA sin perfil no tiene nada que importar después, así que esta pantalla es una previsión de lo que podrán devolverte los feeds de reputación y tarifas.\n\n## Copia el slug, no lo adivines\n\nVeetal construye el slug desde la URL de Booking, no desde el nombre visible. \"Ohla Barcelona\" se convierte en ohla, y el slug es lo que piden todos los endpoints.\n\n## Engancha hasta diez competidores\n\nEn el detalle del alojamiento, añade los hoteles entre los que un huésped elige de verdad, no la ciudad entera. Este es el paso que convierte cada respuesta posterior en una comparación.\n\n## Lee el compset por API\n\nGET /v2/account/accommodation/{accommodation}/competitors devuelve tus rivales con los identificadores que piden las llamadas de tarifas, paridad y reputación. Es gratis, y es la lista que recorren las recetas de parrilla.","Al terminar tendrás un hotel en tu cuenta con su slug, sus perfiles de OTA detectados y sus competidores enganchados — el montaje que todos los endpoints de comparación de Veetal dan por hecho que ya hiciste.\n\n**Qué necesitas:** una cuenta con la Account API activa. Nada más.\n\n**Qué cuesta:** nada. Crear el hotel, resolverlo contra Booking y engancharle competidores son operaciones gratuitas. Lo que sí cambia el compset es lo que cuesta una importación después, y esa parte conviene leerla antes de lanzar ninguna.\n\n## Por qué el compset no es opcional\n\nLos endpoints de comparación de Veetal no reciben la lista de rivales como parámetro: leen el compset configurado en el hotel. Así que el tamaño de tu compset decide la forma de la respuesta:\n\n- Las **tarifas** vuelven como `{ report: { [slug]: [rate, ...] } }` — tu hotel *y cada competidor en el mismo payload*. Con el compset vacío, ese objeto tiene una sola clave: la tuya.\n- La **paridad** es un score contra el compset. Sin nada contra lo que comparar, no hay score que calcular.\n- La **reputación** y las **reseñas** traen un bloque `competitors` que llega vacío si el compset lo está. El endpoint de reseñas además trae `include_competitors` a `true` por defecto, así que un compset vacío es la diferencia entre un benchmark y una lectura en solitario.\n- La **parrilla de tarifas en vivo** es una llamada por establecimiento del compset. Sin compset no hay parrilla.\n\nEsta es también la parte de Veetal que una API de scraping a secas no tiene. El compset es configuración almacenada, no un parámetro que reconstruyes en cada llamada.\n\n## 1. Da de alta el hotel\n\nEn [Accommodations](https://dashboard.veetal.app/account/accommodations), **Add accommodations**. El asistente abre con tres caminos:\n\n- **Search Booking accommodation** — el habitual.\n- **I have accommodation Booking URL** — para cuando la búsqueda es ambigua y ya tienes la ficha abierta.\n- **Import accommodations from .csv/.xls file** — la vía en bloque, y la forma sensata de cargar una cartera.\n\nBusca por nombre. Los resultados traen la foto y la ciudad del hotel, y vienen etiquetados:\n\n- **It's yours** — ya es uno de tus alojamientos. Sale en gris, que te ahorra el duplicado.\n- **Is competitor** — ya es competidor de alguno de tus hoteles.\n- **Is existing** — la ficha ya está en la base de datos de Veetal porque otro la sigue. Se reutiliza en vez de crearse otra vez, y por eso resuelve al instante.\n\nSi no encuentras nada, usa *menos* palabras: la búsqueda casa con Booking de forma aproximada, no con tu cadena exacta.\n\n## 2. Mira qué perfiles ha encontrado\n\nElige uno y **Continue**. Veetal resuelve la ficha de verdad y te enseña lo que ha encontrado — estrellas, nota de huéspedes, número de reseñas, dirección — más **Profiles Found**: las OTAs en las que este hotel tiene ficha realmente.\n\nEse bloque es una previsión. Una OTA sin perfil no tiene nada que importar, y el feed de reputación solo devolverá las que tengan el tick verde. **Repeat search profiles** vuelve a lanzar la detección si crees que se ha dejado alguna, y **View Profile** abre la ficha que ha casado para que confirmes que es el establecimiento correcto antes de que aterrice en tu cuenta.\n\nUna vez añadido, la columna **SETUP** de la fila mantiene ese mapa de perfiles, una insignia por OTA.\n\n## 3. El slug no es el nombre\n\nEl **slug** que asigna Veetal sale de la URL de Booking, no del nombre visible. \"Ohla Barcelona\" se quedó en `ohla`.\n\nTodos los endpoints piden el slug, así que cópialo de la fila en vez de deducirlo del nombre del hotel. La mitad de los \"el endpoint no devuelve nada\" son un slug escrito de memoria.\n\n## 4. Engancha hasta diez competidores\n\nAbre el hotel desde el listado y añade los competidores desde su detalle, con el mismo buscador que usaste para el hotel — por eso los resultados de búsqueda ya saben decirte que un establecimiento **Is competitor**.\n\nDos cosas deciden si este paso sirve de algo:\n\n**Quién entra en el compset.** Un huésped que elige tu hotel no está eligiendo entre todos los hoteles de la ciudad: está eligiendo entre el puñado de tu barrio, en tu banda de precio, para sus fechas. Un compset de diez hoteles que un huésped compara de verdad vale más que uno de diez hoteles que comparten tus estrellas y nada más.\n\n**Qué cuesta cada uno.** El tope son diez, y es un tope por algo: **cada competidor multiplica el coste de cada importación**. Un hotel con 5 competidores en 3 OTAs son 18 fichas por ejecución, no 3. El dashboard enseña la estimación de créditos antes de lanzar una importación — léela ahí, no en la factura.\n\n![El compset de un hotel en su detalle: diez competidores enganchados, cada uno con su ciudad y su categoría, y el contador 10/10](/images-webp/recipes/add-your-hotel-and-its-comp-set/01-compset.webp)\n\n## 5. Lee el compset desde la API\n\n```\nGET /v2/account/accommodation/{accommodation}/competitors\n```\n\nGratis, como el resto de la Account API. Devuelve los competidores configurados en ese hotel, cada uno con el identificador que piden los endpoints de datos — que es exactamente lo que recorre una parrilla de tarifas: una llamada para traer el compset y luego una llamada de tarifa por establecimiento.\n\n`GET /v2/account/accommodation` hace lo mismo con tus propios hoteles, y es de donde salen los slugs para empezar.\n\n## Qué viene después\n\nEl hotel y su compset son configuración, no datos: por sí solos no traen nada. A partir de aquí el camino se bifurca — un endpoint **Real Time** responde sobre ellos de inmediato, petición a petición, y un dataset **Feed** necesita que antes haya corrido una importación.\n\nDos cosas más del listado que conviene saber: cada fila tiene activar, desactivar y borrar, y las casillas te dan las mismas tres en bloque. Una entidad **desactivada** deja de importarse sin perder su histórico — que es lo correcto para un hotel que has dejado de gestionar, y bastante mejor que borrarlo.","By the end you will have a hotel on your account with its slug, its OTA profiles detected and its competitors attached — the setup every comparison endpoint in Veetal quietly assumes you already did.\n\n**What you need:** an account with the Account API active. Nothing else.\n\n**What it costs:** nothing. Creating the hotel, resolving it against Booking and attaching competitors are all free. The comp set does change what an import costs later, and that part is worth reading before you launch one.\n\n## Why the comp set is not optional\n\nVeetal's comparison endpoints do not take a list of rivals as a parameter. They read the set configured on the hotel. So the size of your comp set decides the shape of the answer:\n\n- **Rates** come back as `{ report: { [slug]: [rate, ...] } }` — your hotel *and every competitor in the same payload*. With an empty set, that object has one key: yours.\n- **Parity** is a score against the set. With nothing to compare against, there is no score to compute.\n- **Reputation** and **reviews** carry a `competitors` block, which arrives empty when the set is empty. The reviews endpoint even defaults `include_competitors` to `true`, so an empty set is the difference between a benchmark and a solo reading.\n- The **live rate grid** is one call per property in the set. No set, no grid.\n\nThis is also the part of Veetal that a plain scraping API does not have. The comp set is stored configuration, not a query parameter you rebuild on every call.\n\n## 1. Add the hotel\n\nOn [Accommodations](https://dashboard.veetal.app/account/accommodations), **Add accommodations**. The wizard opens on three routes:\n\n- **Search Booking accommodation** — the usual one.\n- **I have accommodation Booking URL** — for when the search is ambiguous and you already have the listing open.\n- **Import accommodations from .csv/.xls file** — the bulk route, and the sane way to load a portfolio.\n\nSearch by name. Results carry the hotel photo and city, and they come tagged:\n\n- **It's yours** — already one of your accommodations. Greyed out, which saves you the duplicate.\n- **Is competitor** — already a competitor of one of your hotels.\n- **Is existing** — the listing is already in Veetal's database because someone else tracks it. It gets reused rather than created again, which is why it resolves instantly.\n\nIf nothing matches, use *fewer* words: the search matches Booking approximately, not your exact string.\n\n## 2. Read the profiles it found\n\nPick one and **Continue**. Veetal resolves the listing for real and shows you what it found — stars, guest score, review count, address — plus **Profiles Found**: the OTAs this hotel actually has a listing on.\n\nThat block is a forecast. An OTA with no profile has nothing to import, and the reputation feed will only return the ones with a green tick. **Repeat search profiles** runs the detection again if you think it missed one, and **View Profile** opens the matched listing so you can confirm it is the right property before it lands on your account.\n\nOnce added, the row's **SETUP** column keeps showing that profile map, one badge per OTA.\n\n## 3. The slug is not the name\n\nThe **slug** Veetal assigns comes from the Booking URL, not from the display name. \"Ohla Barcelona\" became `ohla`.\n\nEvery endpoint takes the slug, so copy it from the row instead of guessing it from the hotel's name. Half the \"the endpoint returns nothing\" tickets are a slug someone typed from memory.\n\n## 4. Attach up to ten competitors\n\nOpen the hotel from the list and add competitors from its detail, with the same finder you used for the hotel — which is why search results already know how to tell you a property **Is competitor**.\n\nTwo things decide whether this step is useful:\n\n**Who belongs in the set.** A guest choosing your hotel is not choosing between every hotel in the city. They are choosing between the handful in your district, in your band, for their dates. A comp set of ten hotels that a guest genuinely compares beats a comp set of ten hotels that share your star rating and nothing else.\n\n**What each one costs.** The cap is ten, and it is a cap for a reason: **every competitor multiplies the cost of every import**. A hotel with 5 competitors across 3 OTAs is 18 listings per run, not 3. The dashboard shows the credit estimate before you launch an import — read it there, not in the invoice.\n\n![The comp set of a hotel on its detail: ten competitors attached, each with its city and star rating, and the 10/10 counter](/images-webp/recipes/add-your-hotel-and-its-comp-set/01-compset.webp)\n\n## 5. Read the set back from the API\n\n```\nGET /v2/account/accommodation/{accommodation}/competitors\n```\n\nFree, like the rest of the Account API. It returns the competitors configured for that hotel, each with the identifier the data endpoints take — which is exactly what a rate grid loops over: one call to get the set, then one rate call per property.\n\n`GET /v2/account/accommodation` does the same for your own hotels, and is where the slugs come from in the first place.\n\n## What happens next\n\nThe hotel and its set are configuration, not data: on their own they fetch nothing. From here the path forks — a **Real Time** endpoint answers about them immediately, one request at a time, and a **Feed** dataset needs an import to have run first.\n\nTwo more things worth knowing about the list: every row has activate, deactivate and delete, and the checkboxes give you the same three in bulk. A **deactivated** entity stops being imported without losing its history — which is the right move for a hotel you stopped managing, and much better than deleting it.",2,"El hotel es la mitad del montaje. Sin los competidores enganchados, cada respuesta de tarifas, paridad y reputación habla solo de ti — y eso es una lista de precios, no una comparación.","## ¿Cuántos competidores puedo añadir?\n\nDiez por hotel. El tope es a propósito: cada competidor multiplica el coste de cada importación, y un compset de treinta hoteles no es un compset — es la ciudad.\n\n\n## ¿Los competidores gastan créditos por sí solos?\n\nNo. Crearlos y resolverlos contra Booking es gratis, como toda la Account API. Lo que cambian es el tamaño de cada trabajo posterior: una importación cubre el hotel más su compset en todas las OTAs con perfil, y una parrilla de tarifas en vivo es una llamada por establecimiento.\n\n\n## Mi informe de tarifas solo trae mi hotel. ¿Qué pasa?\n\nQue el compset está vacío. El payload de tarifas va indexado por slug e incluye a cada competidor configurado en el hotel, así que sin compset vuelve con una única clave: la tuya.\n\n\n## ¿Puedo montar el compset por API?\n\nSí. El conjunto entero tiene endpoints: `GET`, `POST` y `DELETE` sobre `/v2/account/accommodation/{accommodation_id}/competitors`. El POST acepta un array `booking_urls` de fichas de Booking.com —hasta diez, el mismo tope que el dashboard— y resuelve cada una por ti.\n\n```bash\ncurl -X POST \"https://api.veetal.app/v2/account/accommodation/YOUR_ACCOMMODATION_ID/competitors\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"booking_urls\": [\"https://www.booking.com/hotel/es/TU_COMPETIDOR.html\"] }'\n```\n\nDos cosas que conviene saber. Pide el **id interno**, no el slug — el que devuelve `/account/accommodation` dentro de cada entrada, mientras que el slug es la clave. Y solo acepta URLs de Booking: no hay endpoint de búsqueda, así que un nombre que aún no has resuelto es trabajo de dashboard. Ese es el reparto honesto — el buscador del dashboard es mejor para montar el conjunto, la API es mejor para mantenerlo sincronizado con tu propio sistema.\n\n## El hotel que quiero ya está en Veetal porque lo sigue otro cliente. ¿Es un problema?\n\nNo. La búsqueda lo marca como **Is existing** y reutiliza la ficha en vez de crear un duplicado. Tú te llevas tu propia entidad apuntando a datos ya resueltos; los demás clientes no ven nada de lo tuyo.\n\n\n## ¿Borro un hotel que he dejado de gestionar?\n\nDesactívalo. Una entidad desactivada deja de importarse —y por tanto de gastar créditos— pero conserva su histórico, que es justo lo que querrás el día que alguien pregunte qué pasó la temporada pasada.","Da de alta un hotel y su compset — Veetal Connect API","Un hotel dado de alta en tu cuenta con su slug y sus perfiles de OTA detectados, hasta diez competidores enganchados, y la llamada gratuita que lee el compset — que es de donde las recetas de comparación sacan los slugs que recorren.","2026-08-21","add-your-hotel-and-its-comp-set","types/accommodations","## How many competitors can I add?\n\nTen per hotel. The cap is deliberate: each competitor multiplies the cost of every import, and a set of thirty hotels is not a comp set — it is the city.\n\n\n## Do competitors consume credits on their own?\n\nNo. Creating them and resolving them against Booking is free, like the whole Account API. What they change is the size of every later job: an import covers the hotel plus its set across every OTA with a profile, and a live rate grid is one call per property.\n\n\n## My rate report only contains my own hotel. What is wrong?\n\nThe comp set is empty. The rates payload is keyed by slug and includes every competitor configured on the hotel, so with no set it comes back with a single key — yours.\n\n\n## Can I build the comp set over the API?\n\nYes. The whole set has endpoints: `GET`, `POST` and `DELETE` on `/v2/account/accommodation/{accommodation_id}/competitors`. The POST takes a `booking_urls` array of Booking.com hotel URLs — up to ten, the same cap as the dashboard — and resolves each one for you.\n\n```bash\ncurl -X POST \"https://api.veetal.app/v2/account/accommodation/YOUR_ACCOMMODATION_ID/competitors\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"booking_urls\": [\"https://www.booking.com/hotel/es/YOUR_COMPETITOR.html\"] }'\n```\n\nTwo things to know. It wants the **internal id**, not the slug — the one `/account/accommodation` returns inside each entry, while the slug is the key. And it only takes Booking URLs: there is no search endpoint, so a name you have not resolved yet is a dashboard job. That is the honest split — the dashboard finder is better for putting a set together, the API is better for keeping it in sync with your own system.\n\n## The hotel I want is already in Veetal because another customer tracks it. Is that a problem?\n\nNo. The search marks it **Is existing** and reuses the listing instead of creating a duplicate. You get your own entity pointing at data that is already resolved; other customers see nothing of yours.\n\n\n## Should I delete a hotel I stopped managing?\n\nDeactivate it. A deactivated entity stops being imported — so it stops costing credits — but keeps its history, which you will want the day someone asks what happened last season.","da-de-alta-tu-hotel-y-su-compset","https://dashboard.veetal.app/account/accommodations","Every recipe that puts you against the market reads two things from your account: your hotel, and the hotels you compete with. The first one everybody does. The second is the one nobody gets told about, and it is why a rate report arrives looking suspiciously like your own price list. Ten minutes, once, and every other recipe starts answering properly.","## Add the hotel\n\nOn Accommodations, Add accommodations. Search Booking by name, paste the listing URL when the search is ambiguous, or upload a .csv/.xls to do it in bulk.\n\n## Read the profiles it found\n\nThe confirmation screen shows which OTAs the hotel actually has a listing on. An OTA with no profile has nothing to import later, so this screen is a forecast of what your reputation and rate feeds will be able to return.\n\n## Copy the slug, do not guess it\n\nVeetal builds the slug from the Booking URL, not from the display name. \"Ohla Barcelona\" becomes ohla, and the slug is what every endpoint takes.\n\n## Attach up to ten competitors\n\nIn the accommodation detail, add the hotels a guest actually chooses between instead of the whole city. This is the step that turns every later answer into a comparison.\n\n## Read the set back over the API\n\nGET /v2/account/accommodation/{accommodation}/competitors returns your rivals with the identifiers the rate, parity and reputation calls take. It is free, and it is the list the grid recipes iterate over.","# 1) Your hotels, with the slug every other endpoint takes\ncurl \"https://api.veetal.app/v2/account/accommodation\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"\n\n# 2) The comp set attached to one of them\ncurl \"https://api.veetal.app/v2/account/accommodation/YOUR_HOTEL_ID/competitors\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Da de alta tu hotel y el compset contra el que fijas precio","Todas las recetas que te comparan con el mercado leen dos cosas de tu cuenta: tu hotel y los hoteles contra los que compites. Lo primero lo hace todo el mundo. Lo segundo no se lo cuentan a nadie, y por eso un informe de tarifas acaba pareciéndose sospechosamente a tu propia lista de precios. Diez minutos, una vez, y el resto de recetas empiezan a responder de verdad.","Two free calls. The first gives you your hotels and their slugs; the second, the comp set attached to one of them — the list every comparison recipe loops over.","Dos llamadas gratuitas. La primera te da tus hoteles y sus slugs; la segunda, el compset enganchado a uno de ellos — la lista que recorre cada receta de comparación.",{"id":283,"fields":1202},{"Prompt":1203,"Minutes":1150,"Title_en":1204,"Datasets":1205,"Published":802,"Build_en":1206,"Needs_import":802,"Seo_description_en":1207,"Endpoint":1208,"Summary_en":1209,"Seo_title_en":1210,"Seo_description_es":1211,"Steps_es":1212,"Order":1213,"Requires":1214,"Summary_es":1215,"Faqs_es":1216,"Seo_title_es":1217,"Build_es":1218,"Date":1155,"Slug_en":1219,"Icon":1157,"Faqs_en":1220,"Slug_es":1221,"Import_entity":33,"Intro_en":1222,"Steps_en":1223,"Curl":1224,"Layer":10,"Title_es":1225,"Intro_es":1226,"Kind":1103,"Call_text_en":1227,"Call_text_es":1228},"Using my Veetal Connect data, help me price the second week of October for my hotel.\n\nBefore you answer, tell me which of these you can actually read for my account and\nwhich are missing — do not fill a gap with an assumption:\n- my rates and my comp set's rates for those dates\n- rate parity across my channels\n- my reputation and my competitors', by OTA\n- events in the city those nights, with their modelled hotel impact\n- my PMS reservations, if they are imported\n\nThen, night by night:\n- where I sit against the comp set, in money and in position\n- whether anything in the city those nights justifies moving\n- whether my review score supports charging above the set, or argues against it\n- the specific change you would make, and what would have to be true for it to be wrong\n\nEnd with the single night you are least sure about and what data would settle it.\nI would rather act on four confident nights than seven vague ones.","Ask one question that crosses every dataset",[113],"A pricing recommendation you can argue with: for a date range, what the data says about demand, where you sit against your comp set, whether your score supports the premium you are charging, what is happening in the city those nights, and the specific move it suggests — with the reasoning visible so you can reject it.","Rate, comp set, parity, reputation and city events answer one pricing question together, under a single API key, through the Veetal MCP.","Varios — el asistente elige","Rate, occupancy, comp-set price, review sentiment, rank and the city’s event calendar answer the same question at once, under one key, in one conversation.","Revenue Optimization API — Cross Every Hotel Dataset — Veetal","Tarifa, comp set, paridad, reputación y eventos de la ciudad responden juntos a una pregunta de precio, con una sola API key y el MCP de Veetal.","## Conecta el MCP y asegúrate de que los feeds han corrido\n\nEsta solo funciona si el dato está. Tarifas, reputación y eventos necesitan cada uno su import configurado y ejecutado — el asistente solo puede cruzar lo que tu cuenta tenga de verdad.\n\n## Pregunta la decisión, no la consulta\n\n\"¿Subo el viernes?\" es mejor prompt que \"dame las tarifas\". Deja que el asistente averigüe qué datasets la responden.\n\n## Pídele que enseñe el trabajo\n\nPide los números detrás de cada afirmación y las fechas que usó. Una recomendación que no puedes auditar es una recomendación que no puedes defender ante tu director.",11,[33,452,20,1088],"Tarifa, ocupación, precio del comp set, sentimiento de las reseñas, posición y el calendario de eventos de la ciudad responden a la vez, con una sola key y en una conversación.","## ¿Esto es un sistema de revenue management?\n\nNo, y no debería fingir que lo es. Un RMS optimiza en continuo contra tu propia curva de reservas. Esto responde una pregunta concreta con más contexto del que suele tener un RMS —los eventos de la ciudad, los precios vivos de tu competencia, lo que dicen los huéspedes— y te deja a ti la decisión.\n\n## ¿Y si falta algún dato?\n\nEntonces que lo diga y trabaje con menos. Un asistente que se salta calladamente la pata de reputación porque el import nunca corrió seguirá dando una respuesta segura de sí misma, y será peor que inútil. Pídele explícitamente que nombre lo que no ha podido leer.\n\n## ¿Qué datasets usa de verdad?\n\nLos que tenga tu cuenta: tarifas del alojamiento y su comp set, paridad, reputación y reseñas, eventos con su impacto hotelero modelado, y reservas del PMS si las importas. La gracia es que una sola key llega a todos.\n\n## ¿Puedo programarlo?\n\nSí — encaja de forma natural en una tarea recurrente que te deje un informe en el correo cada lunes. El prompt es el mismo; solo cambia la periodicidad.","API de optimización de ingresos — Cruza todos los datos del hotel — Veetal","Una recomendación de precio que puedes discutir: para un rango de fechas, qué dice el dato de la demanda, dónde estás frente a tu comp set, si tu nota sostiene la prima que cobras, qué ocurre en la ciudad esas noches, y el movimiento concreto que sugiere — con el razonamiento a la vista para que puedas rechazarlo.","revenue-optimization-prompt","## Is this a revenue management system?\n\nNo, and it should not pretend to be. An RMS optimises continuously against your own booking curve. This answers a specific question with broader context than an RMS usually has — the city's events, your competitors' live prices, what guests are saying — and leaves the decision with you.\n\n## What if some data is missing?\n\nThen say so and work with less. An assistant that quietly drops the reputation leg because the import never ran will still produce a confident answer, and it will be worse than useless. Ask it explicitly to name what it could not read.\n\n## Which datasets does it actually use?\n\nWhatever your account has: accommodation rates and the comp set, parity, reputation and reviews, events with their modelled hotel impact, and PMS reservations if you import them. The point is that one key reaches all of them.\n\n## Can I schedule it?\n\nYes — this is a natural fit for a recurring task that lands a briefing in your inbox every Monday. The prompt is the same; only the cadence changes.","optimizacion-ingresos-prompt","Every yield decision is a join across data that lives in different tools: your PMS knows the pace, a rate shopper knows the comp set, a reputation dashboard knows the score, and nobody owns the events calendar. Veetal puts them behind one token — which means an assistant can hold all of it at once and you can just ask.","## Connect the MCP and make sure the feeds have run\n\nThis one only works if the data is there. Rates, reputation and events each need their import configured and executed — the assistant can only cross what your account actually holds.\n\n## Ask the decision, not the query\n\n\"Should I raise Friday?\" is a better prompt than \"give me the rates\". Let the assistant work out which datasets answer it.\n\n## Make it show its work\n\nAsk for the numbers behind each claim and the dates it used. A recommendation you cannot audit is a recommendation you cannot defend to your GM.","curl \"https://api.veetal.app/v2/feed/accommodation/YOUR_SLUG/rates?rate_year=2026&rate_month=10\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Haz una pregunta que cruce todos los datos","Toda decisión de yield es un cruce entre datos que viven en herramientas distintas: tu PMS sabe el ritmo, un rate shopper sabe el comp set, un panel de reputación sabe la nota, y del calendario de eventos no se ocupa nadie. Veetal los pone detrás de un solo token — lo que significa que un asistente puede sostenerlo todo a la vez y tú solo tienes que preguntar.","There is no single endpoint for this one — the assistant picks among them. This is the rates call it will almost certainly start from.","Aquí no hay un endpoint único — el asistente elige entre varios. Esta es la llamada de tarifas de la que casi seguro partirá.",{"id":200,"fields":1230},{"Minutes":1076,"Title_en":1231,"Datasets":1232,"Published":802,"Build_en":1233,"Needs_import":802,"Seo_description_en":1234,"Endpoint":1235,"Summary_en":1236,"Seo_title_en":1237,"Seo_description_es":1238,"Steps_es":1239,"Body_es":1240,"Body_en":1241,"Order":1242,"Requires":1243,"Summary_es":1245,"Faqs_es":1246,"Import_service":1247,"Seo_title_es":1248,"Build_es":1249,"Date":1155,"Slug_en":1250,"Icon":1251,"Faqs_en":1252,"Slug_es":1253,"Dashboard_url":1254,"Import_entity":62,"Intro_en":1255,"Steps_en":1256,"Curl":1257,"Layer":10,"Title_es":1258,"Intro_es":1259,"Kind":1167,"Call_text_en":1260,"Call_text_es":1261},"Track the whole hotel market of a destination",[96],"A daily snapshot of a whole destination: every hotel that matches your filters, with price, discount, board, cancellation, score, review count, stars and distance — and the schedule that turns it into a historical series.","Get every hotel on sale in a destination for one night — price, score, stars and cancellation — in a single Veetal feed call, and turn it into a daily series.","GET /v2/feed/location-search/{location_search_id}/{target_date}/booking-location-search","One request returns every hotel on sale in a destination for a given night — price, score, stars, room type and cancellation — instead of asking hotel by hotel. 192 properties for 0,32 credits.","Track a whole destination's hotel market — Veetal","Consigue todos los hoteles a la venta de un destino para una noche — precio, nota, estrellas y cancelación — en una sola llamada al feed de Veetal, y conviértelo en una serie diaria.","## Apunta el feed a tu búsqueda de destino\n\nAbre Feed / Booking Location Search. La página entra por Location searches, las entidades sobre las que trabaja esta API. Tu destino más sus filtros es la unidad que se importa y se factura.\n\n## Lanza el import y lee la estimación\n\nEn la pestaña Imports, Launch import. Elige la búsqueda de destino, cuántas noches hacia delante y desde qué país se consulta Booking — esa geolocalización del proxy es lo que hace que los precios coincidan con los que ve tu cliente. Lee el coste estimado antes de pulsar: un destino y una noche fueron 0,32 créditos.\n\n## Lee el mercado\n\nEn la pestaña Requests, Run request con la fecha objetivo que escribió el import. Una respuesta trae todos los hoteles que casaron: precio, descuento, tipo de habitación, régimen, cancelación, nota, número de reseñas, estrellas, distancia y fotos.\n\n## Calcula tu propio ranking\n\nNo hay campo de posición. Ordena tú la lista — por precio, por nota, por relación calidad-precio, por distancia — y busca el percentil de tu hotel en la distribución.\n\n## Conviértelo en una serie\n\nEn la pestaña Schedules, pon la búsqueda de destino a diario. El estimador enseña el coste por ejecución y el equivalente mensual. A partir de ahí el endpoint responde por cada fecha que hayas importado.","Al terminar tendrás una petición que devuelve **todos los hoteles a la venta de un destino para una noche concreta** —precio, nota, estrellas, tipo de habitación, política de cancelación y distancia al centro— en vez de ir preguntando hotel por hotel.\n\n**Qué necesitas:** una búsqueda de destino en tu cuenta (el destino más sus filtros) y el feed Booking Location Search activo.\n\n**Lo que cuesta:** la ejecución que documento aquí fueron **0,32 créditos** y trajo **192 hoteles**. El diálogo te lo estima antes de lanzar.\n\n## Por qué esto y no un bucle hotel a hotel\n\nLos endpoints de tarifas responden sobre *un* alojamiento. Es la herramienta correcta cuando ya sabes quiénes son tus competidores. Es la equivocada cuando la pregunta es el mercado entero: quién más está a la venta esta noche, a qué precio, y en qué parte de esa distribución caes tú.\n\nEste feed responde eso en una sola llamada. La unidad es la **búsqueda de destino** que creaste —un destino más los filtros que deciden quién cuenta como tu mercado— y una ejecución cubre el conjunto completo.\n\n## 1. Apunta el feed a tu búsqueda de destino\n\nAbre [Feed · Booking Location Search](https://dashboard.veetal.app/feed-api/feed-booking-location-search). La página entra por **Location searches**, las entidades sobre las que trabaja esta API, y ahí debería estar la tuya. Si no está, la das de alta desde aquí.\n\n![La página de la API con sus tarjetas y pestañas](/images-webp/recipes/track-destination-ranking/01-api-overview.webp)\n\nLas tres tarjetas de arriba son a las que vas a volver: **USAGE SUMMARY** (lo que lleva costando esta API en el periodo), **IMPORTS** (última y próxima ejecución) y **SCHEDULES**.\n\n## 2. Lanza el import y lee la estimación antes\n\nPestaña **Imports**, botón **Launch import**. En este diálogo es donde se decide el dinero:\n\n![El diálogo de import, con sus parámetros y la estimación](/images-webp/recipes/track-destination-ranking/02-launch-import.webp)\n\n- **Location Searches** — cuáles de tus búsquedas ejecutar. Cada una cuesta.\n- **Search location rates up to** — cuántas noches hacia delante. Un día es una foto de una noche; treinta días es treinta veces el trabajo.\n- **From which country should Booking.com be queried?** — geolocalización del proxy. Booking enseña precios distintos según el mercado, y esto es lo que hace que la respuesta coincida con lo que ve tu cliente.\n- **Moneda** e **idioma** — vienen por defecto de lo que ya declara la búsqueda de destino.\n\nAbajo del todo, **Estimated cost**. Léelo antes de pulsar. Para un destino y una noche dijo **0,32 créditos**, y 0,32 es exactamente lo que cobró.\n\n**Launch import**, y la fila aparece en el listado con su identificador, su trigger, su estado y sus créditos:\n\n![El import completado](/images-webp/recipes/track-destination-ranking/03-import-completed.webp)\n\n⚠️ El import escribe con la fecha **del día en que corre**. Lánzalo a las 23:08 y los datos caen bajo la fecha de ayer — lo que importa porque el endpoint pide una fecha objetivo y el playground no te deja elegir una pasada.\n\n## 3. Lee el mercado\n\nPestaña **Requests**, **Run request**. La fecha objetivo viene por defecto a hoy, que es justo lo que acaba de escribir el import:\n\n![El feed respondiendo con el mercado entero](/images-webp/recipes/track-destination-ranking/04-feed-response.webp)\n\n**HTTP 200, 457 ms, 232 KB** — 192 hoteles en una respuesta. Cada uno viene así:\n\n```json\n{\n  \"bookingHotelId\": 29800,\n  \"hotelName\": \"Catalonia Rigoletto\",\n  \"slug\": \"rigoletto\",\n  \"priceOriginal\": 138.48,\n  \"priceDiscount\": 0,\n  \"priceFinal\": 138.48,\n  \"currency\": \"EUR\",\n  \"roomType\": \"Habitación Doble - 1 o 2 camas\",\n  \"breakfastIncluded\": false,\n  \"freeCancellation\": true,\n  \"reviewScore\": 8.6,\n  \"reviewCount\": 1842,\n  \"starRating\": 4,\n  \"distanceToCenter\": 2.1,\n  \"photos\": [ ... ]\n}\n```\n\nEsa es la forma completa de la respuesta: **precio, descuento, tipo de habitación, régimen, cancelación, nota, número de reseñas, estrellas, distancia y fotos**, por cada propiedad que casó con tus filtros.\n\nFíjate en lo que *no* viene: una posición de ranking. El orden es el que devolvió Booking, y el ranking es algo que calculas tú — por precio, por nota, por nota entre euro, por distancia. Esa es la gracia: te llevas la distribución y decides qué significa \"posición\" para ti.\n\nEn esta ejecución: 192 hoteles, el más barato a **138,48 €**, la mediana en **252,48 €**, el más caro a **1.526,40 €**. Tu hotel es una fila más ahí dentro, y ahora sabes exactamente en qué percentil está.\n\n## 4. Conviértelo en una serie\n\nUna ejecución es una foto. El valor está en la curva, así que ponlo en un schedule: pestaña **Schedules**, eliges la búsqueda de destino, marcas diario, y el estimador te enseña el coste por ejecución y el equivalente mensual antes de guardar.\n\nA partir de ahí el feed responde por cada fecha que hayas importado, y puedes recorrerlas hacia atrás: cómo se movió la mediana del mercado, cuándo bajó precios el compset, si un evento empujó toda la distribución hacia arriba.\n\n## Qué pasa después\n\nEsa misma búsqueda de destino alimenta también el dataset de demanda de mercado, y el gemelo real-time de este endpoint —`GET /v2/real-time/location-search/{id}/booking/{date}`— responde lo mismo en vivo, sin import, cuando lo que necesitas es un destino ahora mismo y no un histórico.","By the end you will have one request that returns **every hotel on sale in a destination for a given night** — price, score, stars, room type, cancellation policy and distance to centre — instead of asking hotel by hotel.\n\n**What you need:** a location search on your account (the destination plus its filters) and the Booking Location Search feed active.\n\n**What it costs:** the run I document here was **0,32 credits** and brought back **192 hotels**. The dialog estimates it before you launch.\n\n## Why this and not a hotel-by-hotel loop\n\nThe rate endpoints answer about *one* property. That is the right tool when you know who your competitors are. It is the wrong tool when the question is the market itself: who else is on sale tonight, at what price, and where you fall in that distribution.\n\nThis feed answers that in one call. The unit is the **location search** you created — a destination plus the filters that decide who counts as your market — and one run covers the whole set.\n\n## 1. Point the feed at your location search\n\nOpen [Feed · Booking Location Search](https://dashboard.veetal.app/feed-api/feed-booking-location-search). The page opens on **Location searches**, the entities this API works on, and your location search should be listed. If it isn't, add it here.\n\n![The API page with its cards and tabs](/images-webp/recipes/track-destination-ranking/01-api-overview.webp)\n\nThe three cards at the top are the ones you will come back to: **USAGE SUMMARY** (what this API has cost this billing period), **IMPORTS** (last and next run) and **SCHEDULES**.\n\n## 2. Launch the import and read the estimate first\n\nThe **Imports** tab, then **Launch import**. This dialog is where the money is decided:\n\n![The import dialog, with its parameters and the estimate](/images-webp/recipes/track-destination-ranking/02-launch-import.webp)\n\n- **Location Searches** — which of your searches to run. Each one costs.\n- **Search location rates up to** — how many nights forward. One day is one night's snapshot; thirty days is thirty times the work.\n- **From which country should Booking.com be queried?** — proxy geo-targeting. Booking shows different prices to different markets, and this is what makes the answer match what your customer sees.\n- **Currency** and **language** — they default to what the location search already declares.\n\nAt the bottom, **Estimated cost**. Read it before you press. For one destination and one night it said **0,32 credits**, and 0,32 is exactly what it charged.\n\n**Launch import**, and the row appears in the list with its identifier, trigger, status and credits:\n\n![The completed import](/images-webp/recipes/track-destination-ranking/03-import-completed.webp)\n\n⚠️ The import writes for the date **it runs on**. Launch it at 23:08 and the data lands under yesterday's date — which matters because the endpoint asks for a target date, and the playground won't let you pick one in the past.\n\n## 3. Read the market\n\nThe **Requests** tab, **Run request**. The target date defaults to today, which is what the import just wrote:\n\n![The feed answering with the whole market](/images-webp/recipes/track-destination-ranking/04-feed-response.webp)\n\n**HTTP 200, 457 ms, 232 KB** — 192 hotels in one response. Each one comes back like this:\n\n```json\n{\n  \"bookingHotelId\": 29800,\n  \"hotelName\": \"Catalonia Rigoletto\",\n  \"slug\": \"rigoletto\",\n  \"priceOriginal\": 138.48,\n  \"priceDiscount\": 0,\n  \"priceFinal\": 138.48,\n  \"currency\": \"EUR\",\n  \"roomType\": \"Habitación Doble - 1 o 2 camas\",\n  \"breakfastIncluded\": false,\n  \"freeCancellation\": true,\n  \"reviewScore\": 8.6,\n  \"reviewCount\": 1842,\n  \"starRating\": 4,\n  \"distanceToCenter\": 2.1,\n  \"photos\": [ ... ]\n}\n```\n\nThat is the whole shape of the answer: **price, discount, room type, board, cancellation, score, review count, stars, distance and photos**, for every property that matched your filters.\n\nNote what is *not* in there: a ranking position. The order is the order Booking returned, and the ranking is something you compute — by price, by score, by score-per-euro, by distance. That is the point: you get the distribution, and you decide what \"position\" means for you.\n\nOn this run: 192 hotels, cheapest **138,48 €**, median **252,48 €**, most expensive **1.526,40 €**. Your own hotel is one row in there, and now you know exactly which percentile it sits in.\n\n## 4. Make it a series\n\nOne run is a snapshot. The value is the curve, so put it on a schedule: the **Schedules** tab, pick the location search, choose daily, and the estimator shows both the cost per run and the monthly equivalent before you save.\n\nFrom then on the feed answers for every date you have imported, and you can walk back through them: how the market's median moved, when the compset dropped prices, whether an event pushed the whole distribution up.\n\n## What happens next\n\nThe same location search also feeds the market demand dataset, and the real-time twin of this endpoint — `GET /v2/real-time/location-search/{id}/booking/{date}` — answers the same question live, without an import, when you need one destination right now instead of a history.",13,[1244],"location_search","Una petición devuelve todos los hoteles a la venta de un destino para una noche — precio, nota, estrellas, tipo de habitación y cancelación— en vez de ir hotel por hotel. 192 propiedades por 0,32 créditos.","## ¿Por qué el endpoint responde 404 si el import fue bien?\n\nPorque la fecha que has pedido no tiene datos. El import escribe con la fecha del día en que corre, y el endpoint pide una fecha objetivo: pide un día que nadie importó y recibes un 404 con el código 510, NoDataFoundForRequestedDate. Mira en la pestaña Imports qué fechas tienes de verdad.\n\n## ¿Cuánto cuesta un destino entero?\n\nDepende de cuántas noches pidas y cuántas búsquedas de destino ejecutes, no de cuántos hoteles vuelvan. Un destino para una noche fueron 0,32 créditos y devolvió 192 hoteles. El diálogo de import te estima la cifra exacta antes de lanzar, y el estimador del schedule te enseña el equivalente mensual.\n\n## ¿Puedo controlar qué hoteles entran?\n\nPara eso están los filtros de la búsqueda de destino: estrellas, tipo de alojamiento, régimen, puntuación mínima, distancia al centro, ocupación. Cámbialos y cambias tu mercado — y el coste. Si necesitas dos vistas distintas de la misma ciudad, crea dos búsquedas de destino.\n\n## ¿La respuesta me dice mi posición en el ranking?\n\nNo como campo. Te llevas todos los hoteles con su precio, su nota, sus estrellas y su distancia, y la posición que importa la calculas tú. Ordenar por precio no es lo mismo que ordenar por nota o por relación calidad-precio, y cuál cuenta depende de tu estrategia.\n\n## ¿Feed o real time?\n\nUsa el feed cuando quieras histórico: un schedule escribe una foto al día y puedes recorrer la serie hacia atrás. Usa el gemelo real-time, GET /v2/real-time/location-search/{id}/booking/{date}, cuando necesites un destino ahora mismo y no te importe guardarlo.","booking-location-search","Controla el mercado hotelero de una plaza — Veetal","Una foto diaria de un destino entero: todos los hoteles que casan con tus filtros, con precio, descuento, régimen, cancelación, nota, número de reseñas, estrellas y distancia — y el schedule que lo convierte en una serie histórica.","track-destination-ranking","types/market","## Why does the endpoint answer 404 when the import ran fine?\n\nBecause the date you asked for has no data. The import writes under the date it runs on, and the endpoint takes a target date — ask for a day nobody imported and you get 404 with code 510, NoDataFoundForRequestedDate. Check the Imports tab for which dates you actually have.\n\n## How much does a whole destination cost?\n\nIt depends on how many nights you ask for and how many location searches you run, not on how many hotels come back. One destination for one night was 0,32 credits and returned 192 hotels. The import dialog estimates the exact figure before you launch, and the schedule estimator shows the monthly equivalent.\n\n## Can I control which hotels are included?\n\nThat is what the filters on the location search are for: stars, property type, board, minimum score, distance to centre, occupancy. Change them and you change your market — and the cost. If you need two different views of the same city, create two location searches.\n\n## Does the response tell me my position in the ranking?\n\nNot as a field. You get every hotel with its price, score, stars and distance, and you compute the position that matters to you. Ranking by price is not the same as ranking by score or by value, and which one counts depends on your strategy.\n\n## Feed or real time?\n\nUse the feed when you want history: a schedule writes a snapshot a day and you can walk the series backwards. Use the real-time twin, GET /v2/real-time/location-search/{id}/booking/{date}, when you need one destination right now and don't care about keeping it.","controlar-ranking-plaza","https://dashboard.veetal.app/feed-api/feed-booking-location-search","The rate endpoints answer about one property. This one answers about the market: who else is on sale tonight, at what price, and where you fall in that distribution. Set up the location search, launch the import, read the whole plaza in one call.","## Point the feed at your location search\n\nOpen Feed / Booking Location Search. The page opens on Location searches, the entities this API works on. Your destination plus its filters is the unit that gets imported and billed.\n\n## Launch the import and read the estimate\n\nOn the Imports tab, Launch import. Choose the location search, how many nights forward, and the country Booking should be queried from — that proxy geo-targeting is what makes the prices match what your customer sees. Read the estimated cost before you press: one destination, one night was 0,32 credits.\n\n## Read the market\n\nOn the Requests tab, Run request with the target date the import wrote. One response carries every hotel that matched: price, discount, room type, board, cancellation, score, review count, stars, distance and photos.\n\n## Compute your own ranking\n\nThere is no position field. Sort the list yourself — by price, by score, by value, by distance — and find your own hotel's percentile in the distribution.\n\n## Turn it into a series\n\nOn the Schedules tab, set the location search to run daily. The estimator shows cost per run and the monthly equivalent. From then on the endpoint answers for every date you have imported.","curl \"https://api.veetal.app/v2/feed/location-search/YOUR_LOCATION_SEARCH_ID/2026-08-20/booking-location-search\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"\n\n# 404 con código 510 = esa fecha no se ha importado todavía","Controla el mercado hotelero de una plaza entera","Los endpoints de tarifas responden sobre un alojamiento. Este responde sobre el mercado: quién más está a la venta esta noche, a qué precio, y en qué parte de esa distribución caes tú. Configura la búsqueda de destino, lanza el import y lee la plaza entera en una llamada.","The whole destination in one call. Swap the id for your location search and the date for one you have imported.","La plaza entera en una llamada. Cambia el id por el de tu búsqueda de destino y la fecha por una que hayas importado.",{"id":424,"fields":1263},{"Minutes":1264,"Title_en":1265,"Datasets":1266,"Published":802,"Build_en":1267,"Needs_import":802,"Seo_description_en":1268,"Repo_url":1269,"Endpoint":1081,"Summary_en":1270,"Seo_title_en":1271,"Seo_description_es":1272,"Steps_es":1273,"Body_es":1274,"Body_en":1275,"Order":1276,"Repo_folder":1277,"Requires":1278,"Summary_es":1279,"Faqs_es":1280,"Import_service":1281,"Seo_title_es":1282,"Build_es":1283,"Date":1284,"Slug_en":1277,"Icon":1095,"Faqs_en":1285,"Slug_es":1286,"Dashboard_url":1193,"Import_entity":33,"Intro_en":1287,"Stack":1288,"Steps_en":1289,"Run_command":1290,"Curl":1291,"Layer":10,"Title_es":1292,"Intro_es":1293,"Kind":1167,"Call_text_en":1294,"Call_text_es":1295},5,"Import a hotel's reputation from Booking",[158],"A hotel registered in Veetal with its reputation imported from every OTA where it has a listing, plus a command-line tool that reads the feed and prints a comparison table — score, review count and category breakdown per OTA — and writes it out as CSV and HTML so you can drop it into a report.","Import a hotel's reputation from every OTA it is listed on and turn it into a comparison report — score, reviews and category breakdown — with one Veetal Connect API endpoint.","https://github.com/Veetal-Connect/recipes","Take any hotel from Booking, add it to Veetal and pull its multi-OTA reputation — score, review count and category breakdown from Booking.com, Tripadvisor and Google — ready to read over the API.","Multi-OTA Hotel Reputation Report — Booking, Tripadvisor & Google — Veetal","Importa la reputación de un hotel de todas las OTAs donde tiene ficha y conviértela en un informe comparativo — nota, reseñas y desglose por categorías — con un endpoint de la Veetal Connect API.","## Da de alta el hotel en el dashboard\n\nAñade el alojamiento, comprueba en qué OTAs tiene ficha y lanza el primer import. El paso a paso de abajo recorre cada pantalla — se hace una sola vez, y a partir de ahí todo es API.\n\n## Clona la receta y pon tu key\n\nClona el monorepo de recetas y mete tu API key en un fichero `.env`. No hay dependencias que instalar: Node 20 trae de serie todo lo que usa.\n\n## Lanza el informe\n\nPasa el slug del alojamiento — el icono de copiar que hay junto al hotel en el dashboard te lo da. La CLI lee el feed de reputación, saca la comparativa por terminal y escribe `report.csv` y `report.html` al lado.\n\n## Prográmalo y añade competencia\n\nCuando el lanzamiento manual funcione, programa una periodicidad para que el dato se refresque solo, y añade hasta 10 competidores en el alojamiento. El mismo comando pasa entonces a informar de todo el comp set en vez de un solo hotel.","Al terminar tendrás un hotel dado de alta en Veetal y su reputación importada de todas las OTAs donde tenga ficha, consultable por API.\n\n**Qué necesitas:** la API **Feed · Reputation** instalada y activa en tu cuenta, y el nombre del hotel tal y como aparece en Booking.\n\n**Lo que cuesta:** se cobra por *listing*. Una unidad = un hotel en una OTA. El ejemplo de esta receta son 20 créditos.\n\n## 1. Da de alta el hotel\n\nEn [Accommodations](https://dashboard.veetal.app/account/accommodations) pulsa **Add accommodations**. El asistente ofrece tres caminos: buscar en Booking por nombre (el habitual), pegar la URL de la ficha, o subir un fichero para el alta masiva.\n\n![Los tres métodos de alta](/images-webp/recipes/import-hotel-reputation/02-metodo.webp)\n\nBusca el hotel y elige su ficha. Si no aparece, prueba con menos palabras: el buscador casa por aproximación contra Booking, no por el nombre completo.\n\nAlgunos resultados llegan etiquetados: **Its yours** (ya es tuyo), **Is competitor** (ya lo tienes como competidor) e **Is existing** (la ficha ya está en la base de datos de Veetal pero no es tuya: se reutiliza en vez de crear otra).\n\n## 2. Mira qué OTAs tiene\n\nAl continuar, Veetal lee la ficha de Booking y te enseña lo que ha encontrado — categoría, nota, reseñas y dirección — y debajo, **Profiles Found**.\n\nEsa fila es la clave: **solo podrás importar reputación de las OTAs donde el hotel tenga perfil**. En el ejemplo son tres (Booking.com, Tripadvisor y Google); Expedia y Hotels.com no tienen ficha. Si falta alguna que esperabas, prueba **Repeat search profiles** antes de continuar.\n\nPulsa **Add accommodation**. El hotel aparece en el listado con la columna **SETUP**, que muestra en color las OTAs con perfil.\n\n## 3. Lanza el import\n\nVe a [Reputation → Accommodations](https://dashboard.veetal.app/feed-api/feed-reputation/entities). Cada fila tiene sus acciones: ✈️ **Request data** te lleva a probar el endpoint, 🚀 **Launch new import** lanza la importación ahora, el ojo activa o desactiva, y el icono de copiar te da el **slug** con el que el hotel se identifica en la API.\n\nPulsa el cohete de tu hotel:\n\n![El diálogo de lanzamiento](/images-webp/recipes/import-hotel-reputation/07-launch.webp)\n\nLas OTAs seleccionables son exactamente aquellas donde el hotel tiene perfil. Abajo verás la estimación:\n\n> **3 listings: 1 hotel + 0 competidores × 3 OTAs → 20 créditos.**\n\nEl coste sube con el número de OTAs y **con el compset**: un hotel con 5 competidores en 3 OTAs son 18 listings, no 3. Pulsa **Launch import**.\n\n## 4. Sigue el import\n\nEn [Imports](https://dashboard.veetal.app/feed-api/feed-reputation/imports) aparece tu ejecución con un identificador tipo `Veetal-MANUAL-20260818-120142854-ARP` — el `MANUAL` indica que la lanzaste tú y no un schedule.\n\n![La tabla de imports](/images-webp/recipes/import-hotel-reputation/08-imports.webp)\n\nTarda un par de minutos. Los créditos salen en `-` mientras corre y se rellenan al acabar. El estado puede quedarse en `running` con el progreso al 100 % unos segundos: está cerrando la ejecución, no lo relances.\n\n## 5. Consulta el dato\n\nVuelve a Accommodations y pulsa el ✈️ de tu hotel: llegas a [Requests](https://dashboard.veetal.app/feed-api/feed-reputation/requests) con el endpoint y el slug ya rellenos. Pulsa **Run request**.\n\n```\nGET /v2/feed/accommodation/{accommodation_slug}/reputation\n```\n\nEsto devolvió para el hotel del ejemplo:\n\n| OTA | Nota | Reseñas | Desglose |\n|---|---|---|---|\n| Booking | 8.7 | 2023 | 7 categorías (ubicación 9.8, personal 9.4, wifi 9.2, confort 8.9, limpieza 8.8, instalaciones 8.5, calidad-precio 8.3) |\n| Google | 9 | 1373 | sin desglose |\n| Tripadvisor | 8.8 | 2588 | 6 categorías (ubicación 9.73, limpieza 9.1, servicio 8.93, calidad del sueño 8.76, calidad/precio 8.56, habitaciones 8.52) |\n\nLa respuesta trae además un bloque `competitors` (vacío si no hay compset) y un bloque `import` con el identificador y la fecha de la importación de la que salen los datos: así sabes **a qué momento corresponde** la nota que estás leyendo.\n\n## Si algo falla\n\n| Qué ves | Qué significa | Qué hacer |\n|---|---|---|\n| `No accommodations found` | Booking no casa con ese texto | Busca con menos palabras |\n| Solo una o dos OTAs seleccionables | El hotel no tiene perfil en el resto | Es lo normal; revisa la configuración de OTAs en el detalle del alojamiento |\n| El cohete deshabilitado | El alojamiento está inactivo en esta API | Actívalo con el icono del ojo |\n| Import en `failed` | La ejecución no pudo completarse | Ábrela para ver el error y reintenta |\n\n## Y ahora qué\n\n- **Prográmalo** en la pestaña **Schedules**: diario, semanal o mensual. El estimador te dice lo que costará al mes antes de guardar.\n- **Añade competidores** en el detalle del alojamiento, hasta 10. Cada uno multiplica el coste de cada import.\n- Si lo que quieres es el dato **al instante** y sin import previo, usa los endpoints real-time por OTA.","By the end you will have a hotel registered in Veetal and its reputation imported from every OTA where it has a listing, ready to read over the API.\n\n**What you need:** the **Feed · Reputation** API installed and active on your account, and the hotel's name as it appears on Booking.\n\n**What it costs:** billing is per *listing*. One unit = one hotel on one OTA. The example in this recipe is 20 credits.\n\n## 1. Add the hotel\n\nIn [Accommodations](https://dashboard.veetal.app/account/accommodations) click **Add accommodations**. The wizard offers three routes: search Booking by name (the usual one), paste the listing URL, or upload a file for a bulk import.\n\n![The three ways to add a hotel](/images-webp/recipes/import-hotel-reputation/02-metodo.webp)\n\nSearch for the hotel and pick its listing. If nothing shows up, try fewer words: the search matches Booking approximately, not the full name you have in mind.\n\nSome results come tagged: **Its yours** (already one of yours), **Is competitor** (already a competitor of one of your hotels) and **Is existing** (the listing is already in Veetal's database but not yours — it gets reused instead of creating a new one).\n\n## 2. Check which OTAs it has\n\nOn continue, Veetal reads the Booking listing and shows what it found — category, score, review count and address — and below it, **Profiles Found**.\n\nThat row is the important part: **you can only import reputation from the OTAs where the hotel has a profile**. In the example there are three (Booking.com, Tripadvisor and Google); Expedia and Hotels.com have no listing. If one you expected is missing, try **Repeat search profiles** before continuing.\n\nClick **Add accommodation**. The hotel shows up in the list with a **SETUP** column that colours in the OTAs with a profile.\n\n## 3. Launch the import\n\nGo to [Reputation → Accommodations](https://dashboard.veetal.app/feed-api/feed-reputation/entities). Every row has its actions: ✈️ **Request data** takes you to try the endpoint, 🚀 **Launch new import** runs an import right now, the eye activates or deactivates it, and the copy icon gives you the **slug** the API identifies the hotel by.\n\nClick the rocket on your hotel:\n\n![The launch dialog](/images-webp/recipes/import-hotel-reputation/07-launch.webp)\n\nThe selectable OTAs are exactly the ones where the hotel has a profile. Below you get the estimate:\n\n> **3 listings: 1 hotel + 0 competitors × 3 OTAs → 20 credits.**\n\nCost grows with the number of OTAs and **with your comp set**: a hotel with 5 competitors across 3 OTAs is 18 listings, not 3. Click **Launch import**.\n\n## 4. Follow the import\n\nIn [Imports](https://dashboard.veetal.app/feed-api/feed-reputation/imports) your run appears with an identifier like `Veetal-MANUAL-20260818-120142854-ARP` — the `MANUAL` means you launched it, not a schedule.\n\n![The imports table](/images-webp/recipes/import-hotel-reputation/08-imports.webp)\n\nIt takes a couple of minutes. Credits show as `-` while it runs and fill in when it finishes. The status can sit at `running` with progress already at 100% for a few seconds: it is closing the run, don't relaunch it.\n\n## 5. Read the data\n\nBack in Accommodations, click the ✈️ on your hotel: you land on [Requests](https://dashboard.veetal.app/feed-api/feed-reputation/requests) with the endpoint and the slug already filled in. Click **Run request**.\n\n```\nGET /v2/feed/accommodation/{accommodation_slug}/reputation\n```\n\nThis is what it returned for the example hotel:\n\n| OTA | Score | Reviews | Breakdown |\n|---|---|---|---|\n| Booking | 8.7 | 2023 | 7 categories (location 9.8, staff 9.4, wifi 9.2, comfort 8.9, cleanliness 8.8, facilities 8.5, value 8.3) |\n| Google | 9 | 1373 | no breakdown |\n| Tripadvisor | 8.8 | 2588 | 6 categories (location 9.73, cleanliness 9.1, service 8.93, sleep quality 8.76, value 8.56, rooms 8.52) |\n\nThe response also carries a `competitors` block (empty if you have no comp set) and an `import` block with the identifier and date of the run the data comes from — so you always know **which moment** the score belongs to.\n\n## If something goes wrong\n\n| What you see | What it means | What to do |\n|---|---|---|\n| `No accommodations found` | Booking doesn't match that text | Search with fewer words |\n| Only one or two OTAs selectable | The hotel has no profile on the rest | That's normal; check the OTA configuration in the accommodation detail |\n| The rocket is disabled | The accommodation is inactive on this API | Activate it with the eye icon |\n| Import in `failed` | The run couldn't complete | Open it to see the error and retry |\n\n## What's next\n\n- **Schedule it** from the **Schedules** tab: daily, weekly or monthly. The estimator tells you the monthly cost before you save.\n- **Add competitors** in the accommodation detail, up to 10. Each one multiplies the cost of every import.\n- If what you want is the data **right now** with no prior import, use the real-time endpoints per OTA.",8,"import-hotel-reputation",[33],"Coge un hotel cualquiera de Booking, dalo de alta en Veetal y tráete su reputación multi-OTA — nota, número de reseñas y desglose por categorías de Booking.com, Tripadvisor y Google — lista para consultar por API.","## ¿Por qué necesito un import antes de poder leer nada?\n\nLa reputación es un dataset Feed: Veetal la escribe en tu cuenta en cada ejecución, y el endpoint lee lo que dejó esa ejecución. Hasta que no termina el primer import no hay nada que leer. Por eso mismo es rápido — lees dato guardado, no scraping en el momento.\n\n## ¿Qué OTAs voy a tener?\n\nSolo aquellas en las que el hotel tenga ficha de verdad. Veetal detecta los perfiles al dar de alta el alojamiento y los muestra como Profiles Found; el diálogo de import te deja elegir exactamente entre esos. Booking.com, Tripadvisor y Google son las tres habituales.\n\n## ¿Cómo se factura?\n\nPor listing: un hotel en una OTA es una unidad. Tres OTAs de un hotel son tres listings. La competencia multiplica — un hotel con 5 competidores en 3 OTAs son 18 listings por ejecución, no 3.\n\n## ¿Puedo tener la nota sin montar un import?\n\nSí, con los endpoints de reputación en tiempo real, que van a la OTA en el momento. Cuestan más por llamada y tardan más, así que encajan en una consulta puntual, no en un panel que refrescas.\n\n## ¿La respuesta me dice de cuándo es el dato?\n\nTrae un bloque `import` con el identificador y la fecha de la ejecución de la que salen los números, así que cada nota está atada a un momento concreto y no queda en el aire.","feed-accommodation-reputation","Informe de reputación hotelera multi-OTA — Booking, Tripadvisor y Google — Veetal","Un hotel dado de alta en Veetal con su reputación importada de todas las OTAs donde tenga ficha, más una herramienta de línea de comandos que lee el feed y saca una tabla comparativa — nota, número de reseñas y desglose por categorías de cada OTA — y la exporta a CSV y HTML para meterla en un informe.","2026-08-18","## Why do I need an import before reading anything?\n\nReputation is a Feed dataset: Veetal writes it to your account on a run, and the endpoint reads what that run left. Until the first import finishes there is nothing to read. That is also why it is fast — you are reading stored data, not scraping on request.\n\n## Which OTAs will I get?\n\nOnly the ones where the hotel actually has a listing. Veetal detects the profiles when you add the accommodation and shows them as Profiles Found; the import dialog then lets you pick among exactly those. Booking.com, Tripadvisor and Google are the usual three.\n\n## How is it billed?\n\nPer listing: one hotel on one OTA is one unit. Three OTAs on one hotel is three listings. Competitors multiply it — a hotel with 5 competitors across 3 OTAs is 18 listings per run, not 3.\n\n## Can I get the score without setting up an import?\n\nYes, with the real-time reputation endpoints, which fetch from the OTA on request. They cost more per call and take longer, so they fit a one-off lookup rather than a dashboard you refresh.\n\n## Does the response tell me how old the data is?\n\nIt carries an `import` block with the identifier and date of the run the numbers come from, so every score is tied to a moment in time rather than floating.","importar-reputacion-hotel","Reputation is scattered across the OTAs where a hotel is listed, each with its own scale and its own category breakdown. Set the hotel up once in Veetal, run the import, and then read every OTA from a single endpoint — with a small CLI that turns it into a report you can share.","Node 20 · JavaScript · no dependencies","## Set the hotel up in the dashboard\n\nAdd the accommodation, check which OTAs it has a profile on, and launch the first import. The walkthrough below covers each screen — it is a one-off, and everything after it is API.\n\n## Clone the recipe and add your key\n\nClone the recipes monorepo and drop your API key into a `.env` file. There are no dependencies to install — Node 20 has everything it uses built in.\n\n## Run the report\n\nPass the accommodation slug — the copy icon next to the hotel in the dashboard gives it to you. The CLI reads the reputation feed, prints the comparison to the terminal and writes `report.csv` and `report.html` next to it.\n\n## Schedule it and add competitors\n\nOnce the manual run works, set a schedule so the data refreshes on its own, and add up to 10 competitors on the accommodation. The same command then reports the whole comp set instead of a single hotel.","git clone https://github.com/Veetal-Connect/recipes.git\ncd recipes/import-hotel-reputation\ncp .env.example .env          # put your VEETAL_API_KEY in it\nnode --env-file=.env index.mjs --list\nnode --env-file=.env index.mjs YOUR_ACCOMMODATION_SLUG","curl \"https://api.veetal.app/v2/feed/accommodation/YOUR_ACCOMMODATION_SLUG/reputation\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Importar la reputación de un hotel de Booking","La reputación está repartida entre las OTAs donde el hotel tiene ficha, cada una con su escala y su desglose por categorías. Das de alta el hotel una vez en Veetal, lanzas el import y luego lees todas las OTAs desde un único endpoint — con una CLI pequeña que lo convierte en un informe que puedes compartir.","One request returns every OTA the hotel is listed on, each with its score, review count and category breakdown, plus the comp set and the run the data comes from. Swap in your slug and key.","Una petición devuelve todas las OTAs donde el hotel tiene ficha, cada una con su nota, número de reseñas y desglose por categorías, más el comp set y la ejecución de la que sale el dato. Cambia el slug y la key por los tuyos.",{"id":285,"fields":1297},{"Minutes":1150,"Title_en":1298,"Datasets":1299,"Published":802,"Build_en":1300,"Needs_import":802,"Seo_description_en":1301,"Repo_url":1269,"Endpoint":1302,"Summary_en":1303,"Seo_title_en":1304,"Seo_description_es":1305,"Steps_es":1306,"Body_es":1307,"Body_en":1308,"Order":1276,"Repo_folder":1309,"Requires":1310,"Summary_es":1311,"Faqs_es":1312,"Import_service":1313,"Seo_title_es":1314,"Build_es":1315,"Date":1155,"Slug_en":1309,"Icon":1316,"Faqs_en":1317,"Slug_es":1318,"Dashboard_url":1319,"Import_entity":33,"Intro_en":1320,"Stack":1321,"Steps_en":1322,"Run_command":1323,"Curl":1324,"Layer":10,"Title_es":1325,"Intro_es":1326,"Kind":1167,"Call_text_en":1327,"Call_text_es":1328},"Rate shopping, like for like",[113],"A command that prints a product × hotel grid for one night, your rank on each product counting only the hotels that sell it, and an explicit note for every empty cell — plus a CSV for the spreadsheet.","Compare your comp set by board and cancellation policy instead of cheapest-rate-per-hotel, and stop reporting price gaps that are really product gaps.","GET /v2/feed/accommodation/{accommodation_slug}/rate/v7/{rate_date}","Compare your comp set product by product — same board, same cancellation policy — instead of the cheapest-rate-per-hotel table that quietly puts your flexible rate against someone else's non-refundable.","Rate shopping done like for like — Veetal","Compara tu compset por régimen y política de cancelación en vez de por tarifa más barata, y deja de reportar gaps de precio que en realidad son gaps de producto.","## Rellena el compset e importa\n\nDa de alta el hotel y rellena su compset — hasta diez competidores. Sin ellos esto imprime una lista de precios, no una comparación. Lanza un import de Accommodation Rates y pon un schedule; el feed solo responde por las fechas que haya cubierto un import.\n\n## Lee /rate/v7, no /rate\n\nLa ruta antigua hace de proxy contra el backend legacy y devuelve otra forma. v7 devuelve tu hotel y todos los competidores en la misma carga, con un bloque _meta por tarifa que lleva is_primary y la fecha.\n\n## Define qué es comparable\n\nUn producto es un régimen más una política de cancelación: BB/flex, RO/nr. Comprueba el régimen del más inclusivo al menos, porque las banderas se apilan — una tarifa de todo incluido también trae breakfast a true. Que decida free_cancellation, con no_refundable solo de respaldo.\n\n## Monta la rejilla y deja los huecos abiertos\n\nUna celda ausente se queda en null: nunca en cero, nunca promediada, nunca rellenada con el precio que ese hotel tiene en otro producto. Significa que el competidor no vende ese producto esa noche, y eso es información.\n\n## Compara contra quien de verdad compite\n\nEl denominador cuenta solo a los hoteles que venden el producto. \"#1 de 2\" es una afirmación más pequeña y más verdadera que \"#1 de 3\" cuando el tercer hotel no está en esa carrera.","Al terminar tendrás un comando que responde a **\"dónde estoy de verdad frente a mi compset esta noche\"** — producto a producto, en vez de la tabla de tarifa-más-barata-por-hotel que compara en silencio una flexible contra una no reembolsable.\n\n**Qué necesitas:** el hotel en tu cuenta **con su compset relleno**, el feed de Accommodation Rates activo y un import terminado.\n\n**Lo que cuesta:** nada por ejecución. Las lecturas Feed no se facturan por petición — los créditos se van en los imports que recogen las tarifas.\n\n## El informe que todo el mundo monta primero, y por qué miente\n\nTarifa más barata de cada hotel, una al lado de otra. Es la comparación evidente y falla sin llegar a parecer rota nunca.\n\nEsta es una noche real del feed, puesta como toca:\n\n| | Solo aloj. · Flex | Desayuno · Flex | Solo aloj. · NR | Desayuno · NR |\n|---|---|---|---|---|\n| **Tu hotel** | **411,40** | 435,20 | — | — |\n| Competidor A | — | — | 567,40 | 631,40 |\n| Competidor B | 1.010,90 | 1.041,70 | 2.220,90 | 2.251,70 |\n\nLa tarifa más barata por hotel dice: **411,40 · 567,40 · 1.010,90**. Estás un 28 % por debajo del Competidor A. Buena noticia, y falsa.\n\n**El Competidor A no vende ninguna tarifa flexible.** Esos 567,40 son no reembolsables. Estás comparando tu tarifa cancelable en cualquier momento contra una que el huésped no puede cancelar, y llamando gap de precio a la diferencia. En el producto que ambos vendéis de verdad no hay nada que comparar — y eso es en sí mismo el hallazgo, el que nunca sobrevive a un informe de un solo número.\n\nDos cosas más que se ven en la rejilla y son invisibles en la lista:\n\n- La **no reembolsable del Competidor B cuesta más que su flexible** — 2.220,90 contra 1.010,90. \"La no reembolsable es la barata\" es una suposición, no una regla, y aquí está del revés.\n- **Tú no vendes nada en la columna de no reembolsable.** Sea deliberado o un descuido, es una decisión que tomar — y no puedes tomarla si el informe promedia el hueco hasta hacerlo desaparecer.\n\n## 1. Pon las tarifas a correr\n\nDa de alta el hotel en [Accommodations](https://dashboard.veetal.app/account/accommodations) y rellena su **compset** — hasta diez competidores. Sin ellos esta receta imprime una lista de precios, no una comparación.\n\nDespués lanza un import en [Accommodation Rates](https://dashboard.veetal.app/feed-api/feed-accommodation-rates) y pon un schedule. El feed solo responde por las fechas que ya haya cubierto un import: pide una noche que nadie importó y recibes un `404` limpio.\n\n## 2. Lee el endpoint correcto\n\n```\nGET /v2/feed/accommodation/{slug}/rate/v7/{fecha}\n```\n\n**Usa `v7`.** La ruta antigua `/rate` hace de proxy contra el backend legacy y devuelve otra forma — una trampa que conviene conocer antes de montar un parser alrededor de la equivocada.\n\nLo que vuelve es `{ report: { [slug]: [tarifa, ...] } }`: tu hotel **y todos los competidores en la misma carga**, cada tarifa con un bloque `_meta` que lleva `is_primary`, `accommodation_name`, `rate_date`, `visitor_type` y `device_type`.\n\nUna tarifa tiene esta pinta:\n\n```json\n{\n  \"room_type\": \"Habitación Doble Estándar\",\n  \"price_per_night\": 411.4,\n  \"price_total\": 411.4,\n  \"currency\": \"EUR\",\n  \"meal_plan\": { \"breakfast\": false, \"half_board\": false, \"full_board\": false, \"all_inclusive\": false },\n  \"cancellation\": { \"free_cancellation\": true, \"free_cancellation_days\": null, \"no_refundable\": false },\n  \"payment\": { \"no_prepayment\": false },\n  \"is_genius\": false,\n  \"available_rooms\": 1,\n  \"minimum_nights\": 1,\n  \"_meta\": { \"is_primary\": true, \"accommodation_name\": \"Tu Hotel\", \"rate_date\": \"2026-08-21\" }\n}\n```\n\n`meal_plan` y `cancellation` son los dos bloques que hacen posible toda la receta. El resto es detalle.\n\nExiste además `?min_rates=true`, que reduce cada hotel a su única tarifa más barata. Es cómodo, y es justo el atajo contra el que argumenta esta receta: es el parámetro que tira a la basura el mix de productos.\n\n## 3. Define qué significa \"comparable\"\n\nDos tarifas son comparables cuando venden lo mismo. Eso es **un régimen más una política de cancelación** —`BB/flex`, `RO/nr`— y las reglas viven en un solo fichero para que se puedan discutir:\n\n```javascript\nexport function board(rate) {\n  const meal = rate.meal_plan || {};\n  if (meal.all_inclusive) return 'AI';\n  if (meal.full_board) return 'FB';\n  if (meal.half_board) return 'HB';\n  if (meal.breakfast) return 'BB';\n  return 'RO';\n}\n\n// free_cancellation es la que decide; no_refundable es solo el respaldo, porque\n// una tarifa puede llegar sin ninguna de las dos banderas puesta.\nexport function cancellation(rate) {\n  const policy = rate.cancellation || {};\n  if (policy.free_cancellation) return 'flex';\n  return 'nr';\n}\n\nexport const productKey = (rate) => `${board(rate)}/${cancellation(rate)}`;\n```\n\nEl régimen se comprueba del más inclusivo al menos porque las banderas se apilan: una tarifa de todo incluido también trae `breakfast: true`, y mirar el desayuno primero la archivaría como BB.\n\n## 4. Monta la rejilla, y deja los huecos abiertos\n\n```javascript\nconst matrix = buildMatrix(report);   // producto × hotel\nconst standing = position(matrix);    // en qué puesto quedas en cada producto\n```\n\nLa única regla que importa: **una celda ausente se queda en `null`.** Nunca en cero, nunca promediada, nunca rellenada con el precio que ese hotel tiene en otro producto. Una celda vacía significa que el competidor no vende ese producto esa noche, y tratarla como un cero es por donde empieza a mentir un informe de compset.\n\nEl ranking sale de ahí — el denominador cuenta solo a los hoteles que **venden** el producto:\n\n```\nDesayuno · Cancelación gratis   #1 de 2 · eres el más barato\nDesayuno · No reembolsable      no vendes este — 2 competidor(es) sí\nSolo alojamiento · Flexible     #1 de 2 · eres el más barato\nSolo alojamiento · No reemb.    no vendes este — 2 competidor(es) sí\n```\n\n\"#1 de 2\" es una afirmación más pequeña y más verdadera que \"#1 de 3\". El compset de tres hoteles solo tiene dos en esa carrera.\n\n## 5. Ejecútalo\n\n```bash\nnode --env-file=.env index.mjs 2026-08-21\nnode --env-file=.env index.mjs 2026-08-21 --csv > rates.csv\n```\n\nEl CSV da una fila por hotel y producto, listo para una hoja de cálculo o un almacén — y sigue omitiendo las celdas vacías en vez de ponerlas a cero.\n\n## Qué viene después\n\n- Recorre un mes con `/rate/v7/{año}/{mes}` y observa cómo un competidor abre o cierra su inventario flexible según se acerca la fecha. Ese cambio de mix suele aparecer antes que el cambio de precio.\n- La misma carga trae `is_genius`, `available_rooms` y `minimum_nights`: un competidor más barato solo en tarifa Genius, o solo con tres noches mínimo, no es realmente más barato.\n- Maridala con el feed de paridad. El rate shopping te dice lo que cobra el mercado; la paridad te dice si tus propios canales están de acuerdo entre ellos.","By the end you will have a command that answers **\"where do I actually sit against my comp set tonight\"** — product by product, instead of the cheapest-rate-per-hotel table that quietly compares a flexible rate against a non-refundable one.\n\n**What you need:** the hotel on your account **with its comp set filled in**, the Accommodation Rates feed active, and one finished import.\n\n**What it costs:** nothing per run. Feed reads are not billed per request — the credits go on the imports that collect the rates.\n\n## The report everyone builds first, and why it lies\n\nCheapest rate per hotel, side by side. It is the obvious comparison and it fails without ever looking broken.\n\nHere is one real night from the feed, laid out properly:\n\n| | Room only · Flex | Breakfast · Flex | Room only · NR | Breakfast · NR |\n|---|---|---|---|---|\n| **Your hotel** | **411,40** | 435,20 | — | — |\n| Competitor A | — | — | 567,40 | 631,40 |\n| Competitor B | 1.010,90 | 1.041,70 | 2.220,90 | 2.251,70 |\n\nCheapest-per-hotel reads: **411,40 · 567,40 · 1.010,90**. You are 28 % below Competitor A. Good news, and false.\n\n**Competitor A does not sell a flexible rate at all.** That 567,40 is non-refundable. You are comparing your cancel-any-time rate against a rate the guest cannot cancel, and calling the difference a price gap. On the product you both actually sell, there is nothing to compare — which is itself the finding, and the one that never survives a single-number report.\n\nTwo more things visible in the grid and invisible in the list:\n\n- Competitor B's **non-refundable costs more than its flexible** — 2.220,90 against 1.010,90. \"Non-refundable is the cheap one\" is an assumption, not a rule, and here it is backwards.\n- **You sell nothing in the non-refundable column.** Deliberate or an oversight, that is a decision to make — and you cannot make it if the report averages the gap away.\n\n## 1. Get the rates flowing\n\nAdd the hotel in [Accommodations](https://dashboard.veetal.app/account/accommodations) and fill in its **comp set** — up to ten competitors. Without them this recipe prints a price list, not a comparison.\n\nThen launch an import in [Accommodation Rates](https://dashboard.veetal.app/feed-api/feed-accommodation-rates) and set a schedule. The feed only answers for dates an import has already covered; ask for a night nobody imported and you get a clean `404`.\n\n## 2. Read the right endpoint\n\n```\nGET /v2/feed/accommodation/{slug}/rate/v7/{date}\n```\n\n**Use `v7`.** The older `/rate` path proxies to a legacy backend and answers a different shape — a trap worth knowing about before you build a parser around the wrong one.\n\nWhat comes back is `{ report: { [slug]: [rate, ...] } }`: your hotel **and every competitor in the same payload**, each rate carrying a `_meta` block with `is_primary`, `accommodation_name`, `rate_date`, `visitor_type` and `device_type`.\n\nOne rate looks like this:\n\n```json\n{\n  \"room_type\": \"Habitación Doble Estándar\",\n  \"price_per_night\": 411.4,\n  \"price_total\": 411.4,\n  \"currency\": \"EUR\",\n  \"meal_plan\": { \"breakfast\": false, \"half_board\": false, \"full_board\": false, \"all_inclusive\": false },\n  \"cancellation\": { \"free_cancellation\": true, \"free_cancellation_days\": null, \"no_refundable\": false },\n  \"payment\": { \"no_prepayment\": false },\n  \"is_genius\": false,\n  \"available_rooms\": 1,\n  \"minimum_nights\": 1,\n  \"_meta\": { \"is_primary\": true, \"accommodation_name\": \"Your Hotel\", \"rate_date\": \"2026-08-21\" }\n}\n```\n\n`meal_plan` and `cancellation` are the two blocks that make the whole recipe possible. Everything else is detail.\n\nThere is also `?min_rates=true`, which collapses each hotel to its single cheapest rate. It is convenient, and it is exactly the shortcut this recipe argues against: it is the parameter that throws away the product mix.\n\n## 3. Define what \"comparable\" means\n\nTwo rates are comparable when they sell the same thing. That is a **board level plus a cancellation policy** — `BB/flex`, `RO/nr` — and the rules live in one file so they can be argued with:\n\n```javascript\nexport function board(rate) {\n  const meal = rate.meal_plan || {};\n  if (meal.all_inclusive) return 'AI';\n  if (meal.full_board) return 'FB';\n  if (meal.half_board) return 'HB';\n  if (meal.breakfast) return 'BB';\n  return 'RO';\n}\n\n// free_cancellation decides; no_refundable is only the fallback, because a rate\n// can arrive with neither flag set.\nexport function cancellation(rate) {\n  const policy = rate.cancellation || {};\n  if (policy.free_cancellation) return 'flex';\n  return 'nr';\n}\n\nexport const productKey = (rate) => `${board(rate)}/${cancellation(rate)}`;\n```\n\nBoard is checked most-inclusive first because the flags stack: an all-inclusive rate also has `breakfast: true`, and testing breakfast first would file it as BB.\n\n## 4. Build the grid, and leave the holes open\n\n```javascript\nconst matrix = buildMatrix(report);   // product × hotel\nconst standing = position(matrix);    // where you rank on each product\n```\n\nThe one rule that matters: **a missing cell stays `null`.** Never zero, never averaged over, never filled with that hotel's price from another product. An empty cell means the competitor does not sell that product that night, and treating it as a zero is how a comp set report starts lying.\n\nThe ranking follows from it — the denominator only counts hotels that **sell** the product:\n\n```\nBreakfast · Free cancellation   #1 of 2 · you are the cheapest\nBreakfast · Non-refundable      you do not sell this — 2 competitor(s) do\nRoom only · Free cancellation   #1 of 2 · you are the cheapest\nRoom only · Non-refundable      you do not sell this — 2 competitor(s) do\n```\n\n\"#1 of 2\" is a smaller and truer claim than \"#1 of 3\". The three-hotel comp set only has two hotels in that race.\n\n## 5. Run it\n\n```bash\nnode --env-file=.env index.mjs 2026-08-21\nnode --env-file=.env index.mjs 2026-08-21 --csv > rates.csv\n```\n\nThe CSV gives one row per hotel and product, ready for a spreadsheet or a warehouse — still with the empty cells omitted rather than zeroed.\n\n## What happens next\n\n- Walk a month with `/rate/v7/{year}/{month}` and watch a competitor open or close its flexible inventory as the date approaches. That change of product mix usually shows up before the price does.\n- The same payload carries `is_genius`, `available_rooms` and `minimum_nights`: a competitor cheaper only on a Genius rate, or only with a three-night minimum, is not really cheaper.\n- Pair it with the parity feed. Rate shopping tells you what the market charges; parity tells you whether your own channels agree with each other.","rate-shopping-like-for-like",[33,452,1088],"Compara tu compset producto a producto — mismo régimen, misma política de cancelación — en vez de la tabla de tarifa-más-barata-por-hotel que pone en silencio tu flexible contra la no reembolsable del vecino.","## ¿Por qué no comparar simplemente la tarifa más barata de cada hotel?\n\nPorque la tarifa más barata de dos hoteles suele ser dos productos distintos. En un compset real, un competidor no vendía ninguna tarifa flexible, así que su más barata era no reembolsable — compararla con una flexible producía un \"gap\" del 28 % que no existía. Comparable significa mismo régimen y misma política de cancelación.\n\n## ¿Qué significa una celda vacía?\n\nQue ese competidor no vende ese producto esa noche. Es un hallazgo, no un hueco: se queda en null, nunca se promedia y nunca se sustituye por el precio que ese hotel tiene en otro producto. Tratar las celdas vacías como ceros es la forma más rápida de que un informe de compset empiece a mentir.\n\n## ¿No es siempre más barata la no reembolsable que la flexible?\n\nNo, y los datos lo dicen. En la noche que documenta esta receta, la no reembolsable de un competidor estaba a 2.220,90 frente a los 1.010,90 de su flexible — más del doble. Saca la suposición de tu modelo y lee lo que devuelve el feed.\n\n## ¿Uso /rate o /rate/v7?\n\nv7. La ruta antigua /rate hace de proxy contra el backend legacy y devuelve otra forma, así que un parser construido para una se rompe con la otra. Todo en esta receta usa /rate/v7/{fecha}, y existe /rate/v7/{año}/{mes} para un mes entero.\n\n## El endpoint me devuelve 404 en la fecha que quiero\n\nEl feed solo responde por las fechas que ya haya cubierto un import. Mira en la pestaña Imports de la API de Accommodation Rates qué fechas tienes de verdad, y pon un schedule para que la ventana siga avanzando.\n\n## ¿Por qué no sale mi compset en la respuesta?\n\nEl compset sale del propio alojamiento, no de la petición. Rellénalo en la ficha del hotel en el dashboard —hasta diez competidores— y lanza un import. Sin él, el report contiene un solo hotel y no hay nada que comparar.","accommodation-rates","Rate shopping comparando lo comparable — Veetal","Un comando que imprime una rejilla producto × hotel para una noche, tu puesto en cada producto contando solo a los hoteles que lo venden, y un aviso explícito por cada celda vacía — más un CSV para la hoja de cálculo.","types/rates","## Why not just compare the cheapest rate of each hotel?\n\nBecause the cheapest rate of two hotels is often two different products. On a real comp set, one competitor sold no flexible rate at all, so its cheapest was non-refundable — comparing it against a flexible one produced a 28% \"gap\" that did not exist. Comparable means same board and same cancellation policy.\n\n## What does an empty cell mean?\n\nThat the competitor does not sell that product on that night. It is a finding, not a hole: it stays null, it is never averaged over, and it is never replaced by that hotel's price from another product. Treating empty cells as zeros is the fastest way to make a comp set report lie.\n\n## Isn't a non-refundable rate always cheaper than a flexible one?\n\nNo, and the data says so. On the night documented here, one competitor's non-refundable was 2.220,90 against 1.010,90 for its flexible — more than double. Price the assumption out of your model and read what the feed actually returns.\n\n## Should I use /rate or /rate/v7?\n\nv7. The older /rate path proxies to a legacy backend and answers a different shape, so a parser built against one will break on the other. Everything in this recipe uses /rate/v7/{date}, and there is a /rate/v7/{year}/{month} for a whole month.\n\n## The endpoint answers 404 for the date I want\n\nThe feed only answers for dates an import has already covered. Check the Imports tab of the Accommodation Rates API to see which dates you actually have, and set a schedule so the window keeps moving forward.\n\n## Why is my comp set missing from the response?\n\nThe comp set comes from the accommodation itself, not from the request. Fill it in on the hotel's detail page in the dashboard — up to ten competitors — and run an import. Without it, the report contains one hotel and there is nothing to compare.","rate-shopping-comparable","https://dashboard.veetal.app/feed-api/feed-accommodation-rates","Cheapest rate per hotel is the comparison everyone builds first, and it fails without ever looking broken. On a real comp set it produced a 28% gap against a competitor that sells no flexible rate at all. Here is the grid that does not.","Node 20 · JavaScript, sin dependencias","## Fill in the comp set and import\n\nAdd the hotel and fill in its comp set — up to ten competitors. Without them this prints a price list, not a comparison. Launch one Accommodation Rates import and set a schedule; the feed only answers for dates an import has covered.\n\n## Read /rate/v7, not /rate\n\nThe older path proxies to a legacy backend and answers a different shape. v7 returns your hotel and every competitor in the same payload, each rate tagged with a _meta block carrying is_primary and the rate date.\n\n## Define what comparable means\n\nA product is a board level plus a cancellation policy: BB/flex, RO/nr. Check board most-inclusive first, because the flags stack — an all-inclusive rate also has breakfast true. Let free_cancellation decide the policy, with no_refundable only as fallback.\n\n## Build the grid and leave the holes open\n\nA missing cell stays null: never zero, never averaged over, never filled with that hotel's price from another product. It means the competitor does not sell that product that night, which is information.\n\n## Rank against who actually competes\n\nThe denominator counts only hotels that sell the product. \"#1 of 2\" is a smaller and truer claim than \"#1 of 3\" when the third hotel is not in that race.","git clone https://github.com/Veetal-Connect/recipes.git\ncd recipes/rate-shopping-like-for-like\ncp .env.example .env          # your VEETAL_API_KEY and VEETAL_ACCOMMODATION_SLUG\nnode --env-file=.env index.mjs YYYY-MM-DD          # put the night you want to price","curl \"https://api.veetal.app/v2/feed/accommodation/YOUR_ACCOMMODATION_SLUG/rate/v7/2026-08-21\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"\n\n# un mes entero:\ncurl \"https://api.veetal.app/v2/feed/accommodation/YOUR_ACCOMMODATION_SLUG/rate/v7/2026/08\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Rate shopping comparando lo comparable","La tarifa más barata de cada hotel es la comparación que monta todo el mundo primero, y falla sin llegar a parecer rota. En un compset real producía un gap del 28 % contra un competidor que no vende ninguna tarifa flexible. Esta es la rejilla que no lo hace.","One night, your hotel and its whole comp set in the same payload. Note the version: v7 is the one that reads the feed.","Una noche, tu hotel y su compset entero en la misma carga. Ojo a la versión: v7 es la que lee el feed.",{"id":246,"fields":1330},{"Minutes":1076,"Title_en":1331,"Datasets":1332,"Published":802,"Build_en":1333,"Seo_description_en":1334,"Endpoint":1335,"Summary_en":1336,"Seo_title_en":1337,"Seo_description_es":1338,"Steps_es":1339,"Body_es":1340,"Body_en":1341,"Order":1342,"Summary_es":1343,"Faqs_es":1344,"Seo_title_es":1345,"Build_es":1346,"Date":1188,"Slug_en":1347,"Icon":1348,"Faqs_en":1349,"Slug_es":1350,"Dashboard_url":1351,"Intro_en":1352,"Steps_en":1353,"Curl":1354,"Layer":1164,"Title_es":1355,"Intro_es":1356,"Kind":1167,"Call_text_en":1357,"Call_text_es":1358},"Add a route and watch what it costs to fly in",[75],"A route registered on your account with its point of sale set correctly, one live fare pulled without any setup at all, and the stored series behind it: airline, times, stops, baggage and CO2 per flight, extraction after extraction.","Register a route on Veetal, pull a live fare with two IATA codes and store the daily series: airline, times, stops, baggage and CO2 as an inbound demand signal.","POST /v2/account/flight","People book the flight before the room. Register the routes your guests arrive on and you get the fare re-priced every day — a demand signal that moves before your own pace does.","Track a flight route as a hotel demand signal — Veetal","Da de alta una ruta en Veetal, trae una tarifa en vivo con dos códigos IATA y guarda la serie diaria: aerolínea, horarios, escalas, equipaje y CO2 como señal de demanda de entrada.","## Resuelve los aeropuertos\n\nLa búsqueda de catálogo de Veetal (type=airports) convierte una ciudad en códigos IATA sin gastar créditos, y el autocompletado del propio asistente hace lo mismo mientras escribes. Solo Londres ofrece siete, y elegir el que no es responde en silencio sobre otro mercado.\n\n## Crea la ruta\n\nEn Flights, Add flights: tipo de viaje, fechas y pasajeros. Un Round trip pide un rango de fechas; un One way, una fecha suelta.\n\n## Pon el punto de venta\n\nLANGUAGE y COUNTRY son obligatorios, y no son la ruta — son el mercado cuyos precios quieres. Deja uno vacío y Add flight se queda deshabilitado.\n\n## Pide una tarifa en vivo\n\nGET /v2/real-time/flight/rate/airport/{origin}/{destination}/{departure_date} no necesita ninguna entidad: dos códigos IATA y una fecha. Responde en segundos con aerolínea, horarios, escalas, equipaje y CO2 por vuelo.\n\n## Conviértelo en una serie\n\nActiva la ruta en la Feed API de tarifas de vuelo y lanza la primera importación. A partir de ahí GET /v2/feed/flight/{flight_id}/rates lee las extracciones almacenadas — que es lo que convierte el precio en una señal y no en una foto fija.","Al terminar tendrás una ruta en tu cuenta, una tarifa en vivo en pantalla y la serie almacenada que convierte esa tarifa en una señal de demanda para las noches que alimenta.\n\n**Qué necesitas:** una cuenta con la Account API activa y los dos aeropuertos que te importan.\n\n**Qué cuesta:** crear la ruta es gratis. La llamada en vivo consume créditos por petición; el feed almacenado es la lectura barata, y los créditos se van en las importaciones que lo llenan.\n\n## Por qué dar de alta una ruta si la llamada en vivo no necesita nada\n\nEsta es la pregunta que hay que responder primero, porque el endpoint de tiempo real acepta de verdad dos códigos IATA y una fecha y te devuelve tarifas — sin entidad, sin montaje, sin configurar nada.\n\nLa entidad está para otra cosa. **Una tarifa suelta no te dice casi nada.** Madrid–Barcelona a 180 € es caro o barato según lo que costara ayer, la semana pasada y la misma semana del año pasado. Lo que mueve una decisión de revenue es la *serie*: la misma ruta, el mismo punto de venta, revalorada día tras día. Da de alta la ruta y Veetal guarda cada extracción; entonces la lectura del feed es barata y repetible, y cada llamada en vivo que ibas a poner en un bucle es un crédito que no gastas.\n\nDicho de otro modo: **Real Time responde \"cuánto cuesta ahora\". Feed responde \"qué le está pasando a esta ruta\".** Solo una de las dos es un indicador adelantado.\n\n## 1. Los aeropuertos, resueltos gratis\n\nLos aeropuertos son datos de catálogo, así que resolverlos no cuesta nada — la búsqueda de catálogo (`type=airports`) es gratuita, 0 créditos, y el autocompletado del asistente los resuelve por ti mientras escribes.\n\nSolo Londres ofrece siete aeropuertos con sus códigos IATA. Importa más de lo que parece: LGW y LHR no son el mismo mercado emisor, y una ruta montada sobre el que no es responde correctamente sobre una ciudad desde la que tus huéspedes no vuelan.\n\nLos aeropuertos se resuelven en local, lo que convierte a los vuelos en la más autosuficiente de las cuatro entidades — funciona incluso cuando las OTAs tienen un mal día.\n\n![El autocompletado de aeropuertos resolviendo una ciudad en sus aeropuertos con sus códigos IATA](/images-webp/recipes/add-a-route-to-track-inbound-demand/01-airports.webp)\n\n## 2. Crea la ruta\n\nEn [Flights](https://dashboard.veetal.app/account/flights), **Add flights**. Escribe una ciudad y el autocompletado te da sus aeropuertos con su código IATA. Después, tipo de viaje, fechas y pasajeros.\n\n- **Round trip** pide un rango de fechas.\n- **One way** acepta una fecha suelta.\n\n![El formulario Add new flight: aeropuertos de origen y destino, tipo de viaje, fechas y pasajeros](/images-webp/recipes/add-a-route-to-track-inbound-demand/02-route-form.webp)\n\n## 3. El punto de venta no es la ruta\n\nHay dos campos obligatorios y fáciles de pasar por alto: **LANGUAGE** y **COUNTRY**.\n\n*No* son el origen del vuelo. Son el **punto de venta** — el mercado cuyos precios quieres ver. La misma plaza en el mismo avión se tarifica distinto para un navegador en España que para uno en Estados Unidos, y cuál de los dos estás mirando es una decisión, no un trámite. Si sigues la demanda alemana hacia Barcelona, el punto de venta es Alemania aunque la ruta sea la misma.\n\nDeja uno vacío y el campo se pone rojo con *This field is required*, y **Add flight** se queda deshabilitado. Ese botón deshabilitado es el \"el formulario está roto\" más repetido de esta pantalla.\n\nEse mismo campo decide la moneda que te devuelve el endpoint en vivo: `location=ES` responde en euros, `US` en dólares, `MX` en pesos mexicanos.\n\n![La ruta en el listado de vuelos, con sus columnas LANG y COUNTRY junto a las fechas](/images-webp/recipes/add-a-route-to-track-inbound-demand/03-route-created.webp)\n\n## 4. Una llamada en vivo, sin montar nada\n\n```\nGET /v2/real-time/flight/rate/airport/{origin}/{destination}/{departure_date}\n```\n\nAñade `return_date` para ida y vuelta, `adults`, `children`, `infants` para el pasaje, `location` y `language` para el punto de venta, y `order_by=price` o `recommended`.\n\nResponde en unos segundos con los vuelos a la venta: **aerolínea, horarios, escalas, equipaje, CO2 y los segmentos de cada itinerario**. Al ser Real Time es cacheable — la ventana de caché se configura por API en el dashboard, de 0 a 24 horas, y `no_cache=true` fuerza una respuesta fresca que no se guarda como parte de los parámetros.\n\nEsta llamada es la herramienta correcta para una pregunta puntual: cuánto cuesta volar para el fin de semana de ese congreso.\n\n## 5. La misma ruta, todos los días\n\nPara tener serie, activa la ruta en la Feed API de **tarifas de vuelo** y lanza la primera importación a mano — lee la estimación de créditos antes de pulsar y después ponla en un schedule para que la serie siga llenándose.\n\n```\nGET /v2/feed/flight/{flight_id}/rates\n```\n\nEl `flight_id` es el id de la entidad que acabas de crear, que sale de `GET /v2/account/flight`. La forma depende del tipo de viaje: un one way devuelve `flights[]`, y una ida y vuelta devuelve `outbound_flights[]` y `return_flights[]`, cada vuelo con su aerolínea, horarios, escalas, equipaje y CO2.\n\nPasa `import_id` o `import_date` para leer una extracción concreta. Sin ellos te llevas la última — que es lo que quieres en un panel, y no lo que quieres cuando estás construyendo la curva.\n\n## De qué es indicador adelantado, y de qué no\n\n**No** es un contador de reservas. Nadie te vende cuánta gente ha comprado plaza.\n\nLo que sí es: el **precio y la forma de llegar**. Tarifas subiendo para una semana concreta, tarifas baratas que desaparecen, vuelos directos que se agotan hasta que solo quedan itinerarios con dos escalas — eso es el mercado tensándose para esas fechas, y pasa mientras tu propio ritmo todavía parece normal. Crúzalo con el calendario de eventos de la misma ciudad y tienes las dos mitades de la misma historia: los eventos te dicen *por qué* viene la demanda, la ruta te dice *si ya se está comprando*.\n\n## Qué viene después\n\nDa de alta las dos o tres rutas que alimentan tu ciudad de verdad — tus mercados emisores principales, no todos los aeropuertos del mundo — y empareja la serie con el feed de eventos. La receta Flight-Demand Forecast hace exactamente eso con los datos que produce este montaje.","By the end you will have a route on your account, one live fare on screen, and the stored series that turns that fare into a demand signal for the nights it feeds.\n\n**What you need:** an account with the Account API active, and the two airports you care about.\n\n**What it costs:** creating the route is free. The live call consumes credits per request; the stored feed is the cheap read, and the credits go on the imports that fill it.\n\n## Why register a route if the live call needs nothing\n\nThis is the question worth answering first, because the real-time endpoint genuinely takes two IATA codes and a date and gives you fares — no entity, no setup, nothing to configure.\n\nThe entity exists for a different job. **A fare on its own tells you almost nothing.** Madrid–Barcelona at 180 € is expensive or cheap depending on what it cost yesterday, last week and the same week last year. What moves a revenue decision is the *series*: the same route, the same point of sale, re-priced day after day. Register the route and Veetal stores each extraction; then the feed read is cheap and repeatable, and every live call you were about to loop is a credit you did not spend.\n\nPut another way: **Real Time answers \"what does it cost now\". Feed answers \"what has been happening to this route\".** Only one of the two is a leading indicator.\n\n## 1. The airports, resolved for free\n\nAirports are catalog data, so resolving them costs nothing — the catalog search (`type=airports`) is free, 0 credits, and the wizard's autocomplete resolves them for you while you type.\n\nLondon alone offers seven airports with their IATA codes. This matters more than it looks: LGW and LHR are not the same inbound market, and a route built on the wrong one answers correctly about a city your guests are not flying from.\n\nAirports resolve locally, which makes flights the most self-contained of the four entity types — it works even when the OTAs are having a bad day.\n\n![The airport autocomplete resolving a city into its airports with their IATA codes](/images-webp/recipes/add-a-route-to-track-inbound-demand/01-airports.webp)\n\n## 2. Create the route\n\nOn [Flights](https://dashboard.veetal.app/account/flights), **Add flights**. Type a city and the autocomplete gives you its airports with their IATA codes. Then trip type, dates and passengers.\n\n- **Round trip** needs a date range.\n- **One way** takes a single date.\n\n![The Add new flight form: origin and destination airports, trip type, travel dates and passengers](/images-webp/recipes/add-a-route-to-track-inbound-demand/02-route-form.webp)\n\n## 3. Point of sale is not the route\n\nTwo fields are required and easy to miss: **LANGUAGE** and **COUNTRY**.\n\nThey are *not* the origin of the flight. They are the **point of sale** — the market whose prices you want to see. The same seat on the same plane is priced differently to a browser in Spain and a browser in the United States, and which of those two you are watching is a decision, not a formality. If you are tracking German demand into Barcelona, the point of sale is Germany even though the route is the same one.\n\nLeave one empty and the field turns red with *This field is required*, and **Add flight** stays disabled. That disabled button is the single most common \"the form is broken\" report on this screen.\n\nThe same field decides the currency you get back on the live endpoint: `location=ES` answers in euros, `US` in dollars, `MX` in Mexican pesos.\n\n![The route on the flights list, with its own LANG and COUNTRY columns next to the dates](/images-webp/recipes/add-a-route-to-track-inbound-demand/03-route-created.webp)\n\n## 4. One live call, no setup\n\n```\nGET /v2/real-time/flight/rate/airport/{origin}/{destination}/{departure_date}\n```\n\nAdd `return_date` for a round trip, `adults`, `children`, `infants` for the party, `location` and `language` for the point of sale, and `order_by=price` or `recommended`.\n\nIt answers in a few seconds with the flights on offer: **airline, times, stops, baggage, CO2 and the segments of each itinerary**. Being a Real Time endpoint it is cacheable — the cache window is configurable per API from 0 to 24 hours in the dashboard, and `no_cache=true` forces a fresh answer that is not stored as part of the parameters.\n\nThis call is the right tool for a one-off question: what does it cost to fly in for that congress weekend.\n\n## 5. The same route, every day\n\nFor a series, activate the route on the **flight rates** Feed API and launch the first import by hand — read the credit estimate before you press, then put it on a schedule so the series keeps filling.\n\n```\nGET /v2/feed/flight/{flight_id}/rates\n```\n\nThe `flight_id` is the id of the entity you just created, from `GET /v2/account/flight`. The shape follows the trip type: a one way returns `flights[]`, a round trip returns `outbound_flights[]` and `return_flights[]`, each flight carrying its airline, times, stops, baggage and CO2.\n\nPass `import_id` or `import_date` to read one specific extraction. Without them you get the latest — which is what you want on a dashboard, and not what you want when you are building the curve.\n\n## What this is a leading indicator of, and what it is not\n\nIt is **not** a booking count. Nobody sells you the number of people who bought a seat.\n\nWhat it is: the **price and shape of getting there**. Fares climbing on a given week, cheap fares disappearing, direct flights selling out until only two-stop itineraries remain — that is the market tightening for those dates, and it happens while your own pace still looks ordinary. Cross it with the event calendar for the same city and you get the two halves of the same story: events tell you *why* the demand is coming, the route tells you *whether it is already being bought*.\n\n## What happens next\n\nRegister the two or three routes that actually feed your city — your main source markets, not every airport in the world — and pair the series with the events feed. The Flight-Demand Forecast recipe does exactly that with the data this setup produces.",7,"La gente reserva el vuelo antes que la habitación. Da de alta las rutas por las que llegan tus huéspedes y tendrás la tarifa reevaluada cada día — una señal de demanda que se mueve antes que tu propio ritmo de reservas.","## ¿Tengo que dar de alta una ruta para conseguir una tarifa en vivo?\n\nNo. `GET /v2/real-time/flight/rate/airport/{origin}/{destination}/{departure_date}` acepta dos códigos IATA y una fecha, y nada más. Das de alta la ruta cuando quieres esa misma consulta guardada día tras día — la serie, no la foto.\n\n## ¿Para qué sirven LANGUAGE y COUNTRY?\n\nSon el punto de venta: el mercado cuyos precios estás mirando, no el origen del vuelo. Son también lo que decide la moneda de una respuesta en vivo — ES te da euros, US dólares y MX pesos mexicanos.\n\n## ¿Por qué está deshabilitado el botón Add flight?\n\nPorque falta algún campo obligatorio, y casi siempre es LANGUAGE o COUNTRY. El campo se pone rojo con *This field is required* y el botón no se activa hasta que estén los dos.\n\n## ¿Cómo se lee una ida y vuelta?\n\nEl feed la separa: `outbound_flights[]` y `return_flights[]` en vez del `flights[]` único de un one way. El formulario del dashboard pide un rango de fechas para Round trip y una fecha suelta para One way.\n\n## ¿Puedo leer una extracción concreta en vez de la última?\n\nSí — pasa `import_id` o `import_date` al endpoint del feed. Sin ellos te llevas la ejecución más reciente, que es lo correcto para un panel en vivo y lo incorrecto para construir una curva histórica.\n\n## ¿Cómo de fresca es una tarifa en vivo?\n\nSe trae en ese momento, en unos segundos. Los endpoints Real Time son cacheables de 0 a 24 horas —configurable por API en el dashboard— y `no_cache=true` fuerza una consulta fresca cuando necesitas estar seguro.","Sigue una ruta de vuelo como señal de demanda hotelera — Veetal","Una ruta dada de alta en tu cuenta con su punto de venta bien puesto, una tarifa en vivo traída sin montar nada, y la serie almacenada que hay detrás: aerolínea, horarios, escalas, equipaje y CO2 por vuelo, extracción tras extracción.","add-a-route-to-track-inbound-demand","types/flights","## Do I have to register a route to get a live fare?\n\nNo. `GET /v2/real-time/flight/rate/airport/{origin}/{destination}/{departure_date}` takes two IATA codes and a date, and nothing else. You register the route when you want the same query stored day after day — the series, not the snapshot.\n\n## What are LANGUAGE and COUNTRY for?\n\nThey are the point of sale: the market whose prices you are watching, not the origin of the flight. They are also what decides the currency of a live answer — ES gives you euros, US dollars, MX Mexican pesos.\n\n## Why is the Add flight button disabled?\n\nBecause one of the required fields is empty, and it is almost always LANGUAGE or COUNTRY. The field turns red with *This field is required* and the button stays off until both are set.\n\n## How do I read a round trip?\n\nThe feed splits it: `outbound_flights[]` and `return_flights[]` instead of the single `flights[]` of a one way. The dashboard form asks for a date range for a round trip and a single date for a one way.\n\n## Can I read a specific extraction instead of the latest one?\n\nYes — pass `import_id` or `import_date` to the feed endpoint. Without them you get the most recent run, which is right for a live panel and wrong for building a historical curve.\n\n## How fresh is a live fare?\n\nIt is fetched at that moment, in a few seconds. Real Time endpoints are cacheable from 0 to 24 hours — configurable per API in the dashboard — and `no_cache=true` forces a fresh fetch when you need to be sure.","da-de-alta-una-ruta-y-sigue-la-demanda-de-entrada","https://dashboard.veetal.app/account/flights","A live fare is one number. The same route priced every single day is a trend, and a trend on inbound seats is one of the few demand signals that arrives before your booking pace does. The live call needs nothing registered; the series does — and this is the ten minutes that gets you one.","## Resolve the airports\n\nVeetal's free catalog search (type=airports) turns a city into IATA codes, and the wizard's own autocomplete does the same while you type. London alone offers seven, and picking the wrong one quietly answers about a different market.\n\n## Create the route\n\nOn Flights, Add flights: trip type, dates and passengers. A round trip needs a date range; a one way takes a single date.\n\n## Set the point of sale\n\nLANGUAGE and COUNTRY are required, and they are not the route — they are the market whose prices you want. Leave one empty and Add flight stays disabled.\n\n## Ask for a live fare\n\nGET /v2/real-time/flight/rate/airport/{origin}/{destination}/{departure_date} needs no entity at all: two IATA codes and a date. It answers in seconds with airline, times, stops, baggage and CO2 per flight.\n\n## Turn it into a series\n\nActivate the route on the flight rates Feed API and launch the first import. From then on GET /v2/feed/flight/{flight_id}/rates reads the stored extractions — which is what makes the price a signal instead of a snapshot.","# 1) A live fare — no entity needed, just two IATA codes and a date\ncurl \"https://api.veetal.app/v2/real-time/flight/rate/airport/LHR/BCN/2026-11-03?location=ES&language=en&adults=1\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"\n\n# 2) The routes on your account, and the stored series of one of them\ncurl \"https://api.veetal.app/v2/account/flight\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"\n\ncurl \"https://api.veetal.app/v2/feed/flight/YOUR_FLIGHT_ID/rates\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Da de alta una ruta y vigila lo que cuesta volar a tu ciudad","Una tarifa en vivo es un número. Esa misma ruta valorada todos los días es una tendencia, y una tendencia en plazas de entrada es de las pocas señales de demanda que llegan antes que tu ritmo de reservas. La llamada en vivo no necesita nada dado de alta; la serie sí — y estos son los diez minutos que te la consiguen.","The live call takes two IATA codes and a date and needs nothing registered. The last two are the reason to register the route: your flight entities, and the stored extractions behind one of them.","La llamada en vivo acepta dos códigos IATA y una fecha, y no necesita nada dado de alta. Las dos últimas son la razón de dar de alta la ruta: tus entidades de vuelo y las extracciones almacenadas de una de ellas.",{"id":245,"fields":1360},{"Prompt":1361,"Minutes":1076,"Title_en":1362,"Datasets":1363,"Published":802,"Build_en":1364,"Needs_import":802,"Seo_description_en":1365,"Endpoint":1366,"Summary_en":1367,"Seo_title_en":1368,"Seo_description_es":1369,"Steps_es":1370,"Order":1342,"Requires":1371,"Summary_es":1372,"Faqs_es":1373,"Import_service":11,"Seo_title_es":1374,"Build_es":1375,"Date":1093,"Slug_en":1376,"Icon":1348,"Faqs_en":1377,"Slug_es":1378,"Import_entity":9,"Intro_en":1379,"Steps_en":1380,"Curl":1381,"Layer":10,"Title_es":1382,"Intro_es":1383,"Kind":1103,"Call_text_en":1384,"Call_text_es":1385},"Use my Veetal Connect data to build an inbound flight demand view for a\nroute I track.\n\nI want to use flight fares as an early signal of hotel demand: when the\ncheapest fare into my city starts climbing, demand is tightening. Work out what\ndata you need and fetch it.\n\nBuild it as a single self-contained HTML page, plain HTML and CSS:\n\n- The cheapest fare per departure date, as a simple bar or line built with CSS\n  only — no charting library.\n- Under it, the flights behind the cheapest fare: airline, times, stops and\n  baggage.\n- Highlight the dates where the cheapest fare is well above the period's median,\n  since those are the tight ones.\n- Show CO2 per flight when the data carries it.\n- Leave a date out when there is no fare for it rather than interpolating.\n\nClean and readable, works in light and dark.","Flight-Demand Forecast",[75],"An inbound demand view for a route: fares over time with the cheapest option per day, so a rising floor price tells you demand is tightening while there is still time to price for it.","Read stored flight rates for the routes you track — airline, times, stops, baggage and CO2 — as a leading indicator of hotel demand.","GET /v2/feed/flight/{flight_id}/rates","Inbound flight rates as a leading indicator of hotel demand.","Flight-Demand Forecast — Flight Rates API — Veetal Connect API","Lee las tarifas de vuelo almacenadas de las rutas que sigues — aerolínea, horarios, escalas, equipaje y CO2 — como indicador adelantado de demanda hotelera.","## Consigue tu API key\n\nCrea tu cuenta y copia tu key. Empiezas gratis con 100 créditos.\n\n## Elige tu ruta\n\nLista las entidades de vuelo configuradas en tu cuenta y copia el id de la ruta que quieras leer.\n\n## Lee las tarifas\n\nUna llamada devuelve los vuelos almacenados de esa ruta, de ida o de ida y vuelta, con aerolínea, horarios, escalas, equipaje y CO2.",[9,1088],"Las tarifas de vuelos entrantes como indicador adelantado de la demanda hotelera.","## ¿Cómo se configura una ruta?\n\nComo una entidad de vuelo en tu cuenta, con aeropuertos de origen y destino, fechas y pasajeros. Su id es lo que lee este endpoint.\n\n## ¿Ida o ida y vuelta?\n\nAmbas. Una ruta de ida devuelve una sola lista de vuelos; una de ida y vuelta devuelve las listas de ida y de vuelta por separado.\n\n## ¿Por qué anticipa la demanda hotelera?\n\nPorque el vuelo se reserva antes. Un suelo de tarifa que sube hacia una ciudad es presión entrante que todavía no ha llegado a tu pickup, que es justo cuando las decisiones de precio aún salen baratas.\n\n## ¿Es en vivo?\n\nNo, es la capa Feed almacenada, refrescada según la programación de tu cuenta. Existe un endpoint de tarifas de vuelo en tiempo real cuando necesitas la tarifa de este instante.","Previsión de demanda de vuelos — API de tarifas de vuelo — Veetal Connect API","Una vista de demanda entrante para una ruta: la evolución de tarifas con la opción más barata por día, de modo que un suelo de precio que sube te avisa de que la demanda se tensa cuando aún hay margen para tarificar.","flight-demand-forecast","## How is a flight route configured?\n\nAs a flight entity on your account, with origin and destination airports, dates and passengers. Its id is what this endpoint reads.\n\n## One-way or round-trip?\n\nBoth. A one-way route returns a single list of flights; a round-trip returns outbound and return lists separately.\n\n## Why does this predict hotel demand?\n\nBecause the flight is usually booked first. A rising floor fare into a city is inbound pressure that has not yet reached your pickup, which is exactly when pricing decisions are still cheap to make.\n\n## Is it live?\n\nNo, this is the stored Feed layer, refreshed on your account schedule. There is a real-time flight rates endpoint when you need the fare at this second.","prevision-demanda-vuelos","People book the flight before the room. This recipe reads the stored flight rates for a route you track — airline, times, stops, baggage and CO2 per flight — so you can read inbound pressure before it shows up in your own pickup.","## Get your API key\n\nCreate your account and copy your key. Start free with 100 API credits.\n\n## Pick your route\n\nList the flight entities configured on your account and copy the id of the route you want to read.\n\n## Read the fares\n\nOne call returns the stored flights for that route, one-way or round-trip, with airline, times, stops, baggage and CO2.","curl \"https://api.veetal.app/v2/feed/flight/YOUR_FLIGHT_ID/rates\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Previsión de demanda de vuelos","La gente reserva el vuelo antes que la habitación. Esta receta lee las tarifas de vuelo almacenadas de una ruta que sigues — aerolínea, horarios, escalas, equipaje y CO2 por vuelo — para leer la presión entrante antes de que aparezca en tu propio pickup.","One request returns the stored flights for that route, with fares, airline, times and stops. Swap in your flight id and your key.","Una petición devuelve los vuelos almacenados de esa ruta, con tarifas, aerolínea, horarios y escalas. Pon tu flight id y tu key.",{"id":368,"fields":1387},{"Prompt":1388,"Minutes":1276,"Title_en":1389,"Datasets":1390,"Published":802,"Build_en":1391,"Seo_description_en":1392,"Endpoint":1393,"Summary_en":1394,"Seo_title_en":1395,"Seo_description_es":1396,"Steps_es":1397,"Order":1398,"Requires":1399,"Summary_es":1400,"Faqs_es":1401,"Seo_title_es":1402,"Build_es":1403,"Date":1093,"Slug_en":1404,"Icon":1095,"Faqs_en":1405,"Slug_es":1406,"Intro_en":1407,"Steps_en":1408,"Curl":1409,"Layer":34,"Title_es":1410,"Intro_es":1411,"Kind":1103,"Call_text_en":1412,"Call_text_es":1413},"Use my Veetal Connect data to build a review reader for a hotel.\n\nI want to read that hotel's guest reviews without scraping anything: score,\ndate and text, newest first. Work out what data you need and fetch it.\n\nBuild it as a single self-contained HTML page, plain HTML and CSS:\n\n- A list of reviews, newest first, each showing the score, the date and the text.\n- Filters for score band, so I can read the bad ones on their own.\n- A header with the review count and the average of what was returned.\n- A clear loading state — this is a live call and takes a few seconds.\n- Show the reviews exactly as returned; do not summarise or rewrite them.\n\nClean and easy to skim, works in light and dark.","Booking.com Reviews without scraping",[156],"A review feed you can drop into a back office: the latest reviews with their score, date and text, filterable and ready to push into whatever you already use for guest feedback.","Get a hotel's Booking.com reviews as structured JSON through the Veetal Connect real-time API. No scraper, no selectors to maintain.","GET /v2/real-time/{reference_type}/{identifier}/reviews","Pull a hotel's Booking.com reviews as structured JSON — no scraper to maintain.","Booking.com Reviews API without scraping — Veetal Connect API","Obtén las reseñas de Booking.com de un hotel como JSON estructurado con la API en tiempo real de Veetal Connect. Sin scraper ni selectores que mantener.","## Consigue tu API key\n\nCrea tu cuenta y copia tu key. Empiezas gratis con 100 créditos.\n\n## Identifica el hotel\n\nLos endpoints en tiempo real aceptan un tipo de referencia y un identificador, así que puedes apuntar a un hotel de tu cuenta o a uno que no lo esté.\n\n## Lee las reseñas\n\nUna llamada devuelve las reseñas en JSON. Es una llamada en vivo, así que tardará unos segundos y consumirá créditos.",6,[33],"Obtén las reseñas de Booking.com de un hotel como JSON estructurado — sin scraper que mantener.","## ¿Por qué no scrapearlo y ya está?\n\nPorque entonces el scraper es tuyo: los selectores, la paginación, los límites de peticiones y el día en que empieza a devolver nada en silencio. Esto es un endpoint que devuelve JSON estructurado.\n\n## ¿Consume créditos?\n\nSí. Es una llamada en tiempo real que sale en el momento, a diferencia de los datasets Feed, que están pre-procesados y son baratos de leer.\n\n## ¿Puedo obtener las notas en vez del texto?\n\nSí — la receta de Pulso de reputación lee el desglose de notas y la posición en la ciudad, que sale más barato si no necesitas el texto.\n\n## ¿Qué webs cubre?\n\nBooking.com y otras OTAs a través de la misma familia de endpoints de reseñas en tiempo real. Consulta la referencia de la API para la lista actual.","API de reseñas de Booking.com sin scraping — Veetal Connect API","Un lector de reseñas para meter en un back office: las últimas reseñas con su nota, fecha y texto, filtrables y listas para empujar a lo que ya uses para feedback de huéspedes.","booking-reviews-without-scraping","## Why not just scrape it?\n\nBecause you then own the scraper: the selectors, the pagination, the rate limits and the day it silently starts returning nothing. This is an endpoint that returns structured JSON.\n\n## Does it consume credits?\n\nYes. It is a real-time call that goes out at request time, unlike the Feed datasets which are pre-processed and cheap to read.\n\n## Can I get the rating scores instead of the text?\n\nYes — the Reputation Pulse recipe reads the score breakdown and city ranking, which is cheaper if you do not need the review text.\n\n## Which sites are covered?\n\nBooking.com plus other OTAs through the same real-time reviews family. Check the API reference for the current list.","resenas-booking-sin-scraping","Everyone who has scraped reviews has also maintained the scraper: the selectors break, the pagination changes, the blocks arrive. This recipe returns the reviews as structured JSON from an endpoint, so there is nothing to maintain.","## Get your API key\n\nCreate your account and copy your key. Start free with 100 API credits.\n\n## Identify the hotel\n\nReal-time endpoints take a reference type and an identifier, so you can point at a hotel on your account or one that is not.\n\n## Read the reviews\n\nOne call returns the reviews as JSON. It is a live call, so expect it to take a few seconds and to consume credits.","curl \"https://api.veetal.app/v2/real-time/accommodation/YOUR_HOTEL_SLUG/reviews\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Reseñas de Booking.com sin scraping","Todo el que ha scrapeado reseñas ha mantenido también el scraper: los selectores se rompen, la paginación cambia, llegan los bloqueos. Esta receta devuelve las reseñas como JSON estructurado desde un endpoint, así que no hay nada que mantener.","One request returns the reviews as structured JSON. Swap in your hotel slug and your key.","Una petición devuelve las reseñas como JSON estructurado. Pon el slug de tu hotel y tu key.",{"id":455,"fields":1415},{"Prompt":1416,"Minutes":1076,"Title_en":1417,"Datasets":1418,"Published":802,"Build_en":1419,"Needs_import":802,"Seo_description_en":1420,"Endpoint":1421,"Summary_en":1422,"Seo_title_en":1423,"Seo_description_es":1424,"Steps_es":1425,"Order":1242,"Requires":1426,"Summary_es":1427,"Faqs_es":1428,"Seo_title_es":1429,"Build_es":1430,"Date":1155,"Slug_en":1431,"Icon":1190,"Faqs_en":1432,"Slug_es":1433,"Import_entity":33,"Intro_en":1434,"Steps_en":1435,"Curl":1436,"Layer":10,"Title_es":1437,"Intro_es":1438,"Kind":1103,"Call_text_en":1439,"Call_text_es":1440},"Using my Veetal Connect data, brief me on my competitive position for the next\nthree weekends.\n\nStart by telling me who is in my comp set and whether the rate data for those dates is\nactually there — if an import has not run, say so instead of working around it.\n\nFor each weekend:\n- my rate against each competitor, in money and as a percentage\n- who has moved since the previous extraction, and in which direction\n- how their review scores compare to mine, and whether the price ordering matches the\n  reputation ordering — where it does not, one of us is mispriced\n- any competitor missing from a date, which usually means they sold out\n\nFinish with the two or three specific moves you would make, each with the number that\njustifies it. If the honest answer is \"hold\", say hold — I do not need a recommendation\nfor the sake of having one.","Watch your comp set before it shows up in the report",[116],"A competitive briefing for a date range: where each competitor sits against you in price and in position, who moved and by how much, whether their reputation supports what they charge, and the one or two places where you are leaving money on the table.","Cross your comp set’s rates, reputation and ranking in one question and see where you are mispriced before it reaches your weekly report.","GET /v2/feed/accommodation/{slug}/rates","What your competitors charge, how they rank and what their guests write — crossed in one question, so a gap surfaces the day it opens rather than in next week’s report.","Hotel Competitive Intelligence API — Comp Set Rates & Rank — Veetal","Cruza tarifas, reputación y posición de tu comp set en una pregunta y detecta dónde estás mal posicionado antes de que llegue a tu informe semanal.","## Monta el comp set en el dashboard\n\nHasta diez competidores por alojamiento. Elige aquellos con los que un huésped te compararía de verdad, no los que tienen tus mismas estrellas — el conjunto define todo lo que viene después.\n\n## Programa el import de tarifas\n\nLas tarifas son un dataset Feed. Cada competidor en cada OTA es un listing, y los listings son lo que se factura, así que mira el estimador antes de programar una diaria.\n\n## Pregunta la comparación, no la tabla\n\n\"¿Dónde estoy caro el fin de semana que viene?\" te da una respuesta. \"Dame las tarifas\" te da una hoja de cálculo que no vas a leer.",[33,452,1088],"Qué cobra tu competencia, cómo posiciona y qué escriben sus huéspedes — cruzado en una sola pregunta, para que un hueco aparezca el día que se abre y no en el informe de la semana que viene.","## ¿En qué se diferencia de la receta de la parrilla de tarifas?\n\nAquella te enseña la parrilla. Esta la cruza con reputación y posición, así que obtienes por qué se ha movido un competidor y no solo que lo ha hecho.\n\n## ¿Cuántos competidores debería seguir?\n\nMenos de los que te apetece. Cada uno multiplica el coste de cada import, y un conjunto de diez que incluye cuatro hoteles con los que ningún huésped te compara es ruido caro.\n\n## ¿Ve su disponibilidad?\n\nNo directamente. Pero un competidor cuya tarifa desaparece para una fecha normalmente se ha llenado, y esa ausencia es una señal de demanda que vale tanto como el precio.\n\n## ¿Puedo lanzarlo cada mañana?\n\nSí. Esta es la receta que más merece programarse — un informe competitivo a las ocho, antes de las decisiones de precio del día y no después.","API de inteligencia competitiva hotelera — Tarifas y posición del comp set — Veetal","Un informe competitivo para un rango de fechas: dónde está cada competidor frente a ti en precio y en posición, quién se ha movido y cuánto, si su reputación sostiene lo que cobra, y los uno o dos sitios donde estás dejando dinero encima de la mesa.","competitive-intelligence-prompt","## How is this different from the rate grid recipe?\n\nThat one shows you the grid. This one crosses the grid with reputation and position, so you get why a competitor moved rather than only that they did.\n\n## How many competitors should I track?\n\nFewer than you want to. Each one multiplies the cost of every import, and a set of ten that includes four hotels no guest compares you to is expensive noise.\n\n## Does it see their availability?\n\nNot directly. But a competitor whose rate disappears for a date has usually sold out, and that absence is a demand signal worth as much as the price.\n\n## Can I run it every morning?\n\nYes. This is the recipe most worth scheduling — a competitive briefing at 8am, before the day's pricing decisions rather than after them.","inteligencia-competitiva-prompt","A rate shopper tells you a competitor dropped fifteen euros. It does not tell you that they dropped it because their score fell, or because a congress they were holding rooms for got cancelled. Rates, reputation and rank in the same conversation turn a number into a reason.","## Build the comp set in the dashboard\n\nUp to ten competitors per accommodation. Choose the ones a guest would actually compare you against, not the ones with the same star count — the set defines everything downstream.\n\n## Schedule the rate import\n\nRates are a Feed dataset. Every competitor on every OTA is a listing, and listings are what you are billed for, so check the estimate before you set a daily schedule.\n\n## Ask the comparison, not the table\n\n\"Where am I overpriced next weekend?\" gets you an answer. \"Give me the rates\" gets you a spreadsheet you will not read.","curl \"https://api.veetal.app/v2/feed/accommodation/YOUR_SLUG/rates?rate_year=2026&rate_month=10&min_rates=true\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Vigila tu comp set antes de que salga en el informe","Un rate shopper te dice que un competidor ha bajado quince euros. No te dice que lo ha bajado porque le ha caído la nota, o porque se ha cancelado el congreso para el que guardaba habitaciones. Tarifa, reputación y posición en la misma conversación convierten un número en un motivo.","The rates feed returns your accommodation and its whole comp set for a date or a month, already normalised across OTAs.","El feed de tarifas devuelve tu alojamiento y todo su comp set para una fecha o un mes, ya normalizado entre OTAs.",{"id":490,"fields":1442},{"Minutes":1443,"Title_en":1444,"Datasets":1445,"Published":802,"Build_en":1446,"Seo_description_en":1447,"Endpoint":1448,"Summary_en":1449,"Seo_title_en":1450,"Seo_description_es":1451,"Steps_es":1452,"Body_es":1453,"Body_en":1454,"Order":1213,"Summary_es":1455,"Faqs_es":1456,"Seo_title_es":1457,"Build_es":1458,"Date":1155,"Slug_en":1459,"Icon":1157,"Faqs_en":1460,"Slug_es":1461,"Dashboard_url":1193,"Intro_en":1462,"Steps_en":1463,"Curl":1464,"Layer":1164,"Title_es":1465,"Intro_es":1466,"Kind":1167,"Call_text_en":1467,"Call_text_es":1468},12,"Register the four entity types on your account",[115],"One accommodation with its OTA profiles resolved, one location, one location search with the filters that define your competitive set, and one flight route — plus the account endpoints that do the same thing from code.","Create the four Veetal entity types — accommodation, location, location search and flight — from the dashboard or the account API, and learn what each one feeds.","POST /v2/account/accommodation","Create an accommodation, a location, a location search and a flight from the dashboard — the four things every Feed and Real Time endpoint asks you to point at, and what each one is actually for.","Register hotels, destinations and routes on Veetal — Veetal","Crea los cuatro tipos de entidad de Veetal — alojamiento, location, búsqueda de destino y vuelo — desde el dashboard o la account API, y descubre qué alimenta cada uno.","## Da de alta el hotel\n\nEn la pestaña Accommodations, Add accommodations. Busca en Booking por nombre, elige la ficha y comprueba lo que ha resuelto Veetal: estrellas, nota, dirección y en qué OTAs tiene ficha el hotel de verdad. El slug que asigna sale de la URL de Booking, no del nombre.\n\n## Da de alta el destino\n\nEn Locations, busca el destino y lee los resultados con cuidado — hay cuatro Barcelonas en cuatro países. El nombre tiene que ser el real del destino, y las locations son sobre lo que trabajan los feeds de eventos y festivos.\n\n## Da de alta el mercado filtrado\n\nEn Location searches, elige el destino y después pon los filtros: estrellas, tipo de alojamiento, régimen, ocupación, moneda, idioma. Esos filtros son la entidad — definen qué hoteles entran en la búsqueda y cuánto cuesta cada ejecución.\n\n## Da de alta la ruta\n\nEn Flights, escribe una ciudad para sacar sus aeropuertos con su código IATA, elige tipo de viaje y fechas, y rellena idioma y país. Esos dos son obligatorios: son el punto de venta, el mercado cuyas tarifas quieres.\n\n## Házlo desde código\n\nLos cuatro tipos tienen POST, PUT, DELETE y GET bajo /v2/account. Usa el GET para sacar los slugs y los ids que piden los endpoints Feed y Real Time.","Al terminar tendrás una de cada uno de los cuatro tipos de entidad en tu cuenta —un alojamiento, una location, una búsqueda de destino y un vuelo—, que es lo que te pide cualquier endpoint Feed o Real Time para saber sobre qué trabajar.\n\n**Qué necesitas:** una cuenta con la Account API activa. Nada más.\n\n**Lo que cuesta:** nada. Dar de alta entidades es gratis, y resolverlas contra Booking también. Solo pagas cuando pides datos sobre ellas.\n\n## Qué es una entidad y por qué hay cuatro\n\nUna entidad es algo que le has dicho a Veetal que vigile. Los endpoints no aceptan texto libre: aceptan *tus* identificadores. Cuál necesitas depende de la pregunta:\n\n| Tipo | Responde | Lo usan |\n|---|---|---|\n| **Alojamiento** | un hotel: sus tarifas, disponibilidad, reputación, reseñas, paridad | casi todos los endpoints Real Time y los datasets Feed de alojamiento |\n| **Location** | un destino entero: qué está pasando allí | los feeds de eventos y festivos |\n| **Búsqueda de destino** | un destino filtrado en un conjunto competitivo: quién está a la venta y a qué precio | el feed de Booking location search y el de demanda de mercado |\n| **Vuelo** | una ruta: cuánto cuesta volar hasta allí | el feed de tarifas de vuelo y las tarifas de vuelo real-time |\n\nLos cuatro viven en [Mi organización](https://dashboard.veetal.app/account/accommodations), cada uno en su pestaña, y los cuatro se pueden crear también desde el botón **+** de la cabecera. Si abres el asistente desde la página de una API, añade un paso final para meter la entidad nueva directamente en los schedules de esa API.\n\n## 1. Alojamiento — el hotel\n\nEn la pestaña **Accommodations**, **Add accommodations**. El asistente abre con tres caminos:\n\n![Los tres métodos de alta](/images-webp/recipes/register-your-entities/03-accommodation-methods.webp)\n\n**Search Booking accommodation** es el habitual. **I have accommodation Booking URL** sirve cuando la búsqueda es ambigua y ya tienes la ficha abierta. **Import accommodations from .csv/.xls file** es la vía masiva.\n\nBusca por nombre. Los resultados traen la foto y la ciudad del hotel, y los que ya tienes en la cuenta salen en gris y marcados **It's yours**, lo que te ahorra el duplicado:\n\n![Resultados de la búsqueda, con los que ya tienes marcados](/images-webp/recipes/register-your-entities/04-accommodation-search.webp)\n\nSi no aparece nada, usa menos palabras: la búsqueda casa contra Booking por aproximación, no por tu cadena exacta.\n\nElige uno y **Continue**. Veetal resuelve la ficha de verdad y te enseña lo que ha encontrado —estrellas, nota de los huéspedes, número de reseñas, dirección— más **Profiles Found**: en qué OTAs tiene ficha ese hotel realmente.\n\n![El hotel resuelto y los perfiles de OTA encontrados](/images-webp/recipes/register-your-entities/05-accommodation-confirm.webp)\n\nEn este ejemplo aparecieron Booking, Tripadvisor y Google; Expedia y Hotels.com no. Eso importa después: una OTA sin ficha no tiene nada que importar, y el feed de reputación solo devolverá las del tick verde. **Repeat search profiles** relanza la detección si crees que se ha dejado alguna, y **View Profile** abre la ficha con la que ha casado para que compruebes que es el hotel correcto.\n\n**Add accommodation** y la fila aparece en el listado. La columna **SETUP** es ese mismo mapa de perfiles, una insignia por OTA:\n\n![El listado, con la columna SETUP y las OTAs enlazadas](/images-webp/recipes/register-your-entities/06-accommodations-after.webp)\n\nUn detalle que conviene saber: el **slug** que asigna Veetal sale de la URL de Booking, no del nombre. \"Ohla Barcelona\" se quedó en `ohla`. El slug es lo que piden todos los endpoints, así que cópialo de la fila en vez de deducirlo.\n\n## 2. Location — el destino\n\nPestaña **Locations**, **Add locations**. El propio diálogo dice para qué es: *\"You will use them to search events in the destination\"*.\n\nBusca el destino y verás por qué existe este paso:\n\n![Cuatro Barcelonas en cuatro países](/images-webp/recipes/register-your-entities/07-location-finder.webp)\n\nCuatro Barcelonas —España, Venezuela, Colombia, Filipinas—, cada una con sus coordenadas y un **Show Map** para comprobarlo. Elige la que no es y todos los eventos que leas después serán de otra ciudad.\n\n⚠️ El **nombre tiene que ser el real del destino**. Rebautizarlo a tu gusto devuelve el error **`731`**: el par (id de destino, nombre) se valida contra Booking.\n\n**Add location** y la fila aparece con su tipo —aquí Tier 1— y sus coordenadas:\n\n![La location creada](/images-webp/recipes/register-your-entities/08-location-created.webp)\n\n## 3. Búsqueda de destino — el destino, filtrado\n\nPestaña **Location searches**, **Add location searches**. El buscador es más rico que el de location: además de la ciudad ofrece barrios, el aeropuerto, la provincia y recintos como la Fira, porque un \"mercado\" puede ser cualquiera de esas cosas.\n\nEl segundo paso es la razón de ser de esta entidad: los filtros.\n\n![Los parámetros de la búsqueda](/images-webp/recipes/register-your-entities/10-location-search-params.webp)\n\nPaís, moneda e idioma (cambian los precios que enseña Booking), régimen, estrellas, tipo de alojamiento y, más abajo, distancia al centro, puntuación mínima, cancelación gratuita, pet friendly, noches, adultos, niños, bebés y habitaciones.\n\n**Esos filtros son la entidad.** Definen qué hoteles entran en la búsqueda —tu universo competitivo— y por tanto cuánto cuesta cada ejecución del feed. El ejemplo de aquí son hoteles de 4 y 5 estrellas en Barcelona, una noche, dos adultos. **Add location search**, y la fila te devuelve los filtros como chips:\n\n![La búsqueda de destino creada con sus filtros](/images-webp/recipes/register-your-entities/12-location-search-created.webp)\n\n## 4. Vuelo — la ruta\n\nPestaña **Flights**, **Add flights**. Es la más autocontenida de las cuatro: los aeropuertos se resuelven en local, así que funciona incluso cuando las OTAs no.\n\nEscribe una ciudad y te salen sus aeropuertos con su código IATA — solo Londres ofrece siete:\n\n![El autocompletado de aeropuertos](/images-webp/recipes/register-your-entities/13-flight-airports.webp)\n\nDespués el tipo de viaje, las fechas, los pasajeros y dos campos obligatorios que es fácil pasar por alto: **LANGUAGE** y **COUNTRY**. Son el punto de venta —el mercado cuyos precios quieres—, no la ruta. Deja uno vacío y el campo se pone en rojo con *This field is required* y **Add flight** sigue deshabilitado.\n\n![El formulario de vuelo completo](/images-webp/recipes/register-your-entities/14-flight-form.webp)\n\nUn **Round trip** pide un rango de fechas; **One way** se conforma con una.\n\n## Lo mismo por API\n\nLos cuatro tienen su endpoint de account, así que puedes hacer todo esto desde código en cuanto conozcas la forma:\n\n`POST /v2/account/accommodation` · `POST /v2/account/location` · `POST /v2/account/location-search` · `POST /v2/account/flight`\n\nY un `GET` a esas mismas rutas lista lo que tienes, que es de donde salen los slugs y los ids que piden los endpoints de datos.\n\n## Qué pasa después\n\nLas entidades por sí solas no traen nada. A partir de aquí el camino se bifurca: un endpoint **Real Time** te responde sobre ellas al momento, petición a petición; un dataset **Feed** necesita que antes haya corrido un import, que se programa como schedule en la página de esa API. Cada fila tiene además activar, desactivar y borrar, y los checkboxes te dan esas tres acciones en masa — una entidad desactivada deja de importarse sin perder su histórico.","By the end you will have one of each of the four entity types on your account — an accommodation, a location, a location search and a flight — which is what every Feed and Real Time endpoint asks you to point at.\n\n**What you need:** an account with the Account API active. Nothing else.\n\n**What it costs:** nothing. Creating entities is free. Resolving them against Booking is free too — you only pay when you ask for data about them.\n\n## What an entity is, and why there are four\n\nAn entity is a thing you have told Veetal to watch. The endpoints don't take free text: they take *your* identifiers. Which type you need depends on the question:\n\n| Type | Answers | Used by |\n|---|---|---|\n| **Accommodation** | one hotel: its rates, availability, reputation, reviews, parity | most Real Time endpoints and the accommodation Feed datasets |\n| **Location** | a destination as a whole: what is happening there | the events and holidays feeds |\n| **Location search** | a destination filtered into a competitive set: who is on sale and at what price | the Booking location search feed and market demand |\n| **Flight** | a route: what it costs to fly in | the flight rates feed and real-time flight rates |\n\nAll four live under [My organization](https://dashboard.veetal.app/account/accommodations), each on its own tab, and all four can also be created from the **+** button in the header. If you open the wizard from an API page instead, it adds a final step to put the new entity straight onto that API's schedules.\n\n## 1. Accommodation — the hotel\n\nOn the **Accommodations** tab, **Add accommodations**. The wizard opens on three routes:\n\n![The three ways to add a hotel](/images-webp/recipes/register-your-entities/03-accommodation-methods.webp)\n\n**Search Booking accommodation** is the usual one. **I have accommodation Booking URL** is for when the search is ambiguous and you already have the listing open. **Import accommodations from .csv/.xls file** is the bulk route.\n\nSearch by name. The results carry the hotel's photo and city, and the ones already on your account are greyed out and marked **It's yours** — which saves you the duplicate:\n\n![Search results, with the ones you already have marked](/images-webp/recipes/register-your-entities/04-accommodation-search.webp)\n\nIf nothing matches, use fewer words: the search matches Booking approximately, not your exact string.\n\nPick one and **Continue**. Veetal now resolves the listing for real and shows you what it found — stars, guest score, review count, address — plus **Profiles Found**: which OTAs this hotel actually has a listing on.\n\n![The resolved hotel and the OTA profiles found](/images-webp/recipes/register-your-entities/05-accommodation-confirm.webp)\n\nIn this example Booking, Tripadvisor and Google were found; Expedia and Hotels.com were not. That matters later: an OTA with no profile has nothing to import, and the reputation feed will only return the ones with a green tick. **Repeat search profiles** runs the detection again if you think it missed one, and **View Profile** opens the listing it matched so you can check it is the right property.\n\n**Add accommodation**, and the row appears in the list. The **SETUP** column is that same profile map, one badge per OTA:\n\n![The list, with the SETUP column showing linked OTAs](/images-webp/recipes/register-your-entities/06-accommodations-after.webp)\n\nOne thing worth knowing: the **slug** Veetal assigns comes from the Booking URL, not from the display name. \"Ohla Barcelona\" became `ohla`. The slug is what every endpoint takes, so copy it from the row rather than guessing it.\n\n## 2. Location — the destination\n\nThe **Locations** tab, **Add locations**. The dialog says what it is for: *\"You will use them to search events in the destination\"*.\n\nSearch the destination and you get why this step exists at all:\n\n![Four Barcelonas in four countries](/images-webp/recipes/register-your-entities/07-location-finder.webp)\n\nFour Barcelonas — Spain, Venezuela, Colombia, the Philippines — each with its own coordinates and a **Show Map** to check. Pick the wrong one and every event you read afterwards is for the wrong city.\n\n⚠️ The **name has to be the real destination name**. Renaming it to something of your own returns error **`731`**: the pair (destination id, name) is validated against Booking.\n\n**Add location** and the row lands with its type — Tier 1 here — and its coordinates:\n\n![The created location](/images-webp/recipes/register-your-entities/08-location-created.webp)\n\n## 3. Location search — the destination, filtered\n\nThe **Location searches** tab, **Add location searches**. The finder is richer than the location one: as well as the city it offers districts, the airport, the province and landmarks like the Fira, because a \"market\" can be any of those.\n\nStep two is the point of this entity — the filters:\n\n![The search parameters](/images-webp/recipes/register-your-entities/10-location-search-params.webp)\n\nCountry, currency and language (they change the prices Booking shows), board, stars, property type, and further down distance from centre, minimum score, free cancellation, pet friendly, nights, adults, children, babies and rooms.\n\n**These filters are the entity.** They define which hotels the search covers — your competitive universe — and therefore how much every run of the feed costs. The example here is 4 and 5 star hotels in Barcelona, one night, two adults. **Add location search**, and the row shows the filters back as chips:\n\n![The created location search with its filters](/images-webp/recipes/register-your-entities/12-location-search-created.webp)\n\n## 4. Flight — the route\n\nThe **Flights** tab, **Add flights**. This is the most self-contained of the four: airports are resolved locally, so it works even when the OTAs don't.\n\nType a city and you get its airports with their IATA codes — London alone offers seven:\n\n![The airport autocomplete](/images-webp/recipes/register-your-entities/13-flight-airports.webp)\n\nThen trip type, dates, passengers, and two fields that are required and easy to miss: **LANGUAGE** and **COUNTRY**. They are the point of sale — the market whose prices you want — not the route. Leave one empty and the field turns red with *This field is required* and **Add flight** stays disabled.\n\n![The completed flight form](/images-webp/recipes/register-your-entities/14-flight-form.webp)\n\nA **Round trip** needs a date range; **One way** takes a single date.\n\n## The same thing over the API\n\nEvery one of the four has a matching account endpoint, so you can do all of this from code once you know the shape:\n\n`POST /v2/account/accommodation` · `POST /v2/account/location` · `POST /v2/account/location-search` · `POST /v2/account/flight`\n\nAnd `GET` on the same paths lists what you have, which is how you get the slugs and ids the data endpoints need.\n\n## What happens next\n\nEntities on their own don't fetch anything. From here the path forks: a **Real Time** endpoint will answer about them immediately, one request at a time; a **Feed** dataset needs an import to have run first, which you set up as a schedule on that API's page. Each row also has activate, deactivate and delete, and the checkboxes give you the same three in bulk — a deactivated entity stops being imported without losing its history.","Crea un alojamiento, una location, una búsqueda de destino y un vuelo desde el dashboard — las cuatro cosas que cualquier endpoint Feed o Real Time te pide para saber sobre qué trabajar, y para qué sirve cada una.","## ¿Dar de alta una entidad gasta créditos?\n\nNo. Crear, editar, activar y borrar entidades es gratis, y también lo es la resolución contra Booking que ocurre mientras las creas. Empiezas a pagar cuando pides datos: una petición real-time, o un import del feed corriendo sobre la entidad.\n\n## El hotel que quiero no sale en la búsqueda\n\nUsa menos palabras. La búsqueda casa contra Booking por aproximación, y los nombres oficiales largos (\"G.L Monumento\", \"by Meliá\") suelen romper la coincidencia. Si aun así no aparece, abre la ficha en Booking y usa el segundo camino, \"I have accommodation Booking URL\", que acepta la URL directamente.\n\n## Dos OTAs han salido como Profile Not Found. ¿Es un problema?\n\nSolo significa que el hotel no tiene ficha ahí, o que la coincidencia automática no ha tenido confianza suficiente. No se rompe nada: esas OTAs simplemente no tienen nada que importar, y los feeds de reputación y tarifas devolverán las que sí se encontraron. \"Repeat search profiles\" lo reintenta, y \"View Profile\" te deja comprobar que las encontradas son el hotel correcto.\n\n## ¿Qué diferencia hay entre una location y una búsqueda de destino?\n\nUna location es el destino entero y alimenta los datasets de eventos y festivos. Una búsqueda de destino es el destino más unos filtros —estrellas, tipo de alojamiento, régimen, ocupación— y alimenta los datasets de tarifas y de mercado. Si tu pregunta es \"qué está pasando en esta ciudad\", es una location. Si es \"quién está a la venta aquí y a qué precio\", es una búsqueda de destino.\n\n## ¿Por qué mi vuelo me pide idioma y país?\n\nPorque una tarifa no es un número único: depende de dónde se venda. Idioma y país son el punto de venta y cambian los precios que recibes. Son obligatorios justo por eso, y hablan del mercado en el que vendes, no de la ruta.\n\n## ¿Puedo crear todo esto por API en vez de a mano?\n\nSí. Los cuatro tipos tienen POST, PUT, DELETE y GET bajo /v2/account. El dashboard es más rápido para los primeros y para todo aquello en lo que quieras ver qué ha resuelto Booking antes de confirmar; la API es lo que quieres para el alta masiva y para mantener tus entidades sincronizadas con tu propio sistema.","Da de alta hoteles, destinos y rutas en Veetal — Veetal","Un alojamiento con sus perfiles de OTA resueltos, una location, una búsqueda de destino con los filtros que definen tu conjunto competitivo y una ruta de vuelo — más los endpoints de account que hacen lo mismo desde código.","register-your-entities","## Does creating an entity cost credits?\n\nNo. Creating, editing, activating and deleting entities are all free, and so is the resolution against Booking that happens while you create them. You start paying when you ask for data: a real-time request, or a feed import running over the entity.\n\n## The hotel I want doesn't come up in the search\n\nUse fewer words. The search matches Booking approximately, and long official names (\"G.L Monumento\", \"by Meliá\") tend to break the match. If it still won't come up, open the listing on Booking and use the second route, \"I have accommodation Booking URL\", which takes the URL directly.\n\n## Two OTAs came back as Profile Not Found. Is that a problem?\n\nIt only means the hotel has no listing there, or that the automatic match wasn't confident enough. Nothing breaks: those OTAs simply have nothing to import, and the reputation and rate feeds will return the ones that were found. Use \"Repeat search profiles\" to try again, and \"View Profile\" to check that the ones it did find are the right property.\n\n## What is the difference between a location and a location search?\n\nA location is a destination as a whole and feeds the events and holidays datasets. A location search is a destination plus filters — stars, property type, board, occupancy — and feeds the rate and market datasets. If your question is \"what is happening in this city\", it's a location. If it's \"who is on sale here and at what price\", it's a location search.\n\n## Why does my flight ask for a language and a country?\n\nBecause a fare isn't a single number: it depends on where it is being sold. Language and country are the point of sale, and they change the prices you get back. They are required for exactly that reason, and they are about the market you sell in, not about the route.\n\n## Can I create all of this over the API instead?\n\nYes. Every type has POST, PUT, DELETE and GET under /v2/account. The dashboard is faster for the first few and for anything where you want to see what Booking resolved before committing; the API is what you want for bulk and for keeping your entities in sync with your own system.","dar-de-alta-tus-entidades","The endpoints don't take free text: they take your identifiers. Before you can ask Veetal anything you have to tell it what to watch — a hotel, a destination, a filtered market, a route. Four wizards, one of each, and the traps each one hides.","## Add the hotel\n\nOn the Accommodations tab, Add accommodations. Search Booking by name, pick the listing, and check what Veetal resolved: stars, score, address, and which OTAs the hotel actually has a profile on. The slug it assigns comes from the Booking URL, not the name.\n\n## Add the destination\n\nOn Locations, search the destination and read the results carefully — there are four Barcelonas in four countries. The name has to be the real destination name, and locations are what the events and holidays feeds work on.\n\n## Add the filtered market\n\nOn Location searches, pick the destination and then set the filters: stars, property type, board, occupancy, currency, language. Those filters are the entity — they define which hotels the search covers and what each run costs.\n\n## Add the route\n\nOn Flights, type a city to get its airports with their IATA codes, pick trip type and dates, and fill in language and country. Those two are required: they are the point of sale, the market whose fares you want.\n\n## Do it from code\n\nEvery type has POST, PUT, DELETE and GET under /v2/account. Use GET to pull the slugs and ids that the Feed and Real Time endpoints need.","curl -X POST \"https://api.veetal.app/v2/account/accommodation\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"booking_url\": \"https://www.booking.com/hotel/es/YOUR_HOTEL.html\" }'\n\n# y para leer los slugs y los ids que piden los endpoints de datos:\ncurl \"https://api.veetal.app/v2/account/accommodation\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Da de alta los cuatro tipos de entidad de tu cuenta","Los endpoints no aceptan texto libre: aceptan tus identificadores. Antes de poder preguntarle nada a Veetal tienes que decirle qué vigilar — un hotel, un destino, un mercado filtrado, una ruta. Cuatro asistentes, uno de cada, y las trampas que esconde cada uno.","The same alta, from code. The account endpoints mirror the four wizards; swap accommodation for location, location-search or flight and the shape is the same.","El mismo alta, desde código. Los endpoints de account son el espejo de los cuatro asistentes; cambia accommodation por location, location-search o flight y la forma es la misma.",{"id":202,"fields":1470},{"Prompt":1471,"Minutes":1076,"Title_en":1472,"Datasets":1473,"Published":802,"Build_en":1474,"Seo_description_en":1475,"Endpoint":1476,"Summary_en":1477,"Seo_title_en":1478,"Seo_description_es":1479,"Steps_es":1480,"Order":1076,"Requires":1481,"Summary_es":1482,"Faqs_es":1483,"Seo_title_es":1484,"Build_es":1485,"Date":1155,"Slug_en":1486,"Icon":1251,"Faqs_en":1487,"Slug_es":1488,"Intro_en":1489,"Steps_en":1490,"Curl":1491,"Layer":34,"Title_es":1492,"Intro_es":1493,"Kind":1103,"Call_text_en":1494,"Call_text_es":1495},"Using my Veetal Connect data, scope Porto as a destination I do not operate in yet.\n\nI run four-star city hotels and I am deciding whether to look for a building there.\n\nPull live availability and pricing for three dates that are not all the same kind of\nday — a midweek night in low season, a weekend in high season, and a date during a\nmajor local event if you can find one.\n\nFor each date tell me:\n- how much supply is listed, split by accommodation type and by star category\n- the price bands: median and the 25th/75th percentiles per category, not just an average\n- how review scores distribute, and whether the expensive properties are also the\n  best-reviewed or whether there is a gap someone could walk into\n- the five properties anchoring the top of the market, with what they charge and score\n\nThen, in plain prose: where is the gap, what would a new four-star need to charge to be\ncredible, and what does this data NOT tell me that I should find out before committing\ncapital. Be concrete and tell me your uncertainty — I would rather hear \"the sample is\nthin for five-star\" than a confident number you cannot support.","Scope a new market before you commit to it",[96],"A written market briefing for any destination: how much supply there is and of what kind, where the price bands sit by star category, how the scores distribute, which properties anchor the top of the market and which are undercutting it — plus the questions the data raises that you should answer before investing.","Size up any destination with one prompt: live supply, price bands by star category, review distribution and who anchors the market — through the Veetal MCP.","GET /v2/real-time/location-search/{id}","Ask your assistant to size up a city you do not operate in yet — supply, price bands, review scores, who is winning — and get the answer as a briefing, not a spreadsheet.","Hotel Market Research API — Scope Any City with AI — Veetal","Dimensiona cualquier destino con un prompt: oferta en vivo, bandas de precio por categoría, distribución de notas y quién marca el techo — con el MCP de Veetal.","## Conecta el MCP\n\nUna línea de configuración en Claude o Cursor y tu asistente ya llega a tu cuenta de Veetal. La página de configuración lo explica.\n\n## Pregunta con tus palabras\n\nSin nombres de endpoint ni parámetros. Describe el mercado y la decisión que estás sopesando; el asistente elige las llamadas.\n\n## Discútele la respuesta\n\nEl valor está en la segunda pregunta. Pídele que separe hoteles de apartamentos, que rehaga las bandas quitando los extremos, que te diga qué NO puede saber con estos datos.",[1244],"Pídele a tu asistente que dimensione una ciudad en la que aún no operas — oferta, bandas de precio, notas, quién gana — y recibe la respuesta como un informe, no como una hoja de cálculo.","## ¿Esto gasta créditos?\n\nLas búsquedas en vivo sí — van a la OTA en el momento en que preguntas. Dimensionar una ciudad son unas pocas llamadas; pídele al asistente que te diga lo que va a gastar si andas justo de saldo.\n\n## ¿De cuándo es el dato?\n\nSe trae cuando preguntas. Ese es el sentido de la familia Real Time: ni import que programar, ni esperar a la ejecución de mañana.\n\n## ¿Puede comparar dos ciudades?\n\nSí, y ahí es donde se gana el sueldo — la misma pregunta hecha a tres destinos candidatos, respondida con la misma forma, es un documento de decisión.\n\n## ¿En qué se va a equivocar?\n\nVe lo que la OTA lista para las fechas que le digas. Un martes de temporada baja no es el mercado; pídele varias fechas antes de concluir nada sobre el nivel de precios de un destino.","API de investigación de mercado hotelero — Analiza cualquier ciudad con IA — Veetal","Un informe escrito de cualquier destino: cuánta oferta hay y de qué tipo, dónde están las bandas de precio por categoría, cómo se reparten las notas, qué propiedades marcan el techo del mercado y cuáles están tirando los precios — más las preguntas que el dato deja abiertas y que conviene responder antes de invertir.","market-research-prompt","## Does this cost credits?\n\nLive searches do — they go out to the OTA at the moment you ask. A single city scope is a handful of calls; ask the assistant to tell you what it is about to spend if you are working on a tight balance.\n\n## How current is the data?\n\nIt is fetched when you ask. That is the point of the Real Time family: no import to schedule, no waiting for tomorrow's run.\n\n## Can it compare two cities?\n\nYes, and that is where it earns its keep — the same question asked of three candidate destinations, answered in the same shape, is a decision document.\n\n## What will it get wrong?\n\nIt sees what the OTA lists for the dates you name. A shoulder-season Tuesday is not the market; ask for several dates before you conclude anything about a destination's price level.","investigacion-mercado-prompt","Market research is the work that never gets done, because it costs a week of somebody senior and by the time it lands the market has moved. With the Veetal MCP connected, the same question takes one prompt: your assistant pulls live supply and pricing for any destination and writes up what it means.","## Connect the MCP\n\nOne line of configuration in Claude or Cursor and your assistant can reach your Veetal account. The setup page walks it through.\n\n## Ask in your own words\n\nNo endpoint names, no parameters. Describe the market and the decision you are weighing; the assistant picks the calls.\n\n## Push back on the answer\n\nThe value is in the second question. Ask it to separate hotels from apartments, to redo the bands excluding the outliers, to tell you what it cannot know from this data.","curl \"https://api.veetal.app/v2/real-time/location-search/YOUR_LOCATION_SEARCH_ID?target_date=2026-10-15\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Radiografía un mercado nuevo antes de entrar","La investigación de mercado es el trabajo que nunca se hace, porque cuesta una semana de alguien senior y para cuando llega el mercado ya se ha movido. Con el MCP de Veetal conectado, la misma pregunta cabe en un prompt: tu asistente trae oferta y precios en vivo de cualquier destino y te explica qué significan.","Under the hood the assistant runs live location searches. This is the same call, by hand, if you would rather see it than ask for it.","Por debajo, el asistente lanza búsquedas de ubicación en vivo. Esta es la misma llamada a mano, por si prefieres verla a pedirla.",{"id":535,"fields":1497},{"Prompt":1498,"Minutes":1076,"Title_en":1499,"Datasets":1500,"Published":802,"Build_en":1501,"Needs_import":802,"Seo_description_en":1502,"Endpoint":1503,"Summary_en":1504,"Seo_title_en":1505,"Seo_description_es":1506,"Steps_es":1507,"Order":1508,"Requires":1509,"Summary_es":1510,"Faqs_es":1511,"Import_service":1512,"Seo_title_es":1513,"Build_es":1514,"Date":1093,"Slug_en":1515,"Icon":1190,"Faqs_en":1516,"Slug_es":1517,"Import_entity":33,"Intro_en":1518,"Steps_en":1519,"Curl":1520,"Layer":10,"Title_es":1521,"Intro_es":1522,"Kind":1103,"Call_text_en":1523,"Call_text_es":1524},"Use my Veetal Connect data to build a rate parity monitor for my hotel,\ncovering next month.\n\nI want to see where my rate is being undercut: for every night, how my price\ncompares across the channels and against the hotels I compete with. Work out\nwhat data you need and fetch it.\n\nBuild it as a single self-contained HTML page, plain HTML and CSS:\n\n- A night-by-night list, worst parity first, so the problems are at the top.\n- For each night: my rate, the best competing rate, the gap in money and in\n  percent, and a clear flag when I am undercut.\n- A summary at the top: how many nights are out of parity, and the worst one.\n- Let me switch between desktop and mobile rates if the data has both.\n- Never invent a rate — leave the night out when there is no data for it.\n\nClean, scannable, works in light and dark.","Rate Parity Monitor",[119],"A parity dashboard: a night-by-night list with the parity score, the best rate found per competitor, and the gaps highlighted so a leak is obvious without reading numbers one by one.","Monitor hotel rate parity across OTAs with one Veetal Connect API call: parity score and best rate per competitor for any date range.","GET /v2/feed/accommodation/{slug}/parity","Spot where your rate breaks parity across OTAs versus your direct price.","Rate Parity Monitor — Hotel Rate Parity API — Veetal Connect API","Controla la paridad de tarifas entre OTAs con una llamada a Veetal Connect API: parity score y mejor tarifa por competidor para cualquier rango de fechas.","## Consigue tu API key\n\nCrea tu cuenta y copia tu key. Empiezas gratis con 100 créditos.\n\n## Elige tu hotel\n\nLista los alojamientos de tu cuenta y copia el slug del hotel que quieras vigilar.\n\n## Lee la ventana de paridad\n\nIndica un rango de fechas y el feed devuelve el parity score y la mejor tarifa por competidor para cada noche.",3,[33,452,1088],"Detecta dónde tu tarifa rompe la paridad entre OTAs frente a tu precio directo.","## ¿Qué es el parity score?\n\nUn número que resume cómo queda tu tarifa frente a las encontradas para esa misma noche en el compset, para poder ordenar las noches por gravedad en vez de revisar precio a precio.\n\n## ¿Cubre las tarifas de móvil?\n\nEl endpoint acepta un parámetro device, así que puedes leer escritorio o móvil. Los descuentos solo-móvil son una fuente habitual de fugas silenciosas de paridad.\n\n## ¿Cómo de fresco es el dato?\n\nEs la capa Feed pre-procesada, refrescada según la programación de tu cuenta. Para el precio de este instante existe el endpoint de paridad en tiempo real.\n\n## ¿Qué rango de fechas pido?\n\nPor defecto es hoy. Pasa from_date y to_date para cubrir tu ventana de reserva — un mes por delante es lo habitual para detectar fugas antes de que te cuesten reservas.","feed-accommodation-rates","Monitor de paridad de tarifas — API de rate parity hotelero — Veetal Connect API","Un panel de paridad: la lista noche a noche con el parity score, la mejor tarifa encontrada por competidor y las diferencias destacadas para que una fuga salte a la vista sin leer número por número.","rate-parity-monitor","## What is a parity score?\n\nA single number summarising how your rate compares with the rates found for the same night across the set, so you can sort nights by severity instead of eyeballing every price.\n\n## Does it cover mobile rates?\n\nThe endpoint takes a device parameter, so you can read desktop or mobile. Mobile-only discounts are a common source of silent parity leaks.\n\n## How fresh is the data?\n\nIt is the pre-processed Feed layer, refreshed on your account schedule. For a price at this exact second, use the real-time parity endpoint instead.\n\n## What date range should I ask for?\n\nIt defaults to today. Pass from_date and to_date to cover a booking window — a month ahead is a common choice for spotting leaks before they cost you bookings.","monitor-paridad-tarifas","Parity leaks quietly and costs you the direct booking. This recipe reads the parity comparison for your hotel against its comp set for a date range, so you can see the nights and channels where your rate is undercut.","## Get your API key\n\nCreate your account and copy your key. Start free with 100 API credits.\n\n## Pick your hotel\n\nList the accommodations on your account and copy the slug of the hotel you want to monitor.\n\n## Read the parity window\n\nAsk for a date range and the feed returns the parity score and the best rate per competitor for each night.","curl \"https://api.veetal.app/v2/feed/accommodation/YOUR_HOTEL_SLUG/parity?from_date=2026-09-01&to_date=2026-09-30&adults=2\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Monitor de paridad de tarifas","La paridad se rompe en silencio y te cuesta la reserva directa. Esta receta lee la comparativa de paridad de tu hotel frente a su compset en un rango de fechas, para ver las noches y los canales donde te están bajando el precio.","One request returns the parity score and the best competing rate for every night in the range. Swap in your hotel slug and your key.","Una petición devuelve el parity score y la mejor tarifa competidora de cada noche del rango. Pon el slug de tu hotel y tu key.",{"id":350,"fields":1526},{"Prompt":1527,"Minutes":1150,"Title_en":1528,"Datasets":1529,"Published":802,"Build_en":1530,"Seo_description_en":1531,"Endpoint":1532,"Summary_en":1533,"Seo_title_en":1534,"Seo_description_es":1535,"Steps_es":1536,"Order":1150,"Requires":1537,"Summary_es":1538,"Faqs_es":1539,"Seo_title_es":1540,"Build_es":1541,"Date":1155,"Slug_en":1542,"Icon":1251,"Faqs_en":1543,"Slug_es":1544,"Intro_en":1545,"Steps_en":1546,"Curl":1547,"Layer":34,"Title_es":1548,"Intro_es":1549,"Kind":1103,"Call_text_en":1550,"Call_text_es":1551},"Using my Veetal Connect data, help me decide whether to move my price for this\ncoming Saturday.\n\nWork in two passes so we do not burn credits unnecessarily:\n\n1. First read what is already stored — my scheduled extraction of my rates and my comp\n   set's. Tell me what it says and how old it is.\n2. Then, only for Saturday and only for the competitors where the stored picture is\n   close or stale, make live calls for current rate and availability.\n\nTell me before the second pass how many live calls you intend to make.\n\nThen answer: has anything moved since the extraction, has anyone closed out, and does\nthat justify a change tonight? Give me the number I should move to, or tell me to leave\nit alone. If the live data contradicts the stored data, say which you trust and why.","Feed live rates into your pricing engine",[95],"The inputs your pricing engine is missing: live competitor rates and availability for the dates you are pricing right now, with a clear read on what changed since your last scheduled extraction and whether it warrants a move.","Feed live competitor rates and availability into your pricing engine and react the day demand shifts, not the morning after the extraction.","GET /v2/real-time/accommodation/{slug}/availability","Live rates and availability, on demand, so your pricing reacts on the day demand shifts instead of the morning after the extraction.","Dynamic Pricing Data API — Live Hotel Rates & Availability — Veetal","Alimenta tu motor de precios con tarifas y disponibilidad en vivo de la competencia y reacciona el día que se mueve la demanda, no al día siguiente.","## Sepas lo que cuesta antes de meter un bucle\n\nLas llamadas Real Time se facturan por petición y tardan segundos, no milisegundos. Un bucle de sesenta fechas por ocho competidores son cuatrocientas ochenta llamadas — decide el presupuesto antes de escribir el código.\n\n## El feed para la base, el tiempo real para la diferencia\n\nLee tu extracción programada para tener la forma del mercado, y gasta llamadas en vivo solo en las fechas donde la decisión está reñida de verdad. Ese es el patrón que mantiene la factura cuerda.\n\n## Métesela al motor, no la saques a un panel\n\nLa salida va a tu motor de precios, no a un panel que refresca una persona. Lo que alguien tiene que mirar cada hora no se mira.",[33,452],"Tarifas y disponibilidad en vivo, bajo demanda, para que tu precio reaccione el día que se mueve la demanda y no la mañana siguiente a la extracción.","## ¿Por qué no llamar en tiempo real para todo?\n\nCoste y latencia. Una llamada en vivo va a la OTA y la espera; sesenta fechas son un minuto de espera y una factura real. El feed existe para que gastes llamadas en vivo solo donde cambian una decisión.\n\n## ¿Cómo de fresco es el \"tiempo real\"?\n\nSe trae cuando lo pides, con una caché corta que puedes saltarte. Es tan actual como la propia OTA.\n\n## ¿Me da disponibilidad o solo precio?\n\nLas dos, y la disponibilidad es la mitad infravalorada. Un competidor sin tarifa para una fecha normalmente ha cerrado ventas, y eso mueve tu precio más que cualquier número que publicara.\n\n## ¿Y si la llamada expira?\n\nTrátalo como ausencia de dato, no como demanda cero, y tira de la última extracción guardada. Un motor de precios que lee un timeout como mercado vacío hará una tontería.","API de datos para precio dinámico — Tarifas y disponibilidad en vivo — Veetal","Las entradas que le faltan a tu motor de precios: tarifas y disponibilidad de la competencia en vivo para las fechas que estás fijando ahora mismo, con una lectura clara de qué ha cambiado desde tu última extracción programada y si justifica moverse.","dynamic-pricing-inputs","## Why not just call real time for everything?\n\nCost and latency. A live call goes to the OTA and waits for it; sixty dates is a minute of waiting and a real bill. The feed exists so you only spend live calls where they change a decision.\n\n## How fresh is \"real time\"?\n\nIt is fetched when you ask, subject to a short cache you can bypass. That is as current as the OTA itself.\n\n## Does it give me availability or just price?\n\nBoth, and availability is the underrated half. A competitor with no rate for a date has usually closed out, which moves your pricing more than any number they published.\n\n## What if the call times out?\n\nTreat it as no data rather than as zero demand, and fall back on the last stored extraction. A pricing engine that reads a timeout as an empty market will do something stupid.","entradas-precio-dinamico","Scheduled imports are the right tool for trends and the wrong one for reactions. When a competitor closes out for a Saturday at four in the afternoon, a nightly feed tells you tomorrow. The Real Time family exists for the decisions that cannot wait for tomorrow.","## Know what it costs before you loop\n\nReal Time calls are billed per request and take seconds, not milliseconds. A loop over sixty dates and eight competitors is four hundred and eighty calls — decide the budget before you write the code.\n\n## Use the feed for the baseline, real time for the delta\n\nRead your scheduled extraction for the shape of the market, then spend live calls only on the dates where the decision is actually close. That is the pattern that keeps the bill sane.\n\n## Feed it in, do not read it out\n\nThe output belongs in your pricing engine, not on a dashboard a human refreshes. Anything a person has to look at every hour will not be looked at.","curl \"https://api.veetal.app/v2/real-time/accommodation/YOUR_SLUG/availability/2026-10-10/2026-10-12/2\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Alimenta tu motor de precios con tarifas en vivo","Los imports programados son la herramienta correcta para las tendencias y la equivocada para las reacciones. Cuando un competidor cierra ventas de un sábado a las cuatro de la tarde, un feed nocturno te lo cuenta mañana. La familia Real Time existe para las decisiones que no pueden esperar a mañana.","A live availability check for one accommodation and one date range. Seconds, not milliseconds — and billed per call.","Una consulta de disponibilidad en vivo para un alojamiento y un rango de fechas. Segundos, no milisegundos — y facturada por llamada.",{"id":284,"fields":1553},{"Prompt":1554,"Minutes":1150,"Title_en":1555,"Datasets":1556,"Published":802,"Build_en":1557,"Needs_import":802,"Seo_description_en":1558,"Repo_url":1269,"Endpoint":1302,"Summary_en":1559,"Seo_title_en":1560,"Seo_description_es":1561,"Steps_es":1562,"Order":1563,"Repo_folder":1564,"Requires":1565,"Summary_es":1566,"Faqs_es":1567,"Import_service":1313,"Seo_title_es":1568,"Build_es":1569,"Date":1155,"Slug_en":1570,"Icon":1190,"Faqs_en":1571,"Slug_es":1572,"Dashboard_url":1319,"Import_entity":33,"Intro_en":1573,"Stack":1321,"Steps_en":1574,"Run_command":1575,"Curl":1224,"Layer":10,"Title_es":1576,"Intro_es":1577,"Kind":1167,"Call_text_en":1578,"Call_text_es":1579},"Using my Veetal Connect data, give me this week's portfolio exception report.\n\nList every accommodation on my account first, and tell me which ones have current data\nand which do not — a property whose import failed must appear as missing, never as\nhealthy.\n\nFor the ones with data, for the next 30 days:\n- average published rate and how it compares to that property's own recent band\n- parity: where the price differs across channels for the same room and date\n- reputation: current score and whether it moved\n- position against its comp set where one is configured\n\nThen, and this is the part I actually want: name only the properties that are outside\ntheir normal range, and for each say what is off and what you would check first. If\neverything is within band, tell me that in one line — I would rather read \"nothing to\nsee\" than twelve rows of green.\n\nKeep every number in EUR and say what rate you converted at.","One feed, one schema, every property",[113],"A portfolio view: every property on one line with its rate position, parity health, reputation and movement since the last run, sorted so the property that needs attention today is at the top.","Track ADR, ranking, parity and rating across every property and every channel through one API with one schema — and surface only the exceptions.","ADR, ranking, parity and rating for every hotel in the portfolio, on the same scale, so the outlier is obvious without opening twelve dashboards.","Hotel Portfolio Performance API — ADR, Rank, Parity, Rating — Veetal","Sigue ADR, posición, paridad y nota de cada propiedad y cada canal con una sola API y un solo esquema — y saca solo las excepciones.","## Mete todas las propiedades en la cuenta\n\nEl valor solo aparece con la cartera completa. Una vista a la que le faltan tres hoteles es una vista en la que nadie confía, y un hotel importado distinto del resto rompe la comparación en silencio.\n\n## Importa lo mismo en todas partes\n\nMismas OTAs, misma periodicidad, misma ocupación. La comparabilidad es una decisión de configuración, no de análisis.\n\n## Pregunta por las excepciones, no por la lista\n\nDoce filas en verde no son información. Pregunta qué propiedades se salen de su banda habitual y por qué.",14,"portfolio-monitor",[33,452,1088],"ADR, posición, paridad y nota de cada hotel de la cartera, en la misma escala, para que el que se sale cante sin abrir doce paneles.","## ¿El ADR de aquí es el mismo que el de mi PMS?\n\nNo, y no lo presentes como si lo fuera. Este es el precio publicado en las OTAs; tu PMS sabe lo que se vendió de verdad, incluido el directo y el negociado. Responden a preguntas distintas, y la diferencia entre ambos es informativa por sí sola.\n\n## ¿Y si las propiedades están en monedas distintas?\n\nPide una sola moneda y que se indique la conversión. Una tabla de cartera que mezcla euros y libras ha provocado más malas decisiones que ningún dataset ausente.\n\n## ¿Cuántas propiedades aguanta?\n\nLa API sirve tantas como importes. El límite es la atención: pasadas unas veinte filas, pide excepciones en vez de la tabla entera.\n\n## ¿Puede sacar el informe del lunes?\n\nEs su uso natural. Programa el mismo prompt cada semana y que nombre solo lo que ha cambiado — un informe que repite los números de la semana pasada deja de leerse a la cuarta.","API de rendimiento de cartera hotelera — ADR, posición, paridad y nota — Veetal","Una vista de cartera: cada propiedad en una línea con su posición de tarifa, su salud de paridad, su reputación y su movimiento desde la última ejecución, ordenada para que la propiedad que necesita atención hoy salga arriba.","portfolio-performance-monitoring","## Is ADR here the same as my PMS's ADR?\n\nNo, and do not present it as if it were. This is the rate published on the OTAs; your PMS knows what was actually sold, including direct and negotiated business. They answer different questions and the gap between them is itself informative.\n\n## What if properties are in different currencies?\n\nAsk for one currency and for the conversion to be stated. A portfolio table mixing euros and pounds has caused more bad decisions than any missing dataset.\n\n## How many properties can it handle?\n\nThe API will serve as many as you import. The limit is attention: past about twenty rows, ask for exceptions rather than the full table.\n\n## Can it produce the Monday report?\n\nThat is the natural use. Schedule the same prompt weekly and have it name only what changed — a report that repeats last week's numbers stops being read by week four.","monitorizacion-cartera-hoteles","A chain with twelve hotels has twelve extranets, each with its own definition of everything. The reason nobody compares properties is not indifference — it is that the numbers are not comparable. One API, one schema, the same hotel everywhere is the whole point.","## Get every property into the account\n\nThe value only appears when the portfolio is complete. A view missing three hotels is a view nobody trusts, and one hotel imported differently from the rest breaks the comparison quietly.\n\n## Import the same things everywhere\n\nSame OTAs, same schedule, same occupancy. Comparability is a configuration decision, not an analysis one.\n\n## Ask for the exceptions, not the list\n\nTwelve rows of green is not information. Ask which properties are outside their usual band and why.","git clone https://github.com/Veetal-Connect/recipes.git\ncd recipes/portfolio-monitor\ncp .env.example .env          # your VEETAL_API_KEY\nnode --env-file=.env index.mjs YYYY-MM-DD YYYY-MM-DD   # put the window: first night, last night","Un feed, un esquema, todos tus hoteles","Una cadena con doce hoteles tiene doce extranets, cada una con su propia definición de todo. Que nadie compare propiedades no es dejadez — es que los números no son comparables. Una API, un esquema y el mismo hotel en todas partes: de eso va esto.","One call per property, same shape every time. That sameness is the feature: the parsing you write once works for the whole portfolio.","Una llamada por propiedad, con la misma forma siempre. Esa igualdad es la gracia: el parseo que escribes una vez sirve para toda la cartera.",{"id":370,"fields":1581},{"Prompt":1582,"Minutes":1076,"Title_en":1583,"Datasets":1584,"Published":802,"Build_en":1585,"Needs_import":802,"Seo_description_en":1586,"Endpoint":1587,"Summary_en":1588,"Seo_title_en":1589,"Seo_description_es":1590,"Steps_es":1591,"Order":1443,"Requires":1592,"Summary_es":1593,"Faqs_es":1594,"Seo_title_es":1595,"Build_es":1596,"Date":1155,"Slug_en":1597,"Icon":1095,"Faqs_en":1598,"Slug_es":1599,"Import_entity":33,"Intro_en":1600,"Steps_en":1601,"Curl":1602,"Layer":10,"Title_es":1603,"Intro_es":1604,"Kind":1103,"Call_text_en":1605,"Call_text_es":1606},"Using my Veetal Connect data, read my hotel's reviews across every OTA and tell me\nwhat guests actually say.\n\nTake the last 200 reviews. Ignore the score for a moment and work from the text.\n\n1. What themes recur? Rank them by how often they appear and how strongly they are\n   worded. For each one, quote two real reviews — if you cannot quote it, do not list it.\n2. Which themes appear more now than in the equivalent window a year ago, and which\n   have faded? That trend matters more than the absolute count.\n3. Where do the OTAs disagree about me? A complaint that only shows up on one platform\n   usually means a different guest profile, not a different hotel.\n4. What do the best reviews praise that my marketing does not mention?\n5. Of everything above, what would be cheap to fix and what would need capital?\n\nTell me explicitly what you could not determine — how many reviews had no text, how\nmany you could not date, whether the sample is thin for any period.","Find out what guests actually complain about",[156],"A written read of your reviews: the themes that keep coming up, ranked by how often and how angrily; which have got worse since last quarter; where the OTAs disagree about you; and the handful of specific, cheap fixes the text points at.","Read every hotel review across Booking, Google and Tripadvisor and surface the recurring themes, what is getting worse and what your score is hiding.","GET /v2/feed/accommodation/{slug}/reviews","Read every review across every OTA at once and ask what the recurring themes are, which are getting worse, and which of them your score is hiding.","Hotel Review Sentiment Analysis API — Every OTA at Once — Veetal","Lee todas las reseñas del hotel en Booking, Google y Tripadvisor y saca los temas recurrentes, qué está empeorando y qué te oculta la nota media.","## Importa las reseñas\n\nLa reputación es un dataset Feed: las reseñas hay que recogerlas antes de poder leerlas. Da de alta el alojamiento y lanza un import — la receta de reputación lo explica paso a paso.\n\n## Pregunta qué dice el texto\n\nNo \"cuál es mi nota\", eso ya lo sabes. Pregunta qué tienen en común las quejas, y qué elogian las de cinco estrellas que tú no estás poniendo en tu marketing.\n\n## Pregunta qué ha cambiado\n\nLa pregunta más útil es comparativa: qué tema aparece más ahora que hace seis meses. Ahí es donde se está formando un problema.",[33,1088],"Lee todas las reseñas de todas las OTAs a la vez y pregunta cuáles son los temas recurrentes, cuáles empeoran, y cuáles te está tapando la nota media.","## ¿No es lo mismo que las notas por categoría que ya me dan las OTAs?\n\nNo. Esas son casillas fijas —limpieza, personal, ubicación— puntuadas en una escala. El texto dice cosas que ninguna casilla recoge: que el ascensor va lento a la hora del desayuno, que los colchones nuevos acabaron con las quejas de descanso, que los huéspedes esperan un bar que no tienes.\n\n## ¿Cuántas reseñas puede leer?\n\nEl feed devuelve hasta 200 por petición y pagina a partir de ahí. Para un hotel con tráfico, pide una ventana —el último trimestre— en vez de todo de golpe; las recientes son sobre las que puedes actuar.\n\n## ¿Se va a inventar temas?\n\nPuede, y ese es el riesgo. Pídele que cite dos o tres reseñas reales por cada tema que nombre. Un tema que no se puede citar no estaba ahí.\n\n## ¿Puede separar por idioma?\n\nBooking informa del idioma de la reseña; Google no. Pide el desglose y espera que sea parcial — y que te diga cuáles no ha podido clasificar.","API de análisis de sentimiento de reseñas — Todas las OTAs a la vez — Veetal","Una lectura escrita de tus reseñas: los temas que se repiten, ordenados por frecuencia y por enfado; cuáles han empeorado desde el trimestre pasado; en qué te contradicen unas OTAs y otras; y el puñado de arreglos concretos y baratos que el texto señala.","review-sentiment-analysis","## Is this the same as the category scores the OTAs already give me?\n\nNo. Those are fixed buckets — cleanliness, staff, location — scored on a scale. The text says things no bucket has: that the lift is slow at breakfast time, that the new mattresses fixed the sleep complaints, that guests keep expecting a bar you do not have.\n\n## How many reviews can it read?\n\nThe feed returns up to 200 per request and pages beyond that. For a busy hotel, ask for a window — the last quarter — rather than everything at once; the recent ones are the ones you can act on.\n\n## Will it invent themes?\n\nIt can, and that is the risk. Ask it to quote two or three actual reviews for every theme it names. A theme that cannot be quoted was not there.\n\n## Can it separate languages?\n\nBooking reports the review language; Google does not. Ask for the split and expect it to be partial — and to be told which reviews it could not classify.","analisis-sentimiento-resenas","A score of 8.7 tells you nothing you can act on. The reviews underneath it do, but nobody reads four hundred of them across five OTAs — so hotels end up managing the number instead of the thing the number measures. With the MCP connected, the assistant reads all of them and tells you what they say.","## Import the reviews\n\nReputation is a Feed dataset: the reviews have to be collected before they can be read. Set the accommodation up and run an import — the reputation recipe walks through it.\n\n## Ask what the text says\n\nNot \"what is my score\" — that you already know. Ask what the complaints have in common, and what the five-star reviews praise that you are not putting in your marketing.\n\n## Ask what changed\n\nThe single most useful question is comparative: which theme is more frequent now than it was six months ago. That is where a problem is forming.","curl \"https://api.veetal.app/v2/feed/accommodation/YOUR_SLUG/reviews?include_competitors=false&limit=200\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Descubre de qué se quejan de verdad tus huéspedes","Un 8,7 no te dice nada que puedas accionar. Las reseñas que hay debajo sí, pero nadie se lee cuatrocientas repartidas en cinco OTAs — así que los hoteles acaban gestionando el número en vez de lo que el número mide. Con el MCP conectado, el asistente se las lee todas y te cuenta qué dicen.","The assistant reads the reviews feed. This is the call it makes, if you would rather see the raw text yourself.","El asistente lee el feed de reseñas. Esta es la llamada que hace, por si prefieres ver el texto crudo tú mismo.",{"id":281,"fields":1608},{"Prompt":1609,"Minutes":1264,"Title_en":1610,"Datasets":1611,"Published":802,"Build_en":1612,"Seo_description_en":1613,"Endpoint":1614,"Summary_en":1615,"Seo_title_en":1616,"Seo_description_es":1617,"Steps_es":1618,"Order":1264,"Requires":1619,"Summary_es":1620,"Faqs_es":1621,"Seo_title_es":1622,"Build_es":1623,"Date":1093,"Slug_en":1624,"Icon":1190,"Faqs_en":1625,"Slug_es":1626,"Intro_en":1627,"Steps_en":1628,"Curl":1629,"Layer":34,"Title_es":1630,"Intro_es":1631,"Kind":1103,"Call_text_en":1632,"Call_text_es":1633},"Use my Veetal Connect data to build a live rate checker for one of my hotels.\n\nI want to type a stay — check-in, check-out, number of adults — and get the\ncurrent rate back from the OTA, not a stored one. Work out what data you need\nand fetch it.\n\nBuild it as a single self-contained HTML page, plain HTML and CSS:\n\n- A small form: hotel, check-in, check-out, adults.\n- A clear loading state that tells me a live request can take up to a couple of\n  minutes, so the wait never looks like a hang.\n- The result: rate, room type, board and cancellation policy, plus the exact\n  time the rate was fetched.\n- A visible message when the hotel has no availability for that stay, instead\n  of an empty screen.\n- Never fall back to an older or invented price.\n\nClean and quick to read, works in light and dark.","Live Rate-Shopper",[113],"A small rate checker: pick a hotel, a stay and an occupancy, fire the request, and show the live rate with its room type, board and cancellation policy — plus how long the call took, so the wait is never a mystery.","Fetch live Booking.com hotel rates on demand for any stay date and occupancy with the Veetal Connect real-time API.","GET /v2/real-time/accommodation/{slug}/rate/booking/{checkin}/{checkout}/{adults}","Fetch a live Booking.com rate for a hotel and stay, on demand.","Live Rate-Shopper — Real-Time Hotel Rates API — Veetal Connect API","Consulta tarifas de hotel de Booking.com en vivo para cualquier fecha de estancia y ocupación con la API en tiempo real de Veetal Connect.","## Consigue tu API key\n\nCrea tu cuenta y copia tu key. Empiezas gratis con 100 créditos.\n\n## Elige hotel y estancia\n\nCoge el slug del alojamiento de tu cuenta y elige entrada, salida y número de adultos.\n\n## Lanza la llamada en vivo\n\nLa petición sale hacia la OTA y vuelve con la tarifa actual. Cuenta con que tarde más que una lectura de Feed y con que consuma créditos.",[33],"Consulta una tarifa de Booking.com en vivo para un hotel y una estancia concreta.","## ¿En qué se diferencia de la parrilla de tarifas?\n\nLa parrilla lee la capa Feed pre-procesada: un mes entero, rápido y barato, refrescado de forma programada. Esta sale a la OTA para una sola estancia ahora — más lenta y consume créditos, pero es el precio actual.\n\n## ¿Cuánto tarda una llamada en vivo?\n\nLas llamadas en tiempo real consultan la OTA en el momento, así que se miden en segundos, no en milisegundos. Monta un estado de carga y no las pongas en un bucle apretado.\n\n## ¿Qué OTAs están soportadas?\n\nBooking.com por esta ruta, con endpoints hermanos para Expedia y Hotels.com. Consulta la referencia de la API para la lista completa.\n\n## ¿Puedo consultar un hotel que no está en mi cuenta?\n\nLos endpoints en tiempo real aceptan un tipo de referencia y un identificador, así que no estás limitado a tus alojamientos configurados como en la capa Feed.","Rate-Shopper en vivo — API de tarifas de hotel en tiempo real — Veetal Connect API","Un comprobador de tarifas: eliges hotel, estancia y ocupación, lanzas la petición y ves la tarifa en vivo con su tipo de habitación, régimen y política de cancelación — además de cuánto ha tardado la llamada, para que la espera nunca sea un misterio.","live-rate-shopper","## How is this different from the rate grid?\n\nThe grid reads the pre-processed Feed layer: a whole month, fast and cheap, refreshed on a schedule. This one goes out to the OTA for a single stay right now — slower and it consumes credits, but it is the current price.\n\n## How long does a live call take?\n\nReal-time calls query the OTA at request time, so they are measured in seconds rather than milliseconds. Build a loading state and do not put one in a tight loop.\n\n## Which OTAs are supported?\n\nBooking.com through this path, with sibling endpoints for Expedia and Hotels.com. See the API reference for the full list.\n\n## Can I check a hotel that is not on my account?\n\nReal-time endpoints accept a reference type and identifier, so you are not limited to your configured accommodations the way the Feed layer is.","rate-shopper-en-vivo","Sometimes the stored feed is not enough — you need the price on screen right now, for a specific stay. This recipe queries the live rate for a hotel, check-in, check-out and occupancy, straight from the OTA.","## Get your API key\n\nCreate your account and copy your key. Start free with 100 API credits.\n\n## Pick a hotel and a stay\n\nTake the accommodation slug from your account and choose check-in, check-out and how many adults.\n\n## Fire the live call\n\nThe request goes out to the OTA and comes back with the current rate. Expect it to take longer than a Feed read, and to consume credits.","curl \"https://api.veetal.app/v2/real-time/accommodation/YOUR_HOTEL_SLUG/rate/booking/2026-09-15/2026-09-17/2\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Rate-Shopper en vivo","A veces el feed almacenado no basta y necesitas el precio que hay en pantalla ahora mismo, para una estancia concreta. Esta receta consulta la tarifa en vivo de un hotel para unas fechas y una ocupación, directamente de la OTA.","One request goes out to the OTA and returns the current rate for that stay. Swap in your hotel slug, the dates and your key.","Una petición sale hacia la OTA y devuelve la tarifa actual de esa estancia. Pon el slug de tu hotel, las fechas y tu key.",{"id":201,"fields":1635},{"Minutes":1636,"Title_en":1637,"Datasets":1638,"Published":802,"Build_en":1639,"Needs_import":802,"Seo_description_en":1640,"Repo_url":1269,"Endpoint":1641,"Summary_en":1642,"Seo_title_en":1643,"Seo_description_es":1644,"Steps_es":1645,"Order":1508,"Repo_folder":1646,"Requires":1647,"Summary_es":1648,"Faqs_es":1649,"Import_service":65,"Seo_title_es":1650,"Build_es":1651,"Date":1155,"Slug_en":1646,"Icon":1251,"Faqs_en":1652,"Slug_es":1653,"Dashboard_url":1654,"Import_entity":62,"Intro_en":1655,"Stack":1288,"Steps_en":1656,"Run_command":1657,"Curl":1658,"Layer":10,"Title_es":1659,"Intro_es":1660,"Kind":1167,"Call_text_en":1661,"Call_text_es":1662},20,"Map a micro-market and watch it move",[96],"A command-line tool that turns a stored location search into the full picture of a micro-market: every listed hotel with its price, its position in Booking’s own ranking, its score and its distance to public transport, plus medians by star category. Point it at two dates and it reports the turnover — who entered the listing, who disappeared, who cut price and who climbed. Exports a shareable HTML report and a CSV.","Map every hotel listed in a district on Booking.com — price, rank, score and transit distance — and diff two days to see who entered, who left and who moved price.","GET /v2/feed/location-search/{id}/{date}/booking-location-search","Read every hotel listed in a district — price, rank, score, distance to the metro — and diff two days to see who entered the listing, who vanished and who moved.","Hotel Micro-Market Monitor — Booking Location Search API — Veetal","Cartografía todos los hoteles listados en un barrio en Booking.com — precio, posición, nota y distancia al transporte — y compara dos días para ver quién entra, quién sale y quién mueve el precio.","## Define el mercado en el dashboard\n\nUna búsqueda de ubicación es la definición del mercado: destino, noches, ocupación y los filtros que importan — estrellas, tipo de alojamiento, nota mínima, distancia al centro. Un barrio te da un comp set; una ciudad entera te da un informe que no lee nadie.\n\n## Prográmala y déjala correr\n\nEl valor está en la serie, no en una foto. Una periodicidad diaria convierte el feed en el registro de cómo se movió el mercado; la primera extracción es solo el día uno.\n\n## Clona la receta y pon tu key\n\nNode 20 y sin dependencias. Tu key va en un fichero `.env` y no sale de tu máquina.\n\n## Pregunta qué fechas tienen datos, y léelas\n\nEl feed indexa por la fecha de entrada que buscó cada import, y el histórico necesita el id del import que lo escribió. `--dates` lista los pares válidos para que no tengas que adivinar.\n\n## Compara dos días\n\nPasa `--vs` con una fecha anterior. La rotación —quién está listado hoy que no estaba la semana pasada— es la señal que no está mirando nadie.","micro-market-monitor",[1244,1088],"Lee todos los hoteles listados en un barrio — precio, posición, nota, distancia al metro — y compara dos días para ver quién entra, quién desaparece y quién se mueve.","## ¿Por qué una fecha que sé que se importó devuelve 404?\n\nPor dos motivos, y los dos responden con el mismo error 510. O la fecha no es la que buscó el import —guarda la fecha de entrada, que en una programación diaria es el día en que se ejecutó, no una que elijas tú— o has pedido un día antiguo sin su `import_id`. Sin ese id el endpoint solo sirve la última extracción. Ejecuta `--dates` y usa un par de esa lista.\n\n## ¿Esto no es lo mismo que seguir a mi competencia?\n\nEs la capa de encima. Un comp set son los cinco hoteles que elegiste tú; un micro-mercado es todo lo que Booking enseña de verdad para esas fechas y filtros, incluidos los que nunca miras y la apertura nueva que te quitó reservas el mes pasado.\n\n## ¿Qué cuesta?\n\nLeer el feed no se factura por petición. Los créditos se van en los imports que recogen el dato, y una búsqueda de ubicación se cobra por extracción — mira el estimador del dashboard antes de programar una diaria sobre veinte mercados.\n\n## ¿Por qué desaparece un hotel de un día para otro?\n\nNormalmente porque se ha llenado para esas fechas, o ha cerrado su inventario en Booking. Esa es la parte útil: un hotel que sale del listado es una señal de demanda, y llega antes de que aparezca en el rate shopper de nadie.\n\n## ¿Puedo comparar una ciudad entera?\n\nSí, pero pagina. Un barrio devolvió diez hoteles; una ciudad devuelve cientos y la respuesta viene paginada. La receta recorre todas las páginas — si escribes la tuya, `pagination.hasMore` es el campo que decide si estás viendo el mercado o un trozo.\n\n## ¿Los precios son comparables entre hoteles?\n\nDentro de una misma extracción, sí: mismas fechas, misma ocupación, mismo momento. Ojo con que `priceFinal` es lo que se cobra tras el descuento y `priceOriginal` puede ser mucho más alto — que una tarifa de 583 baje a 386 es lo normal, así que promediar el campo equivocado te engañará.","Monitor de micro-mercado hotelero — API de búsqueda por ubicación — Veetal","Una herramienta de línea de comandos que convierte una búsqueda de ubicación guardada en la foto completa de un micro-mercado: cada hotel listado con su precio, su posición en el propio ranking de Booking, su nota y su distancia al transporte público, más las medianas por categoría. Apúntala a dos fechas y te informa de la rotación — quién entra, quién desaparece, quién baja el precio y quién sube puestos. Exporta un informe HTML y un CSV.","## Why does a date I know was imported return 404?\n\nTwo reasons, and both answer with the same error 510. Either the date is not the one the import searched — it stores the check-in date, which for a daily schedule is the day it ran, not a date you pick — or you asked for an older day without its `import_id`. Without that id the endpoint only serves the latest extraction. Run `--dates` and use a pair from that list.\n\n## Is this the same as tracking my competitors?\n\nIt is the layer above. A comp set is the five hotels you chose; a micro-market is everyone Booking actually shows for those dates and filters, including the ones you never think about and the new opening that took your bookings last month.\n\n## What does it cost?\n\nReading the feed is not billed per request. The credits go on the imports that collect the data, and a location search is billed per extraction — check the estimate in the dashboard before you set a daily schedule on twenty markets.\n\n## Why does a hotel disappear from one day to the next?\n\nUsually because it sold out for those dates, or closed its Booking inventory. That is the useful part: a hotel leaving the listing is a demand signal, and it arrives before it shows up in anyone's rate shopper.\n\n## Can I compare a whole city?\n\nYes, but page for it. A district returned ten hotels; a city returns hundreds and the response is paginated. The recipe walks every page — if you write your own, `pagination.hasMore` is the field that decides whether you are looking at the market or at a slice of it.\n\n## Are the prices comparable between hotels?\n\nWithin one extraction, yes: same dates, same occupancy, same moment. Note that `priceFinal` is what is charged after discount, and `priceOriginal` can be far higher — a headline rate of 583 dropping to 386 is ordinary, so averaging the wrong field will mislead you.","monitor-micro-mercado","https://dashboard.veetal.app/account/location-searches","A guest choosing your hotel is not choosing between every hotel in the city. They are choosing between the dozen in your district, at their dates, in their price band. That is the market that decides your occupancy, and Booking already ranks it every day — you just have to store it and read it back.","## Configure the market in the dashboard\n\nA location search is the market definition: destination, nights, occupancy and the filters that matter — stars, accommodation type, minimum score, distance from the centre. A district gives you a comp set; a whole city gives you a report nobody reads.\n\n## Schedule it, then let it run\n\nThe value is in the series, not in one snapshot. A daily schedule turns the feed into a record of how the market moved; the first extraction is just day one.\n\n## Clone the recipe and add your key\n\nNode 20 and no dependencies. Your key goes in a `.env` file and never leaves your machine.\n\n## Ask which dates have data, then read them\n\nThe feed indexes by the check-in date each import searched, and history needs the import id that wrote it. `--dates` lists the valid pairs so you never guess.\n\n## Diff two days\n\nPass `--vs` with an earlier date. The turnover — who is listed today that was not there last week — is the signal nobody else is reading.","git clone https://github.com/Veetal-Connect/recipes.git\ncd recipes/micro-market-monitor\ncp .env.example .env          # put your VEETAL_API_KEY in it\nnode --env-file=.env index.mjs --list\nnode --env-file=.env index.mjs YOUR_SEARCH_ID YYYY-MM-DD --vs YYYY-MM-DD   # the day to read, and the day to diff it against","# The date is the check-in date the import searched. Older days need their import_id.\ncurl \"https://api.veetal.app/v2/feed/location-search/YOUR_LOCATION_SEARCH_ID/2026-08-19/booking-location-search?limit=100&import_id=YOUR_IMPORT_ID\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Cartografía un micro-mercado y mira cómo se mueve","Un huésped que elige tu hotel no elige entre todos los de la ciudad. Elige entre la docena de tu barrio, en sus fechas y en su banda de precio. Ese es el mercado que decide tu ocupación, y Booking ya lo ordena cada día — solo hay que guardarlo y volver a leerlo.","One request returns every accommodation stored for that market and date, with price, stars, score, review count and location detail. The import id is what unlocks any day that is not the most recent one.","Una petición devuelve todos los alojamientos guardados para ese mercado y esa fecha, con precio, estrellas, nota, número de reseñas y detalle de ubicación. El id del import es lo que abre cualquier día que no sea el más reciente.",{"id":282,"fields":1664},{"Minutes":1276,"Title_en":1665,"Datasets":1666,"Published":802,"Build_en":1667,"Seo_description_en":1668,"Endpoint":1614,"Summary_en":1669,"Seo_title_en":1670,"Seo_description_es":1671,"Steps_es":1672,"Body_es":1673,"Body_en":1674,"Order":1076,"Requires":1675,"Summary_es":1676,"Faqs_es":1677,"Seo_title_es":1678,"Build_es":1679,"Date":1093,"Slug_en":1680,"Icon":1190,"Faqs_en":1681,"Slug_es":1682,"Dashboard_url":1683,"Intro_en":1684,"Steps_en":1685,"Curl":1686,"Layer":34,"Title_es":1687,"Intro_es":1688,"Kind":1167,"Call_text_en":1689,"Call_text_es":1690},"Run your first real-time call from the playground",[113],"A live rate call to Booking.com for one of your hotels, answered in seconds with room-level pricing, and that very same call running in Postman — plus the map of which other real-time endpoints need an entity and which ones don't.","Launch a live Booking.com rate request from the Veetal dashboard playground, read the JSON, and copy the generated cURL straight into Postman.","Run a live Booking.com rate call from the dashboard playground, read the response, and copy the same request into Postman or your own code without writing a line of it yourself.","Run a real-time hotel rate call from the playground — Veetal","Lanza una petición en vivo de tarifas de Booking.com desde el playground del dashboard de Veetal, lee el JSON y copia el cURL generado directo a Postman.","## Elige la API y el endpoint\n\nAbre el playground y usa el desplegable de API, agrupado en Real Time, Feed y Account. Solo salen las APIs que tu cuenta tiene activas y que tienen endpoints. Después eliges el endpoint.\n\n## Rellena lo que te pide\n\nEl formulario se genera desde la definición del endpoint. Primero los campos obligatorios; los que apuntan a una entidad llevan un botón más que la crea sin salir de la pantalla. Los opcionales se despliegan con Show optional fields.\n\n## Lanza la petición\n\nRun request está deshabilitado hasta que los obligatorios estén completos. La respuesta vuelve con su chip de HTTP, la duración y el tamaño, y el cuerpo como un árbol JSON con buscador que puedes copiar o descargar.\n\n## Llévate la llamada a Postman\n\nLa columna derecha enseña la misma petición en cURL, Node.js, PHP y Python. Copia el cURL e impórtalo en Postman con Import, Raw text. Lleva tu API key real, así que trátalo como una contraseña.\n\n## Prueba los endpoints que no necesitan entidad\n\nLas tarifas de vuelo se piden con dos códigos de aeropuerto, y el buscador de catálogo resuelve ciudades, aeropuertos y monedas gratis. Ninguno necesita nada dado de alta en tu cuenta.","Al terminar habrás lanzado una petición real contra Booking.com desde el navegador, habrás leído la respuesta y tendrás esa misma llamada funcionando en Postman.\n\n**Qué necesitas:** una API real-time instalada y activa en tu cuenta y, para este ejemplo, un hotel ya dado de alta como alojamiento. Si todavía no tienes ninguno, salta al último paso: hay endpoints que no necesitan nada.\n\n**Lo que cuesta:** 1 crédito esta petición. Las llamadas real-time se cobran por petición; una respuesta servida desde caché no cuesta nada.\n\n## 1. Elige la API y el endpoint\n\nAbre el [Playground](https://dashboard.veetal.app/developers/playground). El desplegable **API** está agrupado en **Real Time**, **Feed** y **Account**, y solo lista las APIs que tu cuenta tiene activas y con endpoints publicados.\n\n![El desplegable de API, agrupado por familia](/images-webp/recipes/first-realtime-call-playground/01-api-list.webp)\n\nElige **Booking Accommodation Rates**. El selector **ENDPOINT** de debajo se llena con los endpoints de esa API — aquí *Booking Accommodation Rates (by slug)* — y bajo él aparece la descripción de lo que devuelve. El icono de reloj que hay al lado abre el historial de tus últimas llamadas a ese endpoint.\n\n## 2. Rellena lo que te pide\n\nLos campos se generan desde la definición del endpoint, así que cada uno pide exactamente lo suyo: **SLUG**, **CHECKIN**, **CHECKOUT** y **ADULTS** en este caso. Los campos que apuntan a una entidad llevan un botón **+** que abre el diálogo de alta sin salir del playground.\n\n**Show optional fields** despliega el resto — moneda, idioma, régimen, cancelación. **Run request** sigue deshabilitado hasta que los obligatorios estén completos y, en los endpoints de escritura, hasta que el JSON del cuerpo sea válido.\n\n## 3. Lánzala y lee la respuesta\n\n![El formulario relleno, el cURL generado y la respuesta](/images-webp/recipes/first-realtime-call-playground/02-run-request.webp)\n\nLos chips que hay sobre la respuesta son la verdad de lo que ha pasado: **HTTP 200**, **6.7s**, **3.4KB**. Segundos, no milisegundos — Veetal está abriendo Booking.com por ti en ese momento, no leyendo una copia guardada. El cuerpo llega como un árbol JSON con buscador, botón de copiar y descarga del JSON.\n\nEl chip de créditos de la cabecera pasó de 761 a 762: **un crédito**.\n\n## 4. Llévate la misma llamada a Postman\n\nLa columna derecha es la misma petición en **cURL**, **Node.js**, **PHP** y **Python**.\n\n![El cURL generado, con la API key tapada](/images-webp/recipes/first-realtime-call-playground/03-curl-snippet.webp)\n\nPulsa **Copy** y en Postman usa **Import → Raw text**, pega y **Continue**. Te llega la petición con su URL, su query y la cabecera `veetal-api-key` ya puesta.\n\nDos cosas que conviene saber de ese snippet:\n\n- **Lleva tu API key real.** La pantalla la tapa y el icono del ojo la revela, pero **Copy** copia la de verdad. Trátala como una contraseña: no la pegues en un ticket, en una captura ni en una colección compartida.\n- **Incluye `no_cache=true`.** El playground siempre fuerza llamada fresca para que veas dato vivo. Quita ese parámetro en tu integración y podrá reaprovecharse una respuesta reciente — más rápido, y no vuelve a cobrar.\n\n## 5. Los endpoints que no necesitan ninguna entidad\n\nNo toda llamada real-time necesita algo dado de alta antes:\n\n- **Tarifas de vuelo** — `GET /v2/real-time/flight/rate/airport/{origin}/{destination}/{departure_date}` se pide con dos códigos IATA y una fecha. No hay que crear nada.\n- **Search** — los endpoints de catálogo resuelven regiones, países, ciudades, aeropuertos y monedas, y son gratis.\n- **Booking search** — `GET /v2/real-time/booking/search/{type}/{name}` encuentra un hotel por su nombre y te da los identificadores que piden los demás endpoints.\n\nY los que sí piden un alojamiento siguen la misma forma que esta receta: `/reputation/booking`, `/reviews/booking`, `/availability/booking/{from}/{to}/{adults}`, `/parity/{checkin}/{checkout}/{adults}`.\n\n## Qué pasa después\n\nCada llamada que haces se guarda. Abre la API desde el menú lateral y su pestaña **Requests** te enseña la gráfica diaria y horaria más la tabla de peticiones: parámetros, respuesta, duración, créditos y si vino de caché. Desde ahí puedes repetir cualquiera en el playground — lo que vuelve a cobrar salvo que responda la caché.","By the end you will have run a real request against Booking.com from your browser, read the answer, and have that exact same call working in Postman.\n\n**What you need:** one real-time API installed and active on your account, and — for this example — a hotel already registered as an accommodation. If you have none yet, jump to the last step: two of the endpoints need nothing at all.\n\n**What it costs:** 1 credit for this request. Real-time calls are billed per request; a response served from cache costs nothing.\n\n## 1. Pick the API and the endpoint\n\nOpen [Playground](https://dashboard.veetal.app/developers/playground). The **API** dropdown is grouped into **Real Time**, **Feed** and **Account**, and only lists the APIs your account has active with endpoints published.\n\n![The API dropdown, grouped by family](/images-webp/recipes/first-realtime-call-playground/01-api-list.webp)\n\nPick **Booking Accommodation Rates**. The **ENDPOINT** selector below fills with that API's endpoints — here, *Booking Accommodation Rates (by slug)* — and the description of what it returns appears underneath. The clock icon next to it opens the history of your last calls to that endpoint.\n\n## 2. Fill in what it asks for\n\nThe fields are generated from the endpoint definition, so each endpoint asks for exactly what it needs: **SLUG**, **CHECKIN**, **CHECKOUT** and **ADULTS** for this one. Fields that point to an entity carry a **+** button that opens the creation dialog without leaving the playground.\n\n**Show optional fields** reveals the rest — currency, language, meal plan, cancellation. **Run request** stays disabled until every required field is filled and, on write endpoints, until the JSON body parses.\n\n## 3. Run it and read the answer\n\n![The filled form, the generated cURL and the response](/images-webp/recipes/first-realtime-call-playground/02-run-request.webp)\n\nThe chips above the response are the truth of what happened: **HTTP 200**, **6.7s**, **3.4KB**. Seconds, not milliseconds — Veetal is opening Booking.com for you at that moment, not reading a stored copy. The body arrives as a JSON tree with a search box, a copy button and a JSON download.\n\nThe credits chip in the header went from 761 to 762: **one credit**.\n\n## 4. Take the same call to Postman\n\nThe right column is the same request in **cURL**, **Node.js**, **PHP** and **Python**.\n\n![The generated cURL, with the API key masked](/images-webp/recipes/first-realtime-call-playground/03-curl-snippet.webp)\n\nPress **Copy**, then in Postman use **Import → Raw text**, paste, and **Continue**. You get the request with its URL, its query string and the `veetal-api-key` header already set.\n\nTwo things to know about that snippet:\n\n- **It carries your real API key.** The screen masks it and the eye icon reveals it, but **Copy** copies the real one. Treat it like a password: don't paste it into a ticket, a screenshot or a shared collection.\n- **It includes `no_cache=true`.** The playground always forces a fresh call so you see live data. Drop that parameter in your own integration and a recent answer can be reused — faster, and it doesn't bill again.\n\n## 5. The endpoints that need no entity at all\n\nNot every real-time call needs something registered first:\n\n- **Flight rates** — `GET /v2/real-time/flight/rate/airport/{origin}/{destination}/{departure_date}` takes two IATA codes and a date. Nothing to create.\n- **Search** — the catalog endpoints resolve regions, countries, cities, airports and currencies, and are free.\n- **Booking search** — `GET /v2/real-time/booking/search/{type}/{name}` finds a hotel by name and hands you the identifiers the other endpoints want.\n\nAnd the ones that do take an accommodation follow the same shape as this recipe: `/reputation/booking`, `/reviews/booking`, `/availability/booking/{from}/{to}/{adults}`, `/parity/{checkin}/{checkout}/{adults}`.\n\n## What happens next\n\nEvery call you make is kept. Open the API from the sidebar and its **Requests** tab shows the daily and hourly chart plus the table of requests: parameters, response, duration, credits, and whether it came from cache. From there you can replay any of them back into the playground — which bills again unless the cache answers.",[33],"Lanza una llamada en vivo a las tarifas de Booking.com desde el playground del dashboard, lee la respuesta y llévate esa misma petición a Postman o a tu código sin escribir una línea.","## ¿Por qué una llamada real-time tarda segundos y no milisegundos?\n\nPorque no hay copia guardada que leer. Al lanzarla, Veetal abre la OTA, salva sus defensas, renderiza la página y la parsea, todo dentro de tu petición. Los 6,7 segundos de esta receta son ese trabajo. Si necesitas respuesta instantánea para pintar una página, usa un dataset Feed — el dato equivalente, escrito por un import programado y servido desde tu cuenta.\n\n## ¿Repetir una petición me cobra dos veces?\n\nSolo si vuelve a salir de verdad. Las respuestas real-time se cachean durante una ventana corta, y una respuesta cacheada no factura. El playground añade `no_cache=true` a propósito para que siempre veas dato vivo, así que cada ejecución desde el playground es una llamada real y un crédito real. Quita el parámetro en tu integración.\n\n## ¿Dónde está mi API key y por qué el playground no me la pide?\n\nEl playground ejecuta con la key de la cuenta con la que has entrado, por eso no hay campo de key. La encuentras, junto al botón para regenerarla, en Developers, Authentication. Si ves \"Current account does not have a valid API key\", la cuenta a la que has cambiado no tiene ninguna — vuelve a la tuya o genérale una.\n\n## ¿Puedo llamar a un endpoint real-time sin dar de alta nada?\n\nA algunos sí. Las tarifas de vuelo se piden con dos códigos de aeropuerto, los endpoints de catálogo resuelven geografía y monedas gratis, y Booking search encuentra un hotel por su nombre. Los que trabajan sobre un hotel tuyo — tarifas, disponibilidad, reputación, reseñas, paridad — necesitan que ese hotel exista como alojamiento en tu cuenta.\n\n## La respuesta ha vuelto con un error. ¿Dónde miro?\n\nEl chip se pone rojo y el cuerpo trae el código y el mensaje del error. Abre la pestaña Requests de esa API para ver la llamada con sus parámetros; allí salen los mismos códigos. Los códigos de las series 600 y 700 suelen ser un identificador que no se ha podido resolver; un 270 significa que la ficha de la OTA no se pudo leer en ese momento, y conviene reintentarlo antes de darlo por bug.","Lanza una llamada real-time de tarifas desde el playground — Veetal","Una llamada en vivo a las tarifas de Booking.com de uno de tus hoteles, respondida en segundos con el precio de cada habitación, y esa misma llamada funcionando en Postman — más el mapa de qué otros endpoints real-time necesitan una entidad y cuáles no.","first-realtime-call-playground","## Why does a real-time call take seconds instead of milliseconds?\n\nBecause there is no stored copy to read. When you run it, Veetal opens the OTA, gets past its defences, renders the page and parses it, all within your request. The 6.7 seconds in this recipe are that work. If you need an instant answer for a page load, use a Feed dataset — the equivalent data, written by a scheduled import, served from your account.\n\n## Does repeating a request charge me twice?\n\nOnly if it actually goes out again. Real-time responses are cached for a short window, and a cached answer does not bill. The playground appends `no_cache=true` on purpose so you always see live data, which means every run from the playground is a real call and a real credit. Remove the parameter in your own integration.\n\n## Where is my API key, and why does the playground not ask for it?\n\nThe playground executes with the key of the account you are logged into, so there is no key field. You will find it, and the button to regenerate it, under Developers, Authentication. If you see \"Current account does not have a valid API key\", the account you switched into has none — switch back or generate one.\n\n## Can I call a real-time endpoint without registering anything first?\n\nYes, for some. Flight rates take two airport codes, the catalog search endpoints resolve geography and currencies for free, and Booking search finds a hotel by name. The endpoints that work on one of your hotels — rates, availability, reputation, reviews, parity — need that hotel to exist as an accommodation on your account.\n\n## The response came back with an error code. Where do I look?\n\nThe chip turns red and the body carries the error code and message. Open the API's Requests tab to see that call again with its parameters, and the same codes appear there. Codes in the 600s and 700s usually mean an identifier that could not be resolved; a 270 means the OTA listing could not be read at that moment, which is worth retrying before treating it as a bug.","primera-llamada-realtime-playground","https://dashboard.veetal.app/developers/playground","Every real-time endpoint works the same way: pick it, fill in what it asks for, run it. The playground does that with your own API key and shows you the exact cURL, Node.js, PHP or Python that produced the answer — so the jump from clicking to integrating is a copy and a paste.","## Pick the API and the endpoint\n\nOpen the playground and use the API dropdown, grouped into Real Time, Feed and Account. Only the APIs your account has active, and that have endpoints, are listed. Then pick the endpoint.\n\n## Fill in what it asks for\n\nThe form is generated from the endpoint definition. Required fields first; the ones that point to an entity carry a plus button that creates it without leaving the screen. Optional fields hide behind Show optional fields.\n\n## Run the request\n\nRun request stays disabled until every required field is filled. The response comes back with an HTTP chip, the duration and the size, and the body as a searchable JSON tree you can copy or download.\n\n## Copy the call into Postman\n\nThe right column shows the same request as cURL, Node.js, PHP and Python. Copy the cURL and import it in Postman with Import, Raw text. It carries your real API key, so treat it like a password.\n\n## Try the endpoints that need no entity\n\nFlight rates take two airport codes, and the catalog search resolves cities, airports and currencies for free. Neither needs anything registered in your account first.","curl \"https://api.veetal.app/v2/real-time/accommodation/YOUR_ACCOMMODATION_SLUG/rate/booking/2026-09-15/2026-09-16/2?currency=EUR&lang=en\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Lanza tu primera llamada real-time desde el playground","Todos los endpoints real-time funcionan igual: lo eliges, rellenas lo que pide y lo lanzas. El playground lo hace con tu propia API key y te enseña el cURL, el Node.js, el PHP o el Python exactos que han producido esa respuesta — así el salto de hacer clic a integrar es copiar y pegar.","This is the call the playground built. Swap in your slug, your dates and your key. Drop the no_cache parameter if you would rather let a recent answer be reused.","Esta es la llamada que ha construido el playground. Cambia el slug, las fechas y la key por los tuyos. Quita el parámetro no_cache si prefieres que se reaproveche una respuesta reciente.",{"id":280,"fields":1692},{"Prompt":1693,"Minutes":1076,"Title_en":1694,"Datasets":1695,"Published":802,"Build_en":1696,"Seo_description_en":1697,"Endpoint":1614,"Summary_en":1698,"Seo_title_en":1699,"Seo_description_es":1700,"Steps_es":1701,"Order":1183,"Requires":1702,"Summary_es":1703,"Faqs_es":1704,"Seo_title_es":1705,"Build_es":1706,"Date":1093,"Slug_en":1707,"Icon":1190,"Faqs_en":1708,"Slug_es":1709,"Intro_en":1710,"Steps_en":1711,"Curl":1712,"Layer":34,"Title_es":1713,"Intro_es":1714,"Kind":1103,"Call_text_en":1715,"Call_text_es":1716},"Use my Veetal Connect data to build a competitor rate grid for my hotel,\nfor a stay I choose, using live Booking.com rates.\n\nI want the view a revenue manager reads every morning: my hotel against the\nhotels I compete with, and what each of them is charging right now for that\nstay. Work out what data you need and fetch it.\n\nBuild it as a single self-contained HTML page — plain HTML and CSS, no\nframeworks, no build step, no external requests:\n\n- One row per property: my hotel pinned to the top and visually separated,\n  then every competitor.\n- For each property, the cheapest available rate for the stay, plus the room\n  type, board and whether it is refundable.\n- Colour each row by where it sits against the set: cheapest, mid, priciest.\n- A summary line: the set's median rate, my position in the ranking, and the\n  gap to the cheapest competitor in money and percent.\n- Show how many rooms are left when the data says so — a low count next to a\n  high price is a different signal than a high price alone.\n- Leave a property visibly empty when it returns no availability, and never\n  invent a price.\n- Because these are live calls, show progress as each hotel comes back rather\n  than a single long spinner.\n\nClean and readable at a glance, works in light and dark. Use only real values\nfrom my data.","Competitor Rate Grid",[113],"A single self-contained HTML page — no framework, no build step: one row per property, the cheapest available rate for the stay in each cell, your own hotel pinned to the top, and colour coding for where you sit against the set. Room type, board and cancellation come along for free.","Build an RMS-style rate shopping grid from live Booking.com rates: your hotel versus its competitor set for any stay. Plain HTML and CSS, no scraper.","The classic rate-shopping grid: your hotel against its comp set, live from Booking.com.","Competitor Rate Grid — Live Hotel Rate Shopping API — Veetal Connect API","Monta una parrilla de rate shopping estilo RMS con tarifas en vivo de Booking.com: tu hotel frente a su compset para cualquier estancia. HTML y CSS puros, sin scraper.","## Consigue tu API key\n\nCrea tu cuenta y copia tu key. Empiezas gratis con 100 créditos.\n\n## Lista tu compset\n\nLee los competidores configurados para tu hotel: ahí tienes tu propio slug y cada rival al que sigues.\n\n## Una llamada en vivo por hotel\n\nPide a Booking.com la estancia, hotel a hotel. Coge la habitación más barata de cada respuesta y ya tienes la parrilla. Las llamadas en vivo tardan segundos y consumen créditos, así que mantén el compset ajustado.",[33,452],"La parrilla de rate shopping de siempre: tu hotel frente a su compset, en vivo desde Booking.com.","## ¿De dónde salen los competidores?\n\nDel compset configurado en tu cuenta para ese hotel. Una llamada devuelve tus rivales, y cada uno trae el slug que luego usas para pedir su tarifa.\n\n## ¿Por qué tarifas en vivo y no el feed almacenado?\n\nPorque este es el precio que hay en Booking.com ahora mismo, que es sobre lo que actúas cuando retarificas hoy. La capa Feed sale más barata para leer históricos largos, pero se refresca de forma programada.\n\n## ¿Cuántos créditos cuesta una parrilla?\n\nUna llamada en vivo por establecimiento. Un compset de seis hoteles son seis llamadas para una estancia: mantén el compset ajustado y cachea el resultado en vez de volver a pedirlo en cada carga.\n\n## ¿Por qué un hotel vuelve vacío?\n\nPorque no tiene disponibilidad para esa estancia, o la estancia no llega a su mínimo de noches. La receta deja la fila visiblemente en blanco a propósito, en vez de arrastrar un precio antiguo.","Parrilla de tarifas de la competencia — API de rate shopping en vivo — Veetal Connect API","Una única página HTML autocontenida — sin framework ni build: una fila por establecimiento, la tarifa más barata disponible para la estancia en cada celda, tu hotel anclado arriba y color según cómo quedas frente al compset. El tipo de habitación, el régimen y la cancelación vienen de regalo.","competitor-rate-grid","## Where do the competitors come from?\n\nFrom the competitor set configured on your account for that hotel. One call returns your rivals, and each one carries the slug you then use for its rate call.\n\n## Why live rates instead of the stored feed?\n\nBecause this is the price on Booking.com right now, which is what you act on when you reprice today. The stored Feed layer is cheaper for reading long histories, but it is refreshed on a schedule.\n\n## How many credits does a grid cost?\n\nOne live call per property. A set of six hotels is six calls for one stay — keep the set tight and cache the answer rather than refetching on every page load.\n\n## Why does a hotel come back empty?\n\nNo availability for that stay, or the stay is below its minimum nights. The recipe leaves the row visibly blank on purpose instead of carrying over an older price.","parrilla-tarifas-competencia","Rebuild the grid every revenue manager reads each morning — your hotel and its competitor set side by side for a stay — using live Booking.com rates. One call per property, current prices, no scraper.","## Get your API key\n\nCreate your account and copy your key. Start free with 100 API credits.\n\n## List your comp set\n\nRead the competitors configured for your hotel — that gives you your own slug plus every rival you track.\n\n## One live call per hotel\n\nAsk Booking.com for the stay, hotel by hotel. Take the cheapest room from each response and you have the grid. Live calls take seconds and consume credits, so keep the set tight.","# 1) Your comp set for this hotel\ncurl \"https://api.veetal.app/v2/account/accommodation/YOUR_HOTEL_ID/competitors\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"\n\n# 2) Live Booking.com rates, one call per hotel in the set\ncurl \"https://api.veetal.app/v2/real-time/accommodation/YOUR_HOTEL_SLUG/rate/booking/2026-09-15/2026-09-17/2\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Parrilla de tarifas de la competencia","Reconstruye la parrilla que todo revenue manager mira cada mañana — tu hotel y su compset lado a lado para una estancia — con tarifas en vivo de Booking.com. Una llamada por establecimiento, precios actuales y sin scraper.","One call returns every room on sale for that stay, with price per night, board and cancellation. Repeat it for each hotel in your set to fill the grid.","Una llamada devuelve todas las habitaciones a la venta para esa estancia, con precio por noche, régimen y cancelación. Repítela para cada hotel del compset y tienes la parrilla.",{"id":473,"fields":1718},{"Minutes":1398,"Title_en":1719,"Datasets":1720,"Published":802,"Build_en":1721,"Seo_description_en":1722,"Endpoint":1113,"Summary_en":1723,"Seo_title_en":1724,"Seo_description_es":1725,"Steps_es":1726,"Body_es":1727,"Body_en":1728,"Order":1563,"Summary_es":1729,"Faqs_es":1730,"Seo_title_es":1731,"Build_es":1732,"Date":1155,"Slug_en":1733,"Icon":1126,"Faqs_en":1734,"Slug_es":1735,"Dashboard_url":1736,"Intro_en":1737,"Steps_en":1738,"Curl":1739,"Layer":10,"Title_es":1740,"Intro_es":1741,"Kind":1167,"Call_text_en":1742,"Call_text_es":1743},"Add a city and see the demand its events will create",[85],"A year of Barcelona's events with, for each one, total roomnights, the booking window (which opens before the event does), daily pressure against city inventory, the split by hotel category and guest profile, and the geographic distribution by ring.","Register a city on Veetal and read its events with hotel demand attached: roomnights per night, pressure on city inventory, guest profile and distance ring.","Register Barcelona as a location and read its event calendar with hotel demand attached: roomnights per day, pressure against the city's 40.000 rooms, and which ring of the city those rooms sit in.","See the hotel demand a city's events create — Veetal","Da de alta una ciudad en Veetal y lee sus eventos con la demanda hotelera pegada: roomnights por noche, presión sobre el inventario, perfil de huésped y anillo de distancia.","## Da de alta la ciudad como location\n\nEn Locations, Add locations, y busca el destino. Barcelona devuelve cuatro candidatas en cuatro países — elige la correcta y mantén el nombre real del destino o recibirás el error 731. El id de la fila es el location_id que pide toda llamada de eventos.\n\n## Fíjate en que no hay import\n\nLa página del feed de Events no tiene pestaña de Imports ni nada que lanzar. El pipeline de Veetal construye el dataset ciudad a ciudad, y se factura por location y mes en vez de por petición.\n\n## Lee el calendario con su impacto\n\nGET /v2/feed/events/{location_id} devuelve cada evento con hotel_impact: roomnights totales, la ventana de reserva y la presión contra el inventario de habitaciones de la ciudad. La presión es una fracción de 0 a 1 y puede pasarse de 1.\n\n## Desglosa la demanda\n\nCada día trae by_category (económico, gama media, lujo) y by_profile (business internacional, ocio, local). Un congreso de 27.000 delegados internacionales llena más habitaciones que una feria de 167.000 locales — lee el audience_mix antes de fiarte de la asistencia.\n\n## Averigua si es tu evento\n\ngeographic_distribution da el radio ponderado, la concentración y las roomnights por anillo de distancia cruzadas con categoría de hotel. Eso es lo que te dice si un evento cae sobre tu hotel o al otro lado de la ciudad.","Al terminar podrás preguntar \"qué está pasando en Barcelona y cuánta demanda hotelera va a generar\" y obtener una respuesta con **roomnights por día, presión sobre el inventario de la ciudad y en qué zona se van a reservar esas habitaciones**.\n\n**Qué necesitas:** el destino dado de alta como location en tu cuenta. Nada más.\n\n**Lo que cuesta:** los eventos se facturan por location y por mes, no por petición. No hay import que lanzar ni schedule que configurar — leer es la parte barata.\n\n## Lo único que tienes que hacer\n\nEvents es la rara entre las APIs Feed: **no tiene import**. El dataset lo produce el propio pipeline de Veetal, ciudad a ciudad. Tu parte del contrato es un solo paso: decirnos qué ciudad te importa.\n\nEn [Locations](https://dashboard.veetal.app/account/locations), **Add locations**, y busca el destino. El diálogo declara su propósito en el subtítulo: *\"You will use them to search events in the destination\"*.\n\n![Cuatro Barcelonas en cuatro países](/images-webp/recipes/add-a-city-to-see-its-events/01-location-finder.webp)\n\nBarcelona devuelve cuatro candidatas en cuatro países. Elige la que no es y todos los eventos que leas después son de otra ciudad. Usa **Show Map** si el nombre no basta para decidir.\n\n⚠️ El nombre tiene que ser el real del destino — rebautizarlo devuelve el error **`731`**.\n\n![La location dada de alta, con su tier y sus coordenadas](/images-webp/recipes/add-a-city-to-see-its-events/02-location-created.webp)\n\nLa fila enseña el tier y las coordenadas que resolvió el backend. El `id` de esa fila es el `location_id` que pide toda llamada de eventos.\n\nFíjate en lo que esta API **no** tiene: ni pestaña de Imports, ni import que lanzar. La página del feed de Events solo tiene **Locations**, **Events**, **Schedules** y **Requests**, y su pestaña Events trae cinco gráficas — por tipo, por tipo de público, evolución, mensual y por asistentes.\n\n## Lee el calendario\n\n`GET /v2/feed/events/{location_id}`, con un rango de fechas opcional y `min_impact`. Esta es una respuesta real de Barcelona, recortada a lo que importa:\n\n```json\n{\n  \"name\": \"Smart City Expo World Congress\",\n  \"acronym\": \"SCEWC\",\n  \"type\": \"fair_convention\",\n  \"subtype\": \"congress_technology\",\n  \"status\": \"verified\",\n  \"dates\": { \"start\": \"2026-11-03\", \"end\": \"2026-11-05\", \"duration_days\": 3 },\n  \"location\": {\n    \"venue\": \"Fira Barcelona - Recinte de Gran Via\",\n    \"address\": \"Av. Joan Carles I, 64, 08908 Barcelona, Spain\"\n  },\n  \"attendance\": { \"unique_visitors\": 27000, \"magnitude\": \"medium\" }\n}\n```\n\nHasta ahí podrías llegar con una web de agenda. El resto es para lo que existe de verdad el dataset.\n\n## La parte que pone precio a las habitaciones\n\n```json\n\"hotel_impact\": {\n  \"level\": \"high\",\n  \"score\": 0.559,\n  \"total_roomnights\": 63061,\n  \"booking_window\": { \"start\": \"2026-11-02\", \"end\": \"2026-11-06\" },\n  \"city_pressure\": {\n    \"city_inventory_rooms\": 40000,\n    \"peak_pressure_pct\": 0.5592,\n    \"avg_pressure_pct\": 0.3153,\n    \"peak_day\": \"2026-11-03\",\n    \"days_at_or_above_80pct\": 0\n  }\n}\n```\n\n**63.061 roomnights** sobre una ciudad de **40.000 habitaciones**, con un pico del **55,9 % de todo el inventario el 3 de noviembre**. Los porcentajes de presión son fracciones de 0 a 1, y pueden pasar de 1 — eso significa que el evento pide más habitaciones de las que tiene la ciudad.\n\nFíjate en que la **ventana de reserva abre el 2 de noviembre**, el día *anterior* al arranque del congreso. Los delegados llegan la noche antes. Si tu calendario de tarifas trata el 2 de noviembre como un lunes cualquiera, ya has dejado dinero encima de la mesa antes de que empiece el evento.\n\nDespués desglosa la demanda día a día:\n\n```json\n{\n  \"date\": \"2026-11-03\",\n  \"roomnights\": 22367,\n  \"pressure_pct\": 0.5592,\n  \"by_category\": { \"budget_hotels\": 1734, \"mid_range_hotels\": 12737, \"luxury_hotels\": 7896 },\n  \"by_profile\": { \"international_business\": 17290, \"national_business\": 4592, \"international_leisure\": 276 }\n}\n```\n\n**17.290 de esas roomnights son business internacional.** Ese es un huésped completamente distinto —y un techo de precio completamente distinto— que un pico de ocio del mismo tamaño.\n\n## Dónde en la ciudad, no solo cuántas\n\n```json\n\"geographic_distribution\": {\n  \"weighted_radius_km\": 4.9,\n  \"concentration\": \"near_venue\",\n  \"shares\": { \"at_venue\": 0.092, \"near_venue\": 0.656, \"regional\": 0.025 },\n  \"rings\": {\n    \"2000-5000\": {\n      \"mid_range_hotels\": { \"roomnights\": 20073, \"impact\": \"high\" },\n      \"luxury_hotels\":    { \"roomnights\": 12909, \"impact\": \"high\" }\n    }\n  }\n}\n```\n\nEl **65,6 % de la demanda cae cerca del recinto**, con un radio ponderado de 4,9 km, concentrada en hoteles de gama media y alta del anillo de 2 a 5 km. Si eres un hotel de gama media a dos kilómetros de Fira Gran Via, este evento es tuyo. Si eres un económico al otro lado de la ciudad, el mismo evento apenas te mueve — y el dataset te lo dice en vez de dejarte adivinar.\n\n## Asistencia no es demanda\n\nCompara dos eventos de Barcelona del mismo feed:\n\n| | Smart City Expo | Manga Barcelona |\n|---|---|---|\n| Visitantes | 27.000 | 167.000 |\n| Roomnights | 63.061 | 74.226 |\n| Presión pico | 55,9 % | 48,3 % |\n| Concentración | near_venue (4,9 km) | mixed_city (7,2 km) |\n\nManga Barcelona atrae **seis veces más gente** y genera solo un poco más de roomnights, con menos presión y repartidas más por la ciudad. La razón está en el audience mix: **26.936 de sus asistentes son `local_no_stay`** — se van a dormir a casa. Un congreso de 27.000 delegados internacionales llena más habitaciones que una feria de 167.000 locales, y ese es justo el error en el que te mete leer una lista de \"los eventos más grandes\".\n\n## Los tipos que se comportan distinto\n\n- **`type: \"cruise\"`** añade un bloque `cruise` con la lista de escalas barco a barco: del 16 al 20 de octubre, **24 barcos, 81.232 pasajeros embarcando, 51.988 roomnights**, cada escala con su fecha, su barco y sus pax. Son noches de pre y post crucero, estimadas desde el calendario del puerto.\n- **`type: \"holiday\"`** es informativo y no lleva impacto hotelero. Hay además una ruta propia, `GET /v2/feed/events/{location_id}/holidays`, para festivos oficiales y vacaciones escolares de los mercados emisores.\n- Los eventos recurrentes traen un array `editions` con los años anteriores, para que compares esta edición con las dos últimas antes de fiarte de la previsión.\n\n## Qué pasa después\n\nFiltra con `min_impact` (de `high` para arriba suele ser el conjunto accionable) y `event_type`, y recorre el año con `from_date`/`to_date`. El maridaje natural es con el feed de mercado del destino: los eventos te dicen *cuándo* llega la demanda y *de qué tipo*, y el feed de búsqueda de destino te dice *a cuánto la está cobrando tu competencia*.","By the end you will be able to ask \"what is happening in Barcelona and how much hotel demand will it create\" and get an answer with **roomnights per day, pressure against the city's inventory, and where in the city those rooms will be booked**.\n\n**What you need:** the destination registered as a location on your account. That's it.\n\n**What it costs:** events are billed per location and per month, not per request. There is no import to launch and no schedule to configure — reading is the cheap part.\n\n## The one thing you have to do\n\nEvents is the odd one among the Feed APIs: **there is no import**. The dataset is produced by Veetal's own pipeline, city by city. Your side of the contract is a single step — tell us which city you care about.\n\nOn [Locations](https://dashboard.veetal.app/account/locations), **Add locations**, and search the destination. The dialog states the purpose in its own subtitle: *\"You will use them to search events in the destination\"*.\n\n![Four Barcelonas in four countries](/images-webp/recipes/add-a-city-to-see-its-events/01-location-finder.webp)\n\nBarcelona returns four candidates in four countries. Pick the wrong one and every event you read afterwards belongs to another city. Use **Show Map** if the name alone doesn't settle it.\n\n⚠️ The name must be the real destination name — renaming it returns error **`731`**.\n\n![The location registered, with its tier and coordinates](/images-webp/recipes/add-a-city-to-see-its-events/02-location-created.webp)\n\nThe row shows the tier and the coordinates the backend resolved. The `id` on that row is the `location_id` every events call takes.\n\nNotice what the page does **not** have for this API: no Imports tab, no Schedules tab, no import to run. The Events feed page has only **Locations**, **Events**, **Schedules** and **Requests**, and its Events tab carries five charts — by type, by audience type, evolution, monthly and by attendance.\n\n## Read the calendar\n\n`GET /v2/feed/events/{location_id}` with an optional date range and `min_impact`. Here is a real answer for Barcelona, trimmed to what matters:\n\n```json\n{\n  \"name\": \"Smart City Expo World Congress\",\n  \"acronym\": \"SCEWC\",\n  \"type\": \"fair_convention\",\n  \"subtype\": \"congress_technology\",\n  \"status\": \"verified\",\n  \"dates\": { \"start\": \"2026-11-03\", \"end\": \"2026-11-05\", \"duration_days\": 3 },\n  \"location\": {\n    \"venue\": \"Fira Barcelona - Recinte de Gran Via\",\n    \"address\": \"Av. Joan Carles I, 64, 08908 Barcelona, Spain\"\n  },\n  \"attendance\": { \"unique_visitors\": 27000, \"magnitude\": \"medium\" }\n}\n```\n\nThat much you could get from a listings site. The rest is what the dataset is actually for.\n\n## The part that prices rooms\n\n```json\n\"hotel_impact\": {\n  \"level\": \"high\",\n  \"score\": 0.559,\n  \"total_roomnights\": 63061,\n  \"booking_window\": { \"start\": \"2026-11-02\", \"end\": \"2026-11-06\" },\n  \"city_pressure\": {\n    \"city_inventory_rooms\": 40000,\n    \"peak_pressure_pct\": 0.5592,\n    \"avg_pressure_pct\": 0.3153,\n    \"peak_day\": \"2026-11-03\",\n    \"days_at_or_above_80pct\": 0\n  }\n}\n```\n\n**63.061 roomnights** across a city with **40.000 rooms**, peaking at **55,9 % of the entire inventory on 3 November**. Pressure percentages are fractions from 0 to 1, and they can exceed 1 — that means the event demands more rooms than the city has.\n\nNote the **booking window opens on 2 November**, the day *before* the congress starts. Delegates arrive the night before. If your rate calendar treats 2 November as an ordinary Monday, you have already left money on the table before the event begins.\n\nThen it breaks the demand down day by day:\n\n```json\n{\n  \"date\": \"2026-11-03\",\n  \"roomnights\": 22367,\n  \"pressure_pct\": 0.5592,\n  \"by_category\": { \"budget_hotels\": 1734, \"mid_range_hotels\": 12737, \"luxury_hotels\": 7896 },\n  \"by_profile\": { \"international_business\": 17290, \"national_business\": 4592, \"international_leisure\": 276 }\n}\n```\n\n**17.290 of those roomnights are international business.** That is a completely different guest — and a completely different price ceiling — from a leisure peak of the same size.\n\n## Where in the city, not just how many\n\n```json\n\"geographic_distribution\": {\n  \"weighted_radius_km\": 4.9,\n  \"concentration\": \"near_venue\",\n  \"shares\": { \"at_venue\": 0.092, \"near_venue\": 0.656, \"regional\": 0.025 },\n  \"rings\": {\n    \"2000-5000\": {\n      \"mid_range_hotels\": { \"roomnights\": 20073, \"impact\": \"high\" },\n      \"luxury_hotels\":    { \"roomnights\": 12909, \"impact\": \"high\" }\n    }\n  }\n}\n```\n\n**65,6 % of the demand lands near the venue**, with a weighted radius of 4,9 km, concentrated in mid-range and luxury hotels in the 2-5 km ring. If you are a mid-range hotel two kilometres from Fira Gran Via, this event is yours. If you are a budget hotel on the other side of the city, the same event barely moves you — and the dataset says so instead of leaving you to guess.\n\n## Attendance is not demand\n\nCompare two Barcelona events from the same feed:\n\n| | Smart City Expo | Manga Barcelona |\n|---|---|---|\n| Visitors | 27.000 | 167.000 |\n| Roomnights | 63.061 | 74.226 |\n| Peak pressure | 55,9 % | 48,3 % |\n| Concentration | near_venue (4,9 km) | mixed_city (7,2 km) |\n\nManga Barcelona draws **six times more people** and generates only marginally more roomnights, at lower pressure and spread wider across the city. The reason is in the audience mix: **26.936 of its attendees are `local_no_stay`** — they go home to sleep. A congress of 27.000 international delegates fills more hotel rooms than a fair of 167.000 locals, and this is exactly the mistake that reading a \"biggest events\" list gets you into.\n\n## The types that behave differently\n\n- **`type: \"cruise\"`** adds a `cruise` block with the ship-by-ship call list: for 16-20 October, **24 ships, 81.232 embarking passengers, 51.988 roomnights**, each call with its date, ship and pax. These are pre- and post-cruise nights, estimated from the port schedule.\n- **`type: \"holiday\"`** is informational and carries no hotel impact. There is also a dedicated route, `GET /v2/feed/events/{location_id}/holidays`, for official holidays and source-market school breaks.\n- Recurring events carry an `editions` array with previous years, so you can compare this edition against the last two before trusting the forecast.\n\n## What happens next\n\nFilter with `min_impact` (`high` and above is usually the actionable set) and `event_type`, and walk the year with `from_date`/`to_date`. The natural pairing is with the destination market feed: events tell you *when* demand arrives and *what kind*, the location search feed tells you *what your competitors are charging for it*.","Da de alta Barcelona como location y lee su calendario de eventos con la demanda hotelera pegada: roomnights por día, presión sobre las 40.000 habitaciones de la ciudad, y en qué anillo caen esas habitaciones.","## ¿Tengo que lanzar un import para tener eventos?\n\nNo, y no hay ninguno que lanzar. Events es la única API Feed sin import y sin pestaña de imports: el dataset lo construye el propio pipeline de Veetal, ciudad a ciudad. Tú das de alta la location y lees.\n\n## El endpoint me devuelve un array vacío. ¿Qué pasa?\n\nO la location no es de las que Veetal cubre todavía, o tu rango de fechas cae fuera de lo construido. Comprueba que la location es la correcta —Barcelona existe en cuatro países— y amplía from_date/to_date antes de concluir que no hay nada.\n\n## ¿Qué significa una presión por encima de 1?\n\nQue el evento necesita más habitaciones de las que tiene la ciudad. La presión se expresa como fracción de city_inventory_rooms de 0 a 1, y se le permite pasarse: es una estimación de demanda, no una lectura de ocupación. Todo lo que se acerque a 1 es una noche para tarificar con agresividad.\n\n## ¿Por qué un evento con más visitantes genera menos roomnights?\n\nPorque la asistencia cuenta personas y las roomnights cuentan camas. Mira el audience_mix: los asistentes clasificados como local_no_stay duermen en su casa. Manga Barcelona trae 167.000 visitantes pero 26.936 son locales, así que produce apenas más roomnights que un congreso internacional de 27.000 delegados.\n\n## ¿Para qué sirve la ventana de reserva?\n\nEs el rango de noches que el evento genera de verdad, y suele empezar antes que el propio evento — los delegados llegan la noche anterior. Esa primera noche es la que se le escapa a casi todos los calendarios de tarifas.\n\n## ¿Cómo sé si un evento afecta a mi hotel en concreto?\n\nUsa geographic_distribution. concentration y weighted_radius_km te dicen cómo de apretada está la demanda alrededor del recinto, y rings desglosa las roomnights por franja de distancia cruzada con categoría de hotel. Un evento near_venue a 4,9 km con impacto alto en gama media del anillo de 2 a 5 km es una propuesta muy distinta según dónde estés.","Mira la demanda hotelera que crean los eventos — Veetal","Un año de eventos de Barcelona con, para cada uno, roomnights totales, la ventana de reserva (que abre antes que el evento), presión diaria contra el inventario de la ciudad, el reparto por categoría de hotel y perfil de huésped, y la distribución geográfica por anillos.","add-a-city-to-see-its-events","## Do I have to launch an import to get events?\n\nNo, and there isn't one to launch. Events is the only Feed API with no import and no import tab: Veetal's own pipeline builds the dataset city by city. You register the location and read.\n\n## The endpoint returns an empty array. What's wrong?\n\nEither the location isn't one Veetal covers yet, or your date range falls outside what has been built. Check that the location is the right one — Barcelona exists in four countries — and widen from_date/to_date before concluding there is nothing there.\n\n## What does a pressure percentage above 1 mean?\n\nThat the event needs more rooms than the city has. Pressure is expressed as a fraction of city_inventory_rooms from 0 to 1, and it is allowed to go over: it is a demand estimate, not an occupancy reading. Anything approaching 1 is a night to price aggressively.\n\n## Why does an event with more visitors generate fewer roomnights?\n\nBecause attendance counts people and roomnights count beds. Look at audience_mix: attendees classed as local_no_stay sleep at home. Manga Barcelona brings 167.000 visitors but 26.936 of them are local, so it produces barely more roomnights than a 27.000-delegate international congress.\n\n## What is the booking window for?\n\nIt is the range of nights the event actually generates, and it usually starts before the event does — delegates arrive the night before. That first night is the one most rate calendars miss.\n\n## How do I know whether an event affects my hotel specifically?\n\nUse geographic_distribution. concentration and weighted_radius_km tell you how tight the demand is around the venue, and rings breaks the roomnights down by distance band crossed with hotel category. A near_venue event at 4,9 km with high impact on mid_range in the 2-5 km ring is a very different proposition depending on where you are.","anadir-ciudad-ver-eventos","https://dashboard.veetal.app/account/locations","Events is the only Feed API with no import to launch: Veetal builds the dataset city by city, and your side is one step — register the location. What comes back is not an agenda, it is a demand forecast per night, per guest profile and per distance ring.","## Register the city as a location\n\nOn Locations, Add locations, and search the destination. Barcelona returns four candidates in four countries — pick the right one, and keep the real destination name or you get error 731. The id on the row is the location_id every events call takes.\n\n## Note there is no import\n\nThe events Feed page has no Imports tab and nothing to launch. Veetal's pipeline builds the dataset city by city, and billing is per location per month rather than per request.\n\n## Read the calendar with its impact\n\nGET /v2/feed/events/{location_id} returns each event with hotel_impact: total roomnights, the booking window, and city pressure against the city's room inventory. Pressure is a 0-1 fraction and may exceed 1.\n\n## Break the demand down\n\nEach day carries by_category (budget, mid range, luxury) and by_profile (international business, leisure, local). A congress of 27.000 international delegates fills more rooms than a fair of 167.000 locals — read audience_mix before trusting attendance.\n\n## Find out if it is your event\n\ngeographic_distribution gives the weighted radius, the concentration and the roomnights per distance ring crossed with hotel category. That is what tells you whether an event lands on your hotel or on the other side of town.","curl \"https://api.veetal.app/v2/feed/events/YOUR_LOCATION_ID?min_impact=high&from_date=2026-10-01&to_date=2026-12-31\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"\n\n# festivos oficiales y vacaciones de mercados emisores:\ncurl \"https://api.veetal.app/v2/feed/events/YOUR_LOCATION_ID/holidays\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Añade una ciudad y mira la demanda que crean sus eventos","Events es la única API Feed sin import que lanzar: Veetal construye el dataset ciudad a ciudad y tu parte es un solo paso, dar de alta la location. Lo que vuelve no es una agenda, es una previsión de demanda por noche, por perfil de huésped y por anillo de distancia.","The year of events for a city, filtered to what is actually actionable. Swap the id for your location's.","El año de eventos de una ciudad, filtrado a lo que de verdad es accionable. Cambia el id por el de tu location.",{"id":369,"fields":1745},{"Minutes":1636,"Title_en":1746,"Datasets":1747,"Published":802,"Build_en":1748,"Needs_import":802,"Seo_description_en":1749,"Repo_url":1269,"Endpoint":1587,"Summary_en":1750,"Seo_title_en":1751,"Seo_description_es":1752,"Steps_es":1753,"Body_es":1754,"Body_en":1755,"Order":1756,"Repo_folder":1757,"Requires":1758,"Summary_es":1759,"Faqs_es":1760,"Import_service":1281,"Seo_title_es":1761,"Build_es":1762,"Date":1155,"Slug_en":1757,"Icon":1095,"Faqs_en":1763,"Slug_es":1764,"Dashboard_url":1765,"Import_entity":33,"Intro_en":1766,"Stack":1767,"Steps_en":1768,"Run_command":1769,"Curl":1770,"Layer":10,"Title_es":1771,"Intro_es":1772,"Kind":1167,"Call_text_en":1773,"Call_text_es":1774},"Put a reputation panel on your own website",[156],"A reputation panel in a shadow root: a headline score weighted across every OTA, a sentiment bar, category cards that only show a trend when the sample supports one, and the reviews with the hotel's replies — in light and dark, in Spanish and English.","Render your hotel's reputation on your own site: one score across every OTA, a sentiment split and category trends, with the guards that keep small samples honest.","One score built from every OTA your hotel is listed on, the sentiment split behind it, and which categories are actually moving — rendered on your own site, behind a proxy that keeps your API key private.","Reputation widget for your hotel website — Veetal","Pinta la reputación de tu hotel en tu propia web: una nota de todas las OTAs, el reparto de sentimiento y la tendencia por categorías, con las guardas que mantienen honestas las muestras pequeñas.","## Prepara el hotel\n\nDa de alta el hotel y mira Profiles Found: las OTAs que se detecten ahí son las que el widget puede mezclar. Lanza un import de Reputation con todas las OTAs que quieras en la media seleccionadas, y pon un schedule diario.\n\n## Pide todas las OTAs de una vez\n\nprovider es opcional en reputation y en reviews. Omítelo y una sola llamada devuelve todas las OTAs, con accommodation como lista. Mantén include_competitors=false, y recuerda que limit topa en 200 (400 con código 226 por encima).\n\n## Calcula lo que la API no devuelve\n\nEl sentimiento y las tendencias por categoría se derivan, no vienen dados. Reparte la puntuación de 0 a 10 en tramos para el sentimiento, pondera la nota principal por número de reseñas, y compara una ventana de 28 días contra la anterior para las tendencias.\n\n## Protege las tendencias\n\nEnseña flecha solo cuando las dos ventanas tengan al menos ocho puntuaciones y el movimiento sea de al menos un 1 %. Con datos reales salió un \"-4 %\" de 5 reseñas contra 2, y un solemne \"0 %\" de un movimiento del -0,3 %. La categoría que no pasa la guarda enseña solo su nota.\n\n## Píntalo tras un proxy\n\nLa API key se queda en tu servidor; el navegador solo habla con tu dominio. El widget se pinta en un Shadow DOM usando solo textContent, cachea quince minutos y sirve la última carga buena cuando falla un refresco.","Al terminar tendrás un panel de reputación en tu propia web: **una nota construida con todas las OTAs en las que está tu hotel, el reparto de sentimiento que hay detrás, qué categorías se están moviendo y las reseñas** — todo tras un proxy que mantiene tu API key en privado.\n\n**Qué necesitas:** la API **Feed · Reputation** instalada y activa, el hotel dado de alta y un import terminado.\n\n**Lo que cuesta:** nada por visita. Las lecturas Feed no se facturan por petición — los créditos se van en los imports que recogen los datos.\n\n## 1. Prepara el hotel\n\nDa de alta el hotel en [Accommodations](https://dashboard.veetal.app/account/accommodations) y mira **Profiles Found**: las OTAs que se detecten ahí son las que este widget puede mezclar. Un hotel con Booking, Google y Tripadvisor da un panel mucho mejor que uno solo con Google, y leerlo cuesta lo mismo.\n\nDespués ve a [Reputation → Accommodations](https://dashboard.veetal.app/feed-api/feed-reputation/entities) y lanza un import **con todas las OTAs que quieras en la media seleccionadas**, no solo una. Pon un schedule ya que estás; con una ejecución diaria el widget nunca enseña reseñas de más de 24 horas. El icono de copiar junto al hotel te da el **slug** con el que lo identifica la API.\n\n## 2. Pide todas las OTAs de una vez\n\nEl error que conviene evitar pronto: `provider` es **opcional** tanto en reputation como en reviews. Si filtras por él te llevas una OTA. Si lo omites te las llevas todas en una sola llamada — `accommodation` vuelve como lista, con una entrada por OTA.\n\n```\nGET /v2/feed/accommodation/{slug}/reputation\nGET /v2/feed/accommodation/{slug}/reviews?include_competitors=false&limit=200\n```\n\nDos cosas sobre esa segunda línea:\n\n- **`include_competitors` viene a `true` por defecto.** Si lo olvidas, tu propia web empieza a enseñar las reseñas de tu competencia.\n- **`limit` topa en 200.** Pide 500 y recibes un `400` con el código `226`. Dos ventanas de 28 días caben de sobra en las 200 reseñas más recientes.\n\nPruébalo en el [Playground](https://dashboard.veetal.app/developers/playground) antes de escribir código. En un hotel real, la llamada de reputación respondió tres fuentes a la vez:\n\n```json\n[\n  { \"provider\": \"booking\",     \"review_score\": 8.5, \"review_count\": 2468 },\n  { \"provider\": \"google\",      \"review_score\": 9.0, \"review_count\": 1691 },\n  { \"provider\": \"tripadvisor\", \"review_score\": 8.8, \"review_count\": 437 }\n]\n```\n\n## 3. Lo que te da la API y lo que tienes que calcular tú\n\nEsta es la parte que decide si el panel merece la pena. La API devuelve **puntuaciones, recuentos, notas por categoría y texto**. *No* devuelve un campo de sentimiento, y no devuelve \"la limpieza sube un 12 %\".\n\nAsí que el widget deriva cuatro cosas, y guarda todos los umbrales en un solo fichero (`insights.mjs`) para que las decisiones se vean en vez de quedar enterradas:\n\n| Derivado | Cómo | Umbral |\n|---|---|---|\n| **Nota principal** | Media de todas las OTAs, **ponderada por número de reseñas** | — |\n| **Sentimiento** | Tramos sobre la puntuación de 0 a 10 | positiva ≥ 9 · neutra 7-8,9 · negativa \u003C 7 |\n| **Nota por categoría** | Media por categoría en la ventana | 28 días |\n| **Tendencia** | Variación contra los 28 días anteriores | ≥ 8 muestras a cada lado, ≥ 1 % de movimiento |\n\n**Pondera la nota principal.** En el hotel de arriba, la media simple de 8,5, 9,0 y 8,8 es 8,77. Ponderada por número de reseñas es **8,71** — Booking tiene 2.468 reseñas y merece tirar más que las 437 de Tripadvisor. Una media sin ponderar deja que una OTA con nueve reseñas grite tan alto como una con dos mil.\n\n**Protege las tendencias o te mentirán.** Los dos umbrales de esa tabla salieron de datos reales, y los dos se añadieron después de ver al widget decir algo falso:\n\n- `cleanliness` tenía **5 puntuaciones en la ventana actual contra 2 en la anterior**. Da para escribir un \"−4 %\" y no da ni de lejos para sostenerlo. Un huésped tuvo una mala mañana.\n- `location` tenía unas sanas 47 contra 23 muestras y se movió un **−0,3 %**. Redondeado, la tarjeta pintaba un solemne \"↓0 %\" — una flecha apuntando a nada, que un hotelero lee como un problema donde no lo hay.\n\nUna categoría que no pasa alguna de las dos guardas sigue enseñando su nota. Simplemente no le crece una flecha.\n\n**Mezclar es lo que hace que las categorías valgan la pena.** Los nombres llegan ya normalizados —`location` significa lo mismo venga de Google o de Tripadvisor— pero cada OTA expone un subconjunto distinto. Tripadvisor devuelve `cleanliness`, `value_for_money` y `sleep_quality`; Google devuelve `service`, `location` y `rooms`. Mezcladas, te quedan siete categorías donde un widget de una sola OTA tiene tres.\n\n## 4. El proxy\n\nLa Connect API acepta peticiones cross-origin —devuelve `access-control-allow-origin: *`— así que tu página *podría* llamarla directamente desde el navegador. No lo hagas. La petición lleva tu `veetal-api-key`, y cualquiera que abra las devtools se va con ella y puede leer toda tu cuenta.\n\n**La API key no sale nunca de tu servidor.** El widget habla con tu dominio; tu dominio habla con Veetal.\n\n```javascript\nexport async function build() {\n  const [reputation, reviews] = await Promise.all([\n    // Sin filtro de provider: una entrada por OTA, que es lo que convierte esto\n    // de un widget de Google en un widget de reputación.\n    veetalOptional(`/feed/accommodation/${SLUG}/reputation`),\n    veetal(`/feed/accommodation/${SLUG}/reviews?include_competitors=false&limit=200`),\n  ]);\n\n  const own = (reputation && reputation.accommodation) || [];\n  const all = reviews.reviews || [];\n\n  const sources = own.map((entry) => ({\n    provider: entry.provider,\n    score: entry.review_score ?? null,\n    count: entry.review_count ?? null,\n  }));\n\n  return {\n    name: (own[0] && own[0].accommodation_name) || null,\n    window_days: WINDOW_DAYS,\n    headline: headline(sources),   // ponderada entre OTAs\n    sources,\n    sentiment: sentiment(all),     // todas las reseñas con nota, tengan texto o no\n    categories: categories(all).slice(0, 6),\n    reviews: all\n      .filter((r) => r.text && r.text.trim())  // el 27 % trae nota y ningún texto\n      .slice(0, 12)\n      .map(toCard),\n  };\n}\n```\n\nFíjate en qué población alimenta a qué: **el sentimiento y las tendencias usan todas las reseñas con nota**, incluido ese 27 % sin texto. La lista visible usa lo contrario. La misma carga, dos preguntas distintas.\n\nEl endpoint que va encima cachea quince minutos y, si un refresco falla, sirve la última carga buena — una página que funcionaba hace un minuto no puede quedarse en blanco porque haya fallado una llamada.\n\n## 5. El panel\n\nEl widget se renderiza en un Shadow DOM, así que la página anfitriona no puede colarse dentro ni él puede salirse. Todo se construye con `textContent`, nunca con `innerHTML`: son textos escritos por desconocidos pintados sobre una web comercial.\n\n![El widget con nota, sentimiento, tendencia por categoría y reseñas](/images-webp/recipes/google-reviews-widget/01-widget-light.webp)\n\nLa nota se lleva el espacio que merece, la línea de meta dice de qué está hecha —media, tres fuentes, 28 días— y la barra de sentimiento es una sola regla apilada en vez de una librería de gráficas. Debajo, las categorías: dos con movimiento real y cuatro enseñando su nota porque su muestra era demasiado fina para comparar. `Service ↓3 %` y `Rooms ↓3 %` son las dos únicas afirmaciones que los datos sostienen, y son las dos sobre las que un revenue manager debería actuar.\n\nSigue el esquema de color del sistema, y lo sigue también si el visitante lo cambia con la página abierta:\n\n![El mismo widget en modo oscuro](/images-webp/recipes/google-reviews-widget/02-widget-dark.webp)\n\n## 6. Empótralo\n\n```html\n\u003Cdiv id=\"reviews\">\u003C/div>\n\n\u003Cscript src=\"/veetal-reviews-widget.js\"\n        data-endpoint=\"/reviews-widget.json\"\n        data-target=\"#reviews\"\n        data-limit=\"5\"\n        data-locale=\"es\"\n        data-panel=\"full\"\n        data-theme=\"auto\">\u003C/script>\n```\n\n`data-panel` decide cuánto se ve: `full` es nota + sentimiento + temas + reseñas, `summary` es solo el panel (va bien en una barra lateral), `list` son solo las reseñas. `data-locale` elige el idioma de las etiquetas —`es` o `en`— y formatea los números, así que la nota se lee `4,36` en español y `4.36` en inglés.\n\n## Si algo sale mal\n\n| Qué ves | Qué significa | Qué hacer |\n|---|---|---|\n| `400` con código `226` | `limit` por encima de 200 | Pide 200 y pagina con `?page=2` si necesitas más |\n| `NoReviewsDataFound` (`785`) | No hay reseñas guardadas de ese hotel | Revisa sus perfiles y que haya terminado un import |\n| `NoReputationDataFound` (`784`) | El último import no trajo reputación | Es lo esperable tras una ejecución solo de reseñas. El panel degrada en vez de morirse |\n| Una sola fuente | Te has dejado `provider` en la petición | Quítalo — sin filtro entran todas las OTAs |\n| Reseñas de la competencia en tu web | `include_competitors` se quedó por defecto | Ponlo a `false` |\n| Todas las categorías con flecha | Has quitado las guardas | Devuélvelas. Las muestras pequeñas producen tonterías muy seguras de sí mismas |\n\n## Qué viene después\n\n- Añade `schema.org/AggregateRating` para que la nota combinada salga en los propios resultados de Google.\n- Sigue la nota principal en el tiempo llamando a `/reputation` con `import_date` y pinta un sparkline al lado.\n- Parte la barra de sentimiento por OTA — al mismo hotel se le suele leer muy distinto en Booking y en Tripadvisor, y ese hueco es en sí mismo un hallazgo.","By the end you will have a reputation panel on your own website: **one score built from every OTA your hotel is listed on, the sentiment split behind it, which categories are moving, and the reviews themselves** — all behind a proxy that keeps your API key private.\n\n**What you need:** the **Feed · Reputation** API installed and active, the hotel added, and one finished import.\n\n**What it costs:** nothing per page view. Feed reads are not billed per request — the credits go on the imports that collect the data.\n\n## 1. Get the hotel ready\n\nAdd the hotel in [Accommodations](https://dashboard.veetal.app/account/accommodations) and look at **Profiles Found**: whichever OTAs are detected there are the ones this widget can merge. A hotel with Booking, Google and Tripadvisor gives a far better panel than one with Google alone, and it costs the same to read.\n\nThen go to [Reputation → Accommodations](https://dashboard.veetal.app/feed-api/feed-reputation/entities) and launch an import **with every OTA you want in the average selected** — not just one. Set a schedule while you are there; with a daily run the widget always shows reviews less than 24 hours old. The copy icon next to the hotel gives you the **slug** the API identifies it by.\n\n## 2. Ask for every OTA at once\n\nThe mistake worth avoiding early: `provider` is **optional** on both reputation and reviews. Filter by it and you get one OTA. Omit it and you get all of them, in a single call — `accommodation` comes back as a list with one entry per OTA.\n\n```\nGET /v2/feed/accommodation/{slug}/reputation\nGET /v2/feed/accommodation/{slug}/reviews?include_competitors=false&limit=200\n```\n\nTwo things about that second line:\n\n- **`include_competitors` defaults to `true`.** Forget it and your own website starts showing your competitors' reviews.\n- **`limit` maxes out at 200.** Ask for 500 and you get `400` with code `226`. Two 28-day windows fit comfortably inside the 200 most recent reviews.\n\nRun it in the [Playground](https://dashboard.veetal.app/developers/playground) before writing any code. On a real hotel the reputation call answered three sources at once:\n\n```json\n[\n  { \"provider\": \"booking\",     \"review_score\": 8.5, \"review_count\": 2468 },\n  { \"provider\": \"google\",      \"review_score\": 9.0, \"review_count\": 1691 },\n  { \"provider\": \"tripadvisor\", \"review_score\": 8.8, \"review_count\": 437 }\n]\n```\n\n## 3. What the API gives you, and what you have to compute\n\nThis is the part that decides whether the panel is worth building. The API returns **scores, counts, per-category scores and text**. It does *not* return a sentiment field, and it does not return \"cleanliness is trending up 12%\".\n\nSo the widget derives four things, and keeps every threshold in one file (`insights.mjs`) so the choices are visible instead of buried:\n\n| Derived | How | Threshold |\n|---|---|---|\n| **Headline score** | Average of every OTA, **weighted by review count** | — |\n| **Sentiment** | Buckets over the 0-10 score | positive ≥ 9 · neutral 7-8.9 · negative \u003C 7 |\n| **Category score** | Mean per category over the trailing window | 28 days |\n| **Category trend** | Change against the previous 28 days | ≥ 8 samples each side, ≥ 1 % movement |\n\n**Weight the headline.** On the hotel above, the plain average of 8.5, 9.0 and 8.8 is 8.77. Weighted by review count it is **8.71** — Booking has 2.468 reviews and deserves to pull harder than Tripadvisor's 437. An unweighted average lets an OTA with nine reviews shout as loudly as one with two thousand.\n\n**Guard the trends, or they will lie to you.** Both thresholds in that table came from real data, and both were added after watching the widget say something false:\n\n- `cleanliness` had **5 scores in the current window against 2 in the previous one**. That is enough arithmetic to print \"−4 %\", and not remotely enough to mean it. One guest had a bad morning.\n- `location` had a healthy 47 against 23 samples and moved **−0.3 %**. Rounded, the card rendered a solemn \"↓0 %\" — an arrow pointing at nothing, which a hotelier reads as a problem where there is none.\n\nA category that fails either guard still shows its score. It just does not grow an arrow.\n\n**Merging is what makes the categories worth having.** The names arrive already normalised — `location` means the same thing whether it came from Google or Tripadvisor — but each OTA exposes a different subset. Tripadvisor returns `cleanliness`, `value_for_money` and `sleep_quality`; Google returns `service`, `location` and `rooms`. Merged, you get seven categories where a single-OTA widget gets three.\n\n## 4. The proxy\n\nThe Connect API accepts cross-origin requests — it returns `access-control-allow-origin: *` — so your page *could* call it straight from the browser. Do not. The request carries your `veetal-api-key`, and anyone who opens devtools walks away with it and can read your whole account.\n\n**The API key never leaves your server.** The widget talks to your domain; your domain talks to Veetal.\n\n```javascript\nexport async function build() {\n  const [reputation, reviews] = await Promise.all([\n    // No provider filter: one entry per OTA, which is what turns this from a\n    // Google widget into a reputation widget.\n    veetalOptional(`/feed/accommodation/${SLUG}/reputation`),\n    veetal(`/feed/accommodation/${SLUG}/reviews?include_competitors=false&limit=200`),\n  ]);\n\n  const own = (reputation && reputation.accommodation) || [];\n  const all = reviews.reviews || [];\n\n  const sources = own.map((entry) => ({\n    provider: entry.provider,\n    score: entry.review_score ?? null,\n    count: entry.review_count ?? null,\n  }));\n\n  return {\n    name: (own[0] && own[0].accommodation_name) || null,\n    window_days: WINDOW_DAYS,\n    headline: headline(sources),   // weighted across OTAs\n    sources,\n    sentiment: sentiment(all),     // every scored review, text or not\n    categories: categories(all).slice(0, 6),\n    reviews: all\n      .filter((r) => r.text && r.text.trim())  // 27% carry a score and no text\n      .slice(0, 12)\n      .map(toCard),\n  };\n}\n```\n\nNote which population feeds what: **sentiment and trends use every scored review**, including the 27 % with no text. The visible list uses the opposite. Same payload, two different questions.\n\nThe endpoint on top caches for fifteen minutes and, when a refresh fails, serves the last good payload — a page that worked a minute ago should not go blank because an API call did.\n\n## 5. The panel\n\nThe widget renders in a Shadow DOM, so the host page cannot bleed into it and it cannot bleed out. Everything is built with `textContent`, never `innerHTML`: these are texts written by strangers being rendered onto a commercial website.\n\n![The widget rendering score, sentiment, category trends and reviews](/images-webp/recipes/google-reviews-widget/01-widget-light.webp)\n\nThe score gets the room it deserves, the meta line says what it is made of — average, three sources, 28 days — and the sentiment bar is a single stacked rule rather than a chart library. Below it, the categories: two with a real movement, four showing their score because their sample was too thin to compare. `Service ↓3 %` and `Rooms ↓3 %` are the only two claims the data actually supports, and those are the two a revenue manager should act on.\n\nIt follows the system colour scheme, and keeps following it if the visitor switches while the page is open:\n\n![The same widget in dark mode](/images-webp/recipes/google-reviews-widget/02-widget-dark.webp)\n\n## 6. Embed it\n\n```html\n\u003Cdiv id=\"reviews\">\u003C/div>\n\n\u003Cscript src=\"/veetal-reviews-widget.js\"\n        data-endpoint=\"/reviews-widget.json\"\n        data-target=\"#reviews\"\n        data-limit=\"5\"\n        data-locale=\"en\"\n        data-panel=\"full\"\n        data-theme=\"auto\">\u003C/script>\n```\n\n`data-panel` decides how much shows: `full` is score + sentiment + topics + reviews, `summary` is the panel alone (good for a sidebar), `list` is the reviews alone. `data-locale` picks the label language — `es` or `en` — and formats the numbers, so the score reads `4,36` in Spanish and `4.36` in English.\n\n## If something goes wrong\n\n| What you see | What it means | What to do |\n|---|---|---|\n| `400` with code `226` | `limit` above 200 | Ask for 200 and page with `?page=2` if you need more |\n| `NoReviewsDataFound` (`785`) | No reviews stored for that hotel | Check its profiles and that an import has finished |\n| `NoReputationDataFound` (`784`) | The latest import brought no reputation | Expected after a reviews-only run. The panel degrades instead of dying |\n| One source only | `provider` left in the request | Drop it — unfiltered means every OTA |\n| Competitors' reviews on your page | `include_competitors` left at its default | Set it to `false` |\n| Every category showing an arrow | Guards removed | Put them back. Small samples produce confident nonsense |\n\n## What's next\n\n- Add `schema.org/AggregateRating` so the merged score shows up in Google's own results.\n- Track the headline over time by calling `/reputation` with `import_date` and drawing a sparkline next to it.\n- Split the sentiment bar by OTA — the same hotel is often read very differently on Booking and on Tripadvisor, and that gap is itself a finding.",9,"google-reviews-widget",[33,1088],"Una nota construida con todas las OTAs en las que está tu hotel, el reparto de sentimiento que hay detrás y qué categorías se están moviendo de verdad — pintado en tu propia web, tras un proxy que mantiene tu API key en privado.","## ¿La API devuelve una nota de sentimiento?\n\nNo. Devuelve reseñas y reputación: puntuaciones, recuentos, notas por categoría y texto. El sentimiento lo deriva el widget repartiendo la puntuación de 0 a 10 en tramos —positiva desde 9, negativa por debajo de 7— y esos umbrales son una decisión de producto, no un número de Veetal. Viven en un solo fichero para que puedas cambiarlos.\n\n## ¿Por qué mi nota principal es más baja que la media de mis OTAs?\n\nPorque está ponderada por número de reseñas. En un hotel real la media simple de 8,5, 9,0 y 8,8 era 8,77 y la ponderada 8,71: Booking tenía 2.468 reseñas frente a las 437 de Tripadvisor, así que tira más. Una media sin ponderar deja que una OTA casi vacía grite tan alto como una llena.\n\n## ¿Por qué unas categorías enseñan un porcentaje y otras solo un número?\n\nPorque un porcentaje necesita evidencia suficiente. Una categoría solo recibe flecha cuando las dos ventanas de 28 días tienen al menos ocho puntuaciones y el movimiento es de al menos un 1 %. Por debajo de eso enseña solo su nota. Caso real: limpieza comparaba 5 reseñas contra 2, que da para escribir un \"−4 %\" y no da ni de lejos para sostenerlo.\n\n## ¿Cómo consigo más de una OTA en el panel?\n\nDeja `provider` fuera de la petición. Es opcional tanto en reputation como en reviews, y sin filtro entran todas las OTAs que cubriera el último import — `accommodation` vuelve como lista con una entrada por cada una. Después asegúrate de que tu import seleccionó de verdad esas OTAs en el dashboard.\n\n## La llamada de reseñas responde 400 con código 226\n\n`limit` está topado en 200. Pide 200 y pagina con `?page=2` si necesitas más histórico. Dos ventanas de 28 días caben en las 200 reseñas más recientes de un hotel con tráfico normal.\n\n## ¿Puedo enseñar solo el panel, sin la lista de reseñas?\n\nSí: `data-panel=\"summary\"` pinta la nota, la barra de sentimiento y las categorías sin lista, que encaja en una barra lateral. `data-panel=\"list\"` hace lo contrario. El valor por defecto, `full`, lo enseña todo.","Widget de reputación para la web de tu hotel — Veetal","Un panel de reputación en un shadow root: una nota ponderada entre todas las OTAs, una barra de sentimiento, tarjetas de categoría que solo enseñan tendencia cuando la muestra la sostiene, y las reseñas con las respuestas del hotel — en claro y oscuro, en español e inglés.","## Does the API return a sentiment score?\n\nNo. It returns reviews and reputation: scores, counts, per-category scores and text. Sentiment is derived in the widget by bucketing the 0-10 score — positive from 9, negative below 7 — and those thresholds are a product decision, not a Veetal number. They live in one file so you can change them.\n\n## Why is my headline score lower than the average of my OTAs?\n\nBecause it is weighted by review count. On a real hotel the plain average of 8.5, 9.0 and 8.8 was 8.77, and the weighted one 8.71: Booking had 2.468 reviews against Tripadvisor's 437, so it pulls harder. An unweighted average lets a nearly empty OTA shout as loudly as a busy one.\n\n## Why do some categories show a percentage and others just a number?\n\nBecause a percentage needs enough evidence. A category only gets an arrow when both 28-day windows hold at least eight scores and the movement is at least 1%. Below that it shows its score alone. Real case: cleanliness compared 5 reviews against 2, which is enough arithmetic to print \"-4%\" and nowhere near enough to mean it.\n\n## How do I get more than one OTA in the panel?\n\nLeave `provider` out of the request. It is optional on both reputation and reviews, and unfiltered means every OTA the last import covered — `accommodation` comes back as a list with one entry each. Then make sure your import actually selected those OTAs in the dashboard.\n\n## The reviews call answers 400 with code 226\n\n`limit` is capped at 200. Ask for 200 and paginate with `?page=2` if you need more history. Two 28-day windows fit inside the 200 most recent reviews for a hotel with normal traffic.\n\n## Can I show only the panel, without the review list?\n\nYes: `data-panel=\"summary\"` renders the score, the sentiment bar and the categories with no list, which fits a sidebar. `data-panel=\"list\"` does the opposite. The default, `full`, shows everything.","widget-resenas-google","https://dashboard.veetal.app/feed-api/feed-reputation/entities","The API returns scores, counts, category scores and text. It does not return sentiment, and it does not return \"cleanliness is trending up\". This recipe builds both — and the two guards that stop a five-review sample from growing a confident arrow.","Node 20 · Express · vanilla JS · no build step","## Get the hotel ready\n\nAdd the hotel and look at Profiles Found: the OTAs detected there are the ones the widget can merge. Launch a Reputation import with every OTA you want in the average selected, and set a daily schedule.\n\n## Ask for every OTA at once\n\nprovider is optional on both reputation and reviews. Omit it and one call returns every OTA, with accommodation coming back as a list. Keep include_competitors=false, and remember limit maxes out at 200 (400 with code 226 above that).\n\n## Compute what the API does not return\n\nSentiment and category trends are derived, not given. Bucket the 0-10 score for sentiment, weight the headline by review count, and compare a 28-day window against the previous one for the trends.\n\n## Guard the trends\n\nOnly show an arrow when both windows hold at least eight scores and the movement is at least 1%. Real data produced a \"-4%\" from 5 reviews against 2, and a solemn \"0%\" from a -0.3% move. A category that fails either guard shows its score alone.\n\n## Render it behind a proxy\n\nThe API key stays on your server; the browser only talks to your domain. The widget renders in a Shadow DOM with textContent only, caches for fifteen minutes, and serves the last good payload when a refresh fails.","git clone https://github.com/Veetal-Connect/recipes.git\ncd recipes/google-reviews-widget\ncp .env.example .env          # put your VEETAL_API_KEY and slug in it\nnpm install\nnode --env-file=.env server.mjs   # http://localhost:8787","# todas las OTAs del hotel, una entrada por cada una\ncurl \"https://api.veetal.app/v2/feed/accommodation/YOUR_ACCOMMODATION_SLUG/reputation\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"\n\n# las reseñas: sin provider entran todas, y limit topa en 200\ncurl \"https://api.veetal.app/v2/feed/accommodation/YOUR_ACCOMMODATION_SLUG/reviews?include_competitors=false&limit=200\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Pon un panel de reputación en tu propia web","La API devuelve puntuaciones, recuentos, notas por categoría y texto. No devuelve sentimiento, y no devuelve \"la limpieza sube\". Esta receta construye las dos cosas — y las dos guardas que impiden que una muestra de cinco reseñas haga crecer una flecha muy segura de sí misma.","The two calls the panel is built on. No provider filter is what makes it multi-OTA; include_competitors=false is what keeps your competitors off your own website.","Las dos llamadas sobre las que se construye el panel. No filtrar por provider es lo que lo hace multi-OTA; include_competitors=false es lo que mantiene a tu competencia fuera de tu propia web.",{"id":169,"fields":1776},{"Prompt":1777,"Minutes":1150,"Title_en":1778,"Datasets":1779,"Published":802,"Build_en":1780,"Seo_description_en":1781,"Endpoint":1532,"Summary_en":1782,"Seo_title_en":1783,"Seo_description_es":1784,"Steps_es":1785,"Order":1786,"Requires":1787,"Summary_es":1788,"Faqs_es":1789,"Seo_title_es":1790,"Build_es":1791,"Date":1155,"Slug_en":1792,"Icon":1793,"Faqs_en":1794,"Slug_es":1795,"Intro_en":1796,"Steps_en":1797,"Curl":1798,"Layer":34,"Title_es":1799,"Intro_es":1800,"Kind":1103,"Call_text_en":1801,"Call_text_es":1802},"Using my Veetal Connect data, find the demand signals in the next 30 nights for my\nmarket.\n\nLook at availability across my comp set night by night, and tell me:\n- which nights are closing out — properties that had a rate and no longer do\n- whether that is one property (noise) or several (signal)\n- where the spikes cluster, and whether an event in the city explains them\n- any blackout pattern: dates nobody is selling, which usually means something\n  structural rather than demand\n\nIf my PMS reservations are imported, compare my own pace on those nights to the market\nand tell me where the gap is widest. If they are not imported, say so — do not guess at\nmy occupancy.\n\nRank the nights by how much I should care, and for the top three tell me what you would\ndo tonight. Be explicit about which signals are strong and which are one property away\nfrom being nothing.","Read the sold-out signals before your comp set does",[114],"A demand calendar built from what is left on sale rather than from what you have sold: which nights the market is closing out, where the spikes are forming, which dates have blackout patterns, and how your own pace compares — by source, if your PMS is imported.","Spot sold-out dates, blackout nights and demand spikes across your market from live availability — the pace signals that arrive before your own bookings.","Sold-out dates, blackout nights and demand spikes across the market — the pace signals your operators can see and you usually cannot.","Hotel Booking Analytics API — Sold-Out & Demand Signals — Veetal","Detecta fechas llenas, noches bloqueadas y picos de demanda en tu mercado desde la disponibilidad en vivo — las señales que llegan antes que tus propias reservas.","## Decide la ventana que importa\n\nLas señales de ritmo no valen nada a noventa días y valen oro a catorce. Elige la ventana en la que aún tienes palancas y deja de escanear más allá.\n\n## Lee el mercado, y luego léete a ti\n\nPrimero la disponibilidad del mercado, después tus propias reservas. El número interesante es la diferencia: noches en las que la ciudad se llena y tú no.\n\n## Vigila las desapariciones\n\nLa señal no es lo que está a la venta, es lo que ha dejado de estarlo. Una propiedad que sale del listado para una fecha vale más que cualquier tarifa que publicara.",16,[33,452],"Fechas llenas, noches bloqueadas y picos de demanda en el mercado — las señales de ritmo que ven tus operadores y tú normalmente no.","## ¿Necesito el PMS conectado?\n\nPara la parte de mercado no — la disponibilidad del comp set funciona solo con tu API key. El import del PMS añade tu propio ritmo y el desglose por origen, que es lo que convierte una señal de mercado en una decisión sobre tu inventario.\n\n## ¿Cómo de pronto es \"pronto\"?\n\nAntes que tu propia curva de reservas, que es de lo que se trata. Un mercado que se llena para una fecha que tú tienes abierta de par en par es un aviso que recibes días antes de que te lo dijeran las reservas.\n\n## ¿Una tarifa que falta es realmente un lleno?\n\nNormalmente sí, no siempre — una propiedad puede cerrar un canal o fallar una extracción. Trata una desaparición como ruido y un patrón en varias propiedades como señal.\n\n## ¿Puede explicar un pico?\n\nCrúzalo con eventos. Un grupo de noches llenas con un congreso debajo se precia distinto que el mismo grupo sin explicación — uno se repite el año que viene y el otro puede que no.","API de analítica de reservas hotelera — Señales de lleno y demanda — Veetal","Un calendario de demanda construido desde lo que queda a la venta y no desde lo que has vendido: qué noches se está llenando el mercado, dónde se forman los picos, qué fechas tienen patrones de bloqueo, y cómo va tu propio ritmo comparado — por origen, si importas tu PMS.","booking-analytics-signals","types/pms","## Does this need my PMS connected?\n\nNot for the market half — availability across the comp set works with nothing but your API key. The PMS import adds your own pace and the by-source split, which is what turns a market signal into a decision about your inventory.\n\n## How early is early?\n\nEarlier than your own booking curve, which is the point. A market closing out for a date you still have wide open is a warning you get days before the reservations would have told you.\n\n## Is a missing rate really a sold-out?\n\nUsually, not always — a property can close a channel or fail an extraction. Treat one disappearance as noise and a pattern across several properties as a signal.\n\n## Can it explain a spike?\n\nCross it with events. A cluster of sold-out nights with a congress underneath it prices differently from the same cluster with no explanation — one repeats next year, the other might not.","analitica-reservas-senales","Your PMS knows your pace. It knows nothing about the market's. By the time a spike shows up in your own bookings the rest of the city has already repriced, and the nights you sold cheap were the ones everyone else sold out of. Availability across the market is the earliest signal there is.","## Decide the window that matters\n\nPace signals are useless at ninety days and gold at fourteen. Pick the window where you still have levers and stop scanning beyond it.\n\n## Read the market, then read yourself\n\nMarket availability first, your own reservations second. The interesting number is the gap: nights where the city is filling and you are not.\n\n## Watch the disappearances\n\nThe signal is not what is priced, it is what stopped being priced. A property leaving the listing for one date is worth more than any rate it published.","curl \"https://api.veetal.app/v2/real-time/accommodation/YOUR_SLUG/availability/2026-10-01/2026-10-31/2\" \\\n  -H \"veetal-api-key: YOUR_API_KEY\"","Lee las señales de lleno antes que tu competencia","Tu PMS conoce tu ritmo. Del ritmo del mercado no sabe nada. Para cuando un pico aparece en tus propias reservas, el resto de la ciudad ya ha repreciado, y las noches que vendiste baratas eran justo las que todos los demás llenaron. La disponibilidad del mercado es la señal más temprana que existe.","Availability for a date range tells you what is still on sale. What is missing from the answer is the part worth reading.","La disponibilidad de un rango de fechas te dice qué sigue a la venta. Lo que falta en la respuesta es la parte que merece leerse.",{"data":1804,"body":1807,"excerpt":-1,"toc":2263},{"title":1805,"description":1806},"","Al terminar habrás lanzado una petición real contra Booking.com desde el navegador, habrás leído la respuesta y tendrás esa misma llamada funcionando en Postman.",{"type":1808,"children":1809},"root",[1810,1817,1828,1838,1845,1888,1897,1924,1930,1967,1984,1990,1998,2022,2034,2040,2069,2077,2111,2116,2154,2160,2165,2212,2245,2251],{"type":1811,"tag":1812,"props":1813,"children":1814},"element","p",{},[1815],{"type":1816,"value":1806},"text",{"type":1811,"tag":1812,"props":1818,"children":1819},{},[1820,1826],{"type":1811,"tag":1821,"props":1822,"children":1823},"strong",{},[1824],{"type":1816,"value":1825},"Qué necesitas:",{"type":1816,"value":1827}," una API real-time instalada y activa en tu cuenta y, para este ejemplo, un hotel ya dado de alta como alojamiento. Si todavía no tienes ninguno, salta al último paso: hay endpoints que no necesitan nada.",{"type":1811,"tag":1812,"props":1829,"children":1830},{},[1831,1836],{"type":1811,"tag":1821,"props":1832,"children":1833},{},[1834],{"type":1816,"value":1835},"Lo que cuesta:",{"type":1816,"value":1837}," 1 crédito esta petición. Las llamadas real-time se cobran por petición; una respuesta servida desde caché no cuesta nada.",{"type":1811,"tag":1839,"props":1840,"children":1842},"h2",{"id":1841},"_1-elige-la-api-y-el-endpoint",[1843],{"type":1816,"value":1844},"1. Elige la API y el endpoint",{"type":1811,"tag":1812,"props":1846,"children":1847},{},[1848,1850,1858,1860,1865,1867,1872,1874,1879,1881,1886],{"type":1816,"value":1849},"Abre el ",{"type":1811,"tag":1851,"props":1852,"children":1855},"a",{"href":1683,"rel":1853},[1854],"nofollow",[1856],{"type":1816,"value":1857},"Playground",{"type":1816,"value":1859},". El desplegable ",{"type":1811,"tag":1821,"props":1861,"children":1862},{},[1863],{"type":1816,"value":1864},"API",{"type":1816,"value":1866}," está agrupado en ",{"type":1811,"tag":1821,"props":1868,"children":1869},{},[1870],{"type":1816,"value":1871},"Real Time",{"type":1816,"value":1873},", ",{"type":1811,"tag":1821,"props":1875,"children":1876},{},[1877],{"type":1816,"value":1878},"Feed",{"type":1816,"value":1880}," y ",{"type":1811,"tag":1821,"props":1882,"children":1883},{},[1884],{"type":1816,"value":1885},"Account",{"type":1816,"value":1887},", y solo lista las APIs que tu cuenta tiene activas y con endpoints publicados.",{"type":1811,"tag":1812,"props":1889,"children":1890},{},[1891],{"type":1811,"tag":1892,"props":1893,"children":1896},"img",{"alt":1894,"src":1895},"El desplegable de API, agrupado por familia","/images-webp/recipes/first-realtime-call-playground/01-api-list.webp",[],{"type":1811,"tag":1812,"props":1898,"children":1899},{},[1900,1902,1907,1909,1914,1916,1922],{"type":1816,"value":1901},"Elige ",{"type":1811,"tag":1821,"props":1903,"children":1904},{},[1905],{"type":1816,"value":1906},"Booking Accommodation Rates",{"type":1816,"value":1908},". El selector ",{"type":1811,"tag":1821,"props":1910,"children":1911},{},[1912],{"type":1816,"value":1913},"ENDPOINT",{"type":1816,"value":1915}," de debajo se llena con los endpoints de esa API — aquí ",{"type":1811,"tag":1917,"props":1918,"children":1919},"em",{},[1920],{"type":1816,"value":1921},"Booking Accommodation Rates (by slug)",{"type":1816,"value":1923}," — y bajo él aparece la descripción de lo que devuelve. El icono de reloj que hay al lado abre el historial de tus últimas llamadas a ese endpoint.",{"type":1811,"tag":1839,"props":1925,"children":1927},{"id":1926},"_2-rellena-lo-que-te-pide",[1928],{"type":1816,"value":1929},"2. Rellena lo que te pide",{"type":1811,"tag":1812,"props":1931,"children":1932},{},[1933,1935,1940,1941,1946,1947,1952,1953,1958,1960,1965],{"type":1816,"value":1934},"Los campos se generan desde la definición del endpoint, así que cada uno pide exactamente lo suyo: ",{"type":1811,"tag":1821,"props":1936,"children":1937},{},[1938],{"type":1816,"value":1939},"SLUG",{"type":1816,"value":1873},{"type":1811,"tag":1821,"props":1942,"children":1943},{},[1944],{"type":1816,"value":1945},"CHECKIN",{"type":1816,"value":1873},{"type":1811,"tag":1821,"props":1948,"children":1949},{},[1950],{"type":1816,"value":1951},"CHECKOUT",{"type":1816,"value":1880},{"type":1811,"tag":1821,"props":1954,"children":1955},{},[1956],{"type":1816,"value":1957},"ADULTS",{"type":1816,"value":1959}," en este caso. Los campos que apuntan a una entidad llevan un botón ",{"type":1811,"tag":1821,"props":1961,"children":1962},{},[1963],{"type":1816,"value":1964},"+",{"type":1816,"value":1966}," que abre el diálogo de alta sin salir del playground.",{"type":1811,"tag":1812,"props":1968,"children":1969},{},[1970,1975,1977,1982],{"type":1811,"tag":1821,"props":1971,"children":1972},{},[1973],{"type":1816,"value":1974},"Show optional fields",{"type":1816,"value":1976}," despliega el resto — moneda, idioma, régimen, cancelación. ",{"type":1811,"tag":1821,"props":1978,"children":1979},{},[1980],{"type":1816,"value":1981},"Run request",{"type":1816,"value":1983}," sigue deshabilitado hasta que los obligatorios estén completos y, en los endpoints de escritura, hasta que el JSON del cuerpo sea válido.",{"type":1811,"tag":1839,"props":1985,"children":1987},{"id":1986},"_3-lánzala-y-lee-la-respuesta",[1988],{"type":1816,"value":1989},"3. Lánzala y lee la respuesta",{"type":1811,"tag":1812,"props":1991,"children":1992},{},[1993],{"type":1811,"tag":1892,"props":1994,"children":1997},{"alt":1995,"src":1996},"El formulario relleno, el cURL generado y la respuesta","/images-webp/recipes/first-realtime-call-playground/02-run-request.webp",[],{"type":1811,"tag":1812,"props":1999,"children":2000},{},[2001,2003,2008,2009,2014,2015,2020],{"type":1816,"value":2002},"Los chips que hay sobre la respuesta son la verdad de lo que ha pasado: ",{"type":1811,"tag":1821,"props":2004,"children":2005},{},[2006],{"type":1816,"value":2007},"HTTP 200",{"type":1816,"value":1873},{"type":1811,"tag":1821,"props":2010,"children":2011},{},[2012],{"type":1816,"value":2013},"6.7s",{"type":1816,"value":1873},{"type":1811,"tag":1821,"props":2016,"children":2017},{},[2018],{"type":1816,"value":2019},"3.4KB",{"type":1816,"value":2021},". Segundos, no milisegundos — Veetal está abriendo Booking.com por ti en ese momento, no leyendo una copia guardada. El cuerpo llega como un árbol JSON con buscador, botón de copiar y descarga del JSON.",{"type":1811,"tag":1812,"props":2023,"children":2024},{},[2025,2027,2032],{"type":1816,"value":2026},"El chip de créditos de la cabecera pasó de 761 a 762: ",{"type":1811,"tag":1821,"props":2028,"children":2029},{},[2030],{"type":1816,"value":2031},"un crédito",{"type":1816,"value":2033},".",{"type":1811,"tag":1839,"props":2035,"children":2037},{"id":2036},"_4-llévate-la-misma-llamada-a-postman",[2038],{"type":1816,"value":2039},"4. Llévate la misma llamada a Postman",{"type":1811,"tag":1812,"props":2041,"children":2042},{},[2043,2045,2050,2051,2056,2057,2062,2063,2068],{"type":1816,"value":2044},"La columna derecha es la misma petición en ",{"type":1811,"tag":1821,"props":2046,"children":2047},{},[2048],{"type":1816,"value":2049},"cURL",{"type":1816,"value":1873},{"type":1811,"tag":1821,"props":2052,"children":2053},{},[2054],{"type":1816,"value":2055},"Node.js",{"type":1816,"value":1873},{"type":1811,"tag":1821,"props":2058,"children":2059},{},[2060],{"type":1816,"value":2061},"PHP",{"type":1816,"value":1880},{"type":1811,"tag":1821,"props":2064,"children":2065},{},[2066],{"type":1816,"value":2067},"Python",{"type":1816,"value":2033},{"type":1811,"tag":1812,"props":2070,"children":2071},{},[2072],{"type":1811,"tag":1892,"props":2073,"children":2076},{"alt":2074,"src":2075},"El cURL generado, con la API key tapada","/images-webp/recipes/first-realtime-call-playground/03-curl-snippet.webp",[],{"type":1811,"tag":1812,"props":2078,"children":2079},{},[2080,2082,2087,2089,2094,2096,2101,2103,2109],{"type":1816,"value":2081},"Pulsa ",{"type":1811,"tag":1821,"props":2083,"children":2084},{},[2085],{"type":1816,"value":2086},"Copy",{"type":1816,"value":2088}," y en Postman usa ",{"type":1811,"tag":1821,"props":2090,"children":2091},{},[2092],{"type":1816,"value":2093},"Import → Raw text",{"type":1816,"value":2095},", pega y ",{"type":1811,"tag":1821,"props":2097,"children":2098},{},[2099],{"type":1816,"value":2100},"Continue",{"type":1816,"value":2102},". Te llega la petición con su URL, su query y la cabecera ",{"type":1811,"tag":1167,"props":2104,"children":2106},{"className":2105},[],[2107],{"type":1816,"value":2108},"veetal-api-key",{"type":1816,"value":2110}," ya puesta.",{"type":1811,"tag":1812,"props":2112,"children":2113},{},[2114],{"type":1816,"value":2115},"Dos cosas que conviene saber de ese snippet:",{"type":1811,"tag":2117,"props":2118,"children":2119},"ul",{},[2120,2137],{"type":1811,"tag":2121,"props":2122,"children":2123},"li",{},[2124,2129,2131,2135],{"type":1811,"tag":1821,"props":2125,"children":2126},{},[2127],{"type":1816,"value":2128},"Lleva tu API key real.",{"type":1816,"value":2130}," La pantalla la tapa y el icono del ojo la revela, pero ",{"type":1811,"tag":1821,"props":2132,"children":2133},{},[2134],{"type":1816,"value":2086},{"type":1816,"value":2136}," copia la de verdad. Trátala como una contraseña: no la pegues en un ticket, en una captura ni en una colección compartida.",{"type":1811,"tag":2121,"props":2138,"children":2139},{},[2140,2152],{"type":1811,"tag":1821,"props":2141,"children":2142},{},[2143,2145,2151],{"type":1816,"value":2144},"Incluye ",{"type":1811,"tag":1167,"props":2146,"children":2148},{"className":2147},[],[2149],{"type":1816,"value":2150},"no_cache=true",{"type":1816,"value":2033},{"type":1816,"value":2153}," El playground siempre fuerza llamada fresca para que veas dato vivo. Quita ese parámetro en tu integración y podrá reaprovecharse una respuesta reciente — más rápido, y no vuelve a cobrar.",{"type":1811,"tag":1839,"props":2155,"children":2157},{"id":2156},"_5-los-endpoints-que-no-necesitan-ninguna-entidad",[2158],{"type":1816,"value":2159},"5. Los endpoints que no necesitan ninguna entidad",{"type":1811,"tag":1812,"props":2161,"children":2162},{},[2163],{"type":1816,"value":2164},"No toda llamada real-time necesita algo dado de alta antes:",{"type":1811,"tag":2117,"props":2166,"children":2167},{},[2168,2185,2195],{"type":1811,"tag":2121,"props":2169,"children":2170},{},[2171,2175,2177,2183],{"type":1811,"tag":1821,"props":2172,"children":2173},{},[2174],{"type":1816,"value":247},{"type":1816,"value":2176}," — ",{"type":1811,"tag":1167,"props":2178,"children":2180},{"className":2179},[],[2181],{"type":1816,"value":2182},"GET /v2/real-time/flight/rate/airport/{origin}/{destination}/{departure_date}",{"type":1816,"value":2184}," se pide con dos códigos IATA y una fecha. No hay que crear nada.",{"type":1811,"tag":2121,"props":2186,"children":2187},{},[2188,2193],{"type":1811,"tag":1821,"props":2189,"children":2190},{},[2191],{"type":1816,"value":2192},"Search",{"type":1816,"value":2194}," — los endpoints de catálogo resuelven regiones, países, ciudades, aeropuertos y monedas, y son gratis.",{"type":1811,"tag":2121,"props":2196,"children":2197},{},[2198,2203,2204,2210],{"type":1811,"tag":1821,"props":2199,"children":2200},{},[2201],{"type":1816,"value":2202},"Booking search",{"type":1816,"value":2176},{"type":1811,"tag":1167,"props":2205,"children":2207},{"className":2206},[],[2208],{"type":1816,"value":2209},"GET /v2/real-time/booking/search/{type}/{name}",{"type":1816,"value":2211}," encuentra un hotel por su nombre y te da los identificadores que piden los demás endpoints.",{"type":1811,"tag":1812,"props":2213,"children":2214},{},[2215,2217,2223,2224,2230,2231,2237,2238,2244],{"type":1816,"value":2216},"Y los que sí piden un alojamiento siguen la misma forma que esta receta: ",{"type":1811,"tag":1167,"props":2218,"children":2220},{"className":2219},[],[2221],{"type":1816,"value":2222},"/reputation/booking",{"type":1816,"value":1873},{"type":1811,"tag":1167,"props":2225,"children":2227},{"className":2226},[],[2228],{"type":1816,"value":2229},"/reviews/booking",{"type":1816,"value":1873},{"type":1811,"tag":1167,"props":2232,"children":2234},{"className":2233},[],[2235],{"type":1816,"value":2236},"/availability/booking/{from}/{to}/{adults}",{"type":1816,"value":1873},{"type":1811,"tag":1167,"props":2239,"children":2241},{"className":2240},[],[2242],{"type":1816,"value":2243},"/parity/{checkin}/{checkout}/{adults}",{"type":1816,"value":2033},{"type":1811,"tag":1839,"props":2246,"children":2248},{"id":2247},"qué-pasa-después",[2249],{"type":1816,"value":2250},"Qué pasa después",{"type":1811,"tag":1812,"props":2252,"children":2253},{},[2254,2256,2261],{"type":1816,"value":2255},"Cada llamada que haces se guarda. Abre la API desde el menú lateral y su pestaña ",{"type":1811,"tag":1821,"props":2257,"children":2258},{},[2259],{"type":1816,"value":2260},"Requests",{"type":1816,"value":2262}," te enseña la gráfica diaria y horaria más la tabla de peticiones: parámetros, respuesta, duración, créditos y si vino de caché. Desde ahí puedes repetir cualquiera en el playground — lo que vuelve a cobrar salvo que responda la caché.",{"title":1805,"searchDepth":1183,"depth":1183,"links":2264},[2265,2266,2267,2268,2269,2270],{"id":1841,"depth":1183,"text":1844},{"id":1926,"depth":1183,"text":1929},{"id":1986,"depth":1183,"text":1989},{"id":2036,"depth":1183,"text":2039},{"id":2156,"depth":1183,"text":2159},{"id":2247,"depth":1183,"text":2250},1787816729234]