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.

Qué vas a construir
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.
Cómo funciona
- 01Por qué el compset no es opcional
- 02Da de alta el hotel
- 03Mira qué perfiles ha encontrado
- 04El slug no es el nombre
- 05Engancha hasta diez competidores
- 06Lee el compset desde la API
- 07Qué viene después
Paso a paso
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.
Qué necesitas: una API key de Veetal. Nada más: los endpoints de account son gratis y funcionan con cualquier key.
Qué cuesta: nada en el dashboard. 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.
Por qué el compset no es opcional
Los 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:
- 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. - La reputación trae un bloque
competitorsjunto al de tu hotel, que llega vacío si el compset lo está. - Las reseñas incluyen el compset por defecto (
include_competitorsvaletrue): las suyas vienen en la misma listareviewsque las tuyas, cada una marcada conaccommodation_slugeis_primary. Con el compset vacío todas son tuyas: una lectura en solitario, no un benchmark. - La parrilla de tarifas en vivo es una llamada por establecimiento del compset. Sin compset no hay parrilla.
La paridad es la excepción: compara lo que cuesta tu propio hotel en cada canal, así que no usa el compset.
Esta 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.
1. Da de alta el hotel
En Accommodations, Add accommodations. El asistente abre con tres caminos:
- Search Booking accommodation — el habitual.
- I have accommodation Booking URL — para cuando la búsqueda es ambigua y ya tienes la ficha abierta.
- Import accommodations from .csv/.xls file — la vía en bloque, y la forma sensata de cargar una cartera.
Busca por nombre. Los resultados traen la foto y la ciudad del hotel, y vienen etiquetados:
- It's yours — ya es uno de tus alojamientos. Sale en gris, que te ahorra el duplicado.
- Is competitor — cuando estás añadiendo competidores, ya es uno de los de este hotel.
- Is existing — ya está en tu cuenta, como competidor de otro de tus hoteles. Al añadirlo se reutiliza esa entidad en vez de crear un duplicado, y por eso resuelve al instante.
Si no encuentras nada, usa menos palabras: la búsqueda casa con Booking de forma aproximada, no con tu cadena exacta.
2. Mira qué perfiles ha encontrado
Elige 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.
Ese 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.
Una vez añadido, la columna SETUP de la fila mantiene ese mapa de perfiles, una insignia por OTA.
3. El slug no es el nombre
El slug que asigna Veetal sale de la URL de Booking, no del nombre visible. "Ohla Barcelona" se quedó en ohla.
Todos 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.
4. Engancha hasta diez competidores
Abre 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.
Dos cosas deciden si este paso sirve de algo:
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.
Qué cuesta cada uno. El tope son diez, y es un tope por algo: cada competidor multiplica el coste de los imports de tarifas, reputación y reseñas: un hotel con 5 competidores cuenta como 6. Reputación y reseñas cuentan además cada OTA, así que 5 competidores en 3 OTAs son 18 fichas por ejecución, no 3. Las tarifas son solo de Booking, y la paridad solo lee tu hotel. El dashboard enseña la estimación de créditos antes de lanzar una importación — léela ahí, no en la factura.

5. Lee el compset desde la API
GET /v3/account/accommodation/{accommodation_id}/competitors
Gratis, como el resto de la Account API. {accommodation_id} es el id interno de tu hotel, no su slug: GET /v3/account/accommodation lista tus hoteles con el slug como clave y el id dentro de cada entrada.
La respuesta es un array, un objeto por competidor: id, name, location y otas, con el slug de Booking en otas.booking.slug y los identificadores de las demás OTAs en las que se encontró. Para los feeds casi nunca necesitas esos slugs: tarifas y reputación se leen con el slug de tu hotel y traen el compset en la misma respuesta. Donde sí importan es en una parrilla de tarifas en vivo, que recorre el compset: una llamada para traerlo y luego una llamada de tarifa por establecimiento.
Para añadir competidores, POST a la misma ruta con un array booking_urls; DELETE sobre …/competitors/{competitor_id} quita uno:
curl -X POST "https://api.veetal.app/v3/account/accommodation/YOUR_ACCOMMODATION_ID/competitors" \
-H "veetal-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "booking_urls": ["https://www.booking.com/hotel/es/TU_COMPETIDOR.html"] }'
Qué viene después
El 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.
Dos 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, y lo que escribieron los imports anteriores sigue legible hasta que caduca (las tarifas, la paridad, la reputación, las búsquedas de ubicación y los vuelos se guardan 15 días; las reseñas, los eventos y la demanda de mercado no se borran). Es lo correcto para un hotel que has dejado de gestionar, y bastante mejor que borrarlo.
Preguntas
¿Cuántos competidores puedo añadir?
Diez por hotel, contando los que ya tiene. El tope es a propósito: cada competidor multiplica el coste de los imports de tarifas, reputación y reseñas, y un compset de treinta hoteles no es un compset — es la ciudad.
¿Los competidores gastan créditos por sí solos?
No. Crearlos y resolverlos contra Booking es gratis. Lo que cambian es el tamaño de cada trabajo posterior: un import de tarifas cubre el hotel más su compset en Booking, uno de reputación o de reseñas los cubre en todas las OTAs con perfil, y una parrilla de tarifas en vivo es una llamada por establecimiento. Por API, encontrar los perfiles de un competidor en las demás OTAs es una llamada aparte, y esa sí se cobra (mira la pregunta siguiente).
Mi informe de tarifas solo trae mi hotel. ¿Qué pasa?
Que 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.
¿Puedo montar el compset por API?
Sí. El conjunto entero tiene endpoints: GET y POST sobre /v3/account/accommodation/{accommodation_id}/competitors, y DELETE sobre /v3/account/accommodation/{accommodation_id}/competitors/{competitor_id}. El POST acepta un array booking_urls de fichas de Booking.com y resuelve cada una por ti. Suma al compset en vez de sustituirlo, y el tope de diez cuenta los competidores que ya hay: pasarse responde con el error 730. La petición está en el paso 5, más arriba. Tres 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. Solo acepta URLs de Booking: para convertir un nombre en una, GET /v3/real-time/booking/search/hotel/{name} busca en Booking, y es una petición Real Time de pago. Y un competidor añadido así solo se resuelve en Booking: sus perfiles en las demás OTAs salen de POST /v3/account/accommodation/{competitor_id}/otas, que se cobra según las OTAs que rellena. 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.
La búsqueda marca un hotel como Is existing. ¿Qué significa?
Que ya está en tu cuenta, como competidor de otro de tus hoteles. Al añadirlo otra vez se reutiliza esa entidad en vez de crear un duplicado, y por eso resuelve al instante. Solo mira tu cuenta: aquí no aparece nada de lo que siguen otros clientes, y ellos no ven nada de lo tuyo.
¿Borro un hotel que he dejado de gestionar?
Desactívalo. Una entidad desactivada deja de importarse —y por tanto de gastar créditos—, y lo que escribieron los imports anteriores sigue legible hasta que caduca (las tarifas, la paridad, la reputación, las búsquedas de ubicación y los vuelos se guardan 15 días; las reseñas, los eventos y la demanda de mercado no se borran).
Construye el tuyo
Empieza gratis con 1.000 créditos de API. Sin tarjeta ni llamada comercial.
¿Qué quieres construir con competidores?
Dilo en una línea y te devolvemos el prompt, la receta si ya existe y las APIs sobre las que corre, empezando por competidores.