Ada Vegas Travel
EnglishEspañolTürkçe
API para agencias y mayoristas

Venda los tours de Ada Vegas en su propia web

Una API REST simple y segura: liste nuestros tours, obtenga precios exactos, cree reservas y siga su estado, todo contra su saldo de crédito prepagado. Ada Vegas recibe aviso de cada venta en tiempo real.

¿Quiere trabajar con nosotros? Probar la API Leer la documentación
URL base: https://api.adavegastravel.com/v1
Catálogo en vivo

Tours, temporadas, precios de niños, límites de grupo, hoteles, guías y fotos en TR / EN / ES.

Cotizaciones exactas

Una llamada devuelve el precio final según fechas, adultos, niños y habitaciones. Siempre igual que la reserva.

Crédito prepagado

Cada venta se descuenta de su saldo. Recargue con tarjeta en su portal cuando quiera.

Webhooks y sandbox

Webhooks firmados por cada cambio de reserva y una clave sandbox gratuita para probar de principio a fin.

Empiece en 4 pasos

  1. Entre al portal de clientes y abra API e integración.
  2. Cree una clave Sandbox y pruebe los ejemplos de más abajo.
  3. Cree una clave de producción, restrínjala a las IP de su servidor y añada una URL de webhook.
  4. Recargue su saldo y publique. Ada Vegas confirma las reservas, o al instante si tiene la aprobación automática activada.

Recursos

Portal de clientes →

Claves, saldo, reservas y registro de peticiones

Documentación de la API →

Referencia completa, ejemplos y códigos de error

Web lista para usar →

Una web de viajes solo front-end para su propio hosting: consulte con su responsable de cuenta o abra “Mi web” en el portal.

Webhooks →

Eventos, contenido y verificación de firma

Pruebe la API ahora

Demo pública: no necesita cuenta. Devuelve tours de ejemplo y nunca toca datos reales. Elija una petición, edítela si quiere y pulse Enviar. Las reservas que cree aquí se pueden consultar y cancelar, igual que en la API real.

X-Api-Key: demo-key-adavegas
X-Api-Secret: demo-secret-adavegas
Respuesta: —
{}
¿Quiere trabajar con nosotros?

¿Aún no es socio? Cuéntenos sobre su agencia o empresa y le responderemos con su cuenta, precios y acceso a la API.

Escríbanos · info@adavegastravel.com

Documentación

1. Resumen

La Partner API es una API REST JSON sobre HTTPS. Todo lo que puede hacer en su portal de cliente (ver tours, cotizar, reservar, cancelar, consultar saldo) está disponible por programación.

Su web lista tours→El viajero elige fecha y pax→GET /quote precio exacto→POST /bookings→Se descuenta de su crédito→Confirmada (al instante o por Ada Vegas)→Webhook a usted

2. Inicio rápido

  1. En su portal abra API e integración → Claves y cree una clave. Cree primero una clave Sandbox para probar sin ningún cargo. El secreto se muestra una sola vez.
  2. Opcionalmente restrinja la clave a las IP de su servidor (IP de confianza).
  3. Llame a la API:
curl "https://api.adavegastravel.com/v1/services?date=2026-11-10&pax=2" \
  -H "X-Api-Key: YOUR_KEY" \
  -H "X-Api-Secret: YOUR_SECRET" \
  -H "Accept-Language: es"

URL base: https://api.adavegastravel.com/v1. ¿Aún sin cuenta? Pruebe todo ahora mismo con las credenciales demo públicas: clave demo-key-adavegas, secreto demo-secret-adavegas. Sus claves propias de producción y sandbox se emiten al aprobar su cuenta.

Ejemplo completo: cotizar, reservar, consultar

# 1. precio exacto para 2 adultos + 1 niño
curl "$BASE/services/12/quote?date=2026-11-10&pax=2&children=1" -H "X-Api-Key: $KEY" -H "X-Api-Secret: $SECRET"

# 2. crear la reserva (se puede reintentar gracias a la clave de idempotencia)
curl -X POST "$BASE/bookings" \
  -H "X-Api-Key: $KEY" -H "X-Api-Secret: $SECRET" \
  -H "Content-Type: application/json" \
  -H "X-Idempotency-Key: order-10045" \
  -d '{"service_id":12,"pax":2,"children":1,"service_date":"2026-11-10",
       "customer_name":"Ana Pérez","customer_email":"ana@example.com",
       "customer_phone":"+34600111222","notes":"Vegetariana"}'

# 3. después: estado
curl "$BASE/bookings/AB-2026-8DB0391E" -H "X-Api-Key: $KEY" -H "X-Api-Secret: $SECRET"

3. Autenticación y seguridad

CabeceraValor
X-Api-KeySu clave pública
X-Api-SecretSu secreto (se guarda cifrado en nuestro lado; no se puede recuperar, solo regenerar)

4. Convenciones

TemaRegla
FormatoJSON, UTF-8. Envíe Content-Type: application/json en los POST.
Éxito{"data": ...} (las listas añaden "meta")
Error{"error": {"code": "...", "message": "..."}}. Base su lógica en code; message es texto para personas (actualmente en turco) y puede cambiar.
FechasYYYY-MM-DD. Las marcas de tiempo son ISO-8601 (2026-10-26T10:44:12+00:00).
IdiomaAccept-Language: tr | en | es elige el idioma de nombres y descripciones (por defecto tr).
MonedasTRY, USD, EUR. Los importes son decimales con 2 decimales.
Paginaciónpage (desde 1), per_page (1–100, por defecto 25). meta: {page, perPage, total, totalPages}
Límite de uso60 peticiones / minuto / clave (ventana deslizante). Las peticiones que fallan la autenticación se cuentan por IP: tras 10 fallos en un minuto esa IP recibe 429 durante el resto del minuto, incluso con una clave válida. 429 incluye la cabecera Retry-After (segundos).
IdempotenciaEnvíe X-Idempotency-Key (máx. 128 caracteres) en POST /bookings. Repetirla con la misma clave en 24 h devuelve la respuesta original y no crea nada nuevo, de modo que los reintentos de red no duplican reservas ni cargos. Use una clave única por pedido.
VersiónToda respuesta incluye X-Api-Version: 1. Los cambios aditivos (campos nuevos) no cambian la versión: ignore los campos desconocidos.

5. Crédito y saldo

Cada venta se paga con su saldo prepagado (en la moneda de su cuenta: TRY, USD o EUR).

Consulte credit.can_confirm en GET /me, GET /balance o en la respuesta de la reserva para saber si las nuevas reservas se confirmarán.

6. Ciclo de la reserva

EstadoSignificado
pendingRecibida y descontada, a la espera de confirmación (personal de Ada Vegas, aprobación automática o usted en reservas de su web).
confirmedGarantizada. Hotel, guía y programa los organiza Ada Vegas.
cancelledCancelada; el importe se reembolsa a su saldo si se canceló estando pendiente.

Cambios permitidos: pending → confirmed, pending → cancelled, confirmed → cancelled (las cancelaciones de reservas confirmadas las gestiona Ada Vegas; contáctenos). Cada cambio dispara un webhook.

Canales (campo channel): api (su integración), portal (hechas en el portal), site (hechas desde su propia web, vea la sección 12; usted las confirma en su portal).

7. Precios y cotizaciones

8. Endpoints

GET/me

Su cuenta, moneda, estado del webhook y resumen de crédito.

{"data":{"id":22,"name":"Su Agencia","status":"active","currency":"EUR","sandbox":false,
 "contact":{"name":"...","email":"...","phone":null},"webhook_configured":false,
 "credit":{"balance":825.28,"currency":"EUR","credit_limit":0,"available":825.28,"can_confirm":true}}}
GET/rates

Tipos de cambio usados en las conversiones (base TRY).

{"data":{"base":"TRY","rates":{"USD":32.1,"EUR":35.2,"TRY":1},"supported":["TRY","USD","EUR"]}}
GET/categories

Categorías de tours disponibles para usted, con la definición de sus campos adicionales (key, label, type, required, options).

GET/services

Tours que puede vender, con su precio para una fecha.

ParámetroDescripción
dateFecha de viaje usada para elegir la temporada (por defecto hoy)
paxPasajeros para el total indicativo (por defecto 1)
currencyTRY|USD|EUR conversión de visualización del precio de lista
category_id, qFiltrar por categoría / buscar en nombre y descripción
page, per_pagePaginación

Cada tour contiene:

CampoNotas
id, name, duration_days, category, description, description_htmlNombre y descripción según Accept-Language
pricingaudience (agencia o mayorista), applicable (temporada de su fecha: season, start_date, end_date, currency, price, child_price, min_pax, max_pax) y todas las seasons
accommodationSolo en tours con noches de hotel: stays[] (hotel, start_day, nights, rooms) y options[] (precio por habitación según ocupación), o null
guidesNombre e idiomas del guía
contentcover_image, gallery[], includes_html, excludes_html, hotel_category_html, important_notes_html, cancellation_policy_html, transfer_details_html, domestic_flight_html, museum_entries_html, child_age_html
fields[]Atributos propios de la categoría
Los campos HTML están saneados y son seguros para mostrar. Las URL de imagen son absolutas.
GET/services/{id}

Un tour, con la misma estructura. 404 service_not_found si no existe o no está disponible para usted.

GET/services/{id}/quote
ParámetroDescripción
dateFecha de viaje
paxAdultos
childrenNiños (se cobran a child_unit)
occupancy, roomsTours con alojamiento
{"data":{"ok":true,"date":"2026-10-29","pax":2,"children":1,"min_pax":null,"max_pax":null,
 "currency":"EUR","season":"Otoño 2026",
 "tour":{"unit":58.24,"child_unit":58.24,"total":174.72},
 "options":[],"accommodation":null,"total":174.72}}

Con alojamiento, options lista {occupancy,label,per_room} y accommodation devuelve la opción elegida con el desglose breakdown por hotel; total = tour + alojamiento. Errores: 422 con no_price_for_date, pax_below_min / pax_above_max (más limit), invalid_occupancy, no_accommodation_price.

POST/bookings
CampoDescripción
service_idobligatorioId del tour
paxobligatorioAdultos, 1–500
childrenopcional0–500
service_dateobligatorioYYYY-MM-DD, hoy o posterior (fechas pasadas → 422 date_in_past)
occupancy, roomssi el tour tiene alojamientoSin occupancy → 422 occupancy_required
customer_name, customer_email, customer_phoneopcionalSu viajero (máx. 190 / 190 / 50 caracteres)
notesopcionalMáx. 2000 caracteres (dieta, hotel de recogida, ...)
channel, customer_langsolo webVea la sección 12

Devuelve 201:

{"data":{"booking_ref":"AB-2026-8DB0391E","service_id":1,"service_name":"Istanbul Classics",
  "pax":2,"children":1,"currency":"EUR","unit_price":58.24,"total_price":174.72,
  "service_date":"2026-10-29","customer_name":"Ana Pérez","status":"confirmed",
  "sandbox":false,"channel":"api","sale_total":null,"customer_lang":null,
  "credit_charged":"174.72","hold_reason":null,"created_at":"2026-10-26T10:44:12+00:00"},
 "credit":{"balance":825.28,"currency":"EUR","credit_limit":0,"available":825.28,"can_confirm":true}}

credit_charged es el importe descontado en la moneda de su cuenta. status es confirmed de inmediato solo si tiene activada la aprobación automática y su crédito alcanza; si no, pending (revise hold_reason).

GET/bookings

Sus reservas, las más recientes primero. Filtros: status (pending|confirmed|cancelled), customer_email, channel (api|portal|site), from / to (fecha de creación), page, per_page.

GET/bookings/{booking_ref}

Una reserva (misma estructura). 404 booking_not_found.

POST/bookings/{booking_ref}/cancel

Cancela una reserva pendiente y devuelve el importe completo a su saldo. Una reserva confirmada devuelve 409 not_cancellable: contacte con Ada Vegas.

GET/balance

Resumen del saldo y últimos movimientos (?limit=1..100, por defecto 20).

{"data":{"balance":825.28,"currency":"EUR","credit_limit":0,"available":825.28,"can_confirm":true,
 "transactions":[
  {"type":"charge","amount":-174.72,"currency":"EUR","balance_after":825.28,"booking_ref":"AB-2026-8DB0391E","reference":null,"created_at":"..."},
  {"type":"topup","amount":1000,"currency":"EUR","balance_after":1000,"booking_ref":null,"reference":"BANK-2210","created_at":"..."}]}}

Tipos: topup (+), charge (−), refund (+), adjust (±, corrección manual de Ada Vegas).

GET/site

Configuración de su web tal como la definió en el portal (nombre, idiomas, colores, páginas, qué tours se muestran y su margen). La usa el paquete web listo para usar; 404 site_disabled hasta que publique. Vea la sección 12.

9. Webhooks

En lugar de consultar periódicamente, configure una URL de webhook en el portal (API e integración → Webhook). Se genera un secreto de firma para usted.

EventoCuándo
booking.createdSe creó una reserva (también por su propia llamada API)
booking.confirmedConfirmada (aprobación automática, personal de Ada Vegas o usted)
booking.cancelledCancelada (se aplica el reembolso si estaba pendiente)
POST https://your-site.example/hooks/adavegas
Content-Type: application/json
X-Agency-Webhook-Event: booking.confirmed
X-Agency-Webhook-Signature: sha256=3b1f...e9

{"event":"booking.confirmed","booking_ref":"AB-2026-8DB0391E","status":"confirmed",
 "service_id":1,"service_name":"Istanbul Classics","customer_name":"Ana Pérez","customer_email":"ana@example.com",
 "channel":"api","credit_charged":"174.72","pax":2,"children":1,"service_date":"2026-10-29",
 "currency":"EUR","total_price":174.72,"sandbox":false,"occurred_at":"2026-10-26T10:44:12+00:00"}

Verificar la firma

Firma = HMAC-SHA256(cuerpo crudo de la petición, secreto del webhook), en hexadecimal, con el prefijo sha256=. Compare en tiempo constante y use el cuerpo crudo, no un JSON recodificado.

// PHP
$raw = file_get_contents('php://input');
$expected = 'sha256=' . hash_hmac('sha256', $raw, $secret);
if (!hash_equals($expected, $_SERVER['HTTP_X_AGENCY_WEBHOOK_SIGNATURE'] ?? '')) { http_response_code(401); exit; }

// Node.js (Express, con express.raw({type:'application/json'}))
const crypto = require('crypto');
const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(req.body).digest('hex');
const ok = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(req.get('X-Agency-Webhook-Signature') || ''));

Entrega

10. Sandbox

Cree una clave Sandbox en el portal. Se comporta como producción pero: las reservas se marcan con "sandbox": true, su saldo nunca se cobra ni se reembolsa, y el personal de Ada Vegas no recibe avisos. Los webhooks sí se envían (con sandbox: true) para que pruebe su receptor de principio a fin. Usa la misma URL base que producción; solo cambia la clave. Para echar un vistazo sin cuenta, use la demo pública (datos de ejemplo, no se guarda nada).

11. Integración típica (servidor)

// PHP 8, cURL
function av(string $method, string $path, ?array $body = null, array $headers = []): array {
    $ch = curl_init('https://api.adavegastravel.com/v1' . $path);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_TIMEOUT => 20,
        CURLOPT_HTTPHEADER => array_merge(['X-Api-Key: ' . getenv('AV_KEY'), 'X-Api-Secret: ' . getenv('AV_SECRET'),
            'Content-Type: application/json', 'Accept-Language: es'], $headers),
        CURLOPT_POSTFIELDS => $body ? json_encode($body, JSON_UNESCAPED_UNICODE) : null,
    ]);
    $out = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
    return [$code, json_decode((string) $out, true)];
}

[$c, $q] = av('GET', '/services/12/quote?date=2026-11-10&pax=2&children=1');
if ($c === 200) {
    [$c, $b] = av('POST', '/bookings', ['service_id' => 12, 'pax' => 2, 'children' => 1, 'service_date' => '2026-11-10',
        'customer_name' => 'Ana Pérez'], ['X-Idempotency-Key: order-10045']);
    // $b['data']['status'] es "confirmed" o "pending"; muestre a su cliente su propio precio y guarde $b['data']['booking_ref']
}

12. Vender en su propia web

Dos formas, ambas usan la misma API:

A. Paquete web listo para usar ("Vitrin")

Una web de viajes solo de front-end que sube a su propio hosting (PHP 8.1+, sin base de datos). Desde el portal (Mi web) gestiona su nombre, colores, textos (ES/EN/TR), páginas, qué tours son visibles y su margen %. Los visitantes ven su precio = precio Ada Vegas + su margen, nunca el nuestro. La solicitud de un visitante se convierte en una reserva de su cuenta (descontada al precio de Ada Vegas) y aparece en Reservas → Mi web, donde usted confirma o cancela; el viajero recibe correos en su idioma y una página "Mis reservas". Las actualizaciones se aplican desde el portal con un clic.

B. Su propia web o sistema

Cree sus propias páginas con /services y /quote y cree las reservas desde el servidor. Para usar el margen y los correos de la configuración publicada de su web, añada a POST /bookings:

CampoDescripción
channel: "site"La reserva se trata como reserva de web: usted la confirma, y se guarda y devuelve sale_total (precio Ada Vegas + su margen). Requiere una web publicada (si no, 403 site_disabled).
customer_langtr|en|es, idioma de los correos al viajero
Calcule y muestre siempre los precios en su servidor a partir de /quote; nunca confíe en un precio enviado desde un navegador. El importe que se le descuenta es siempre el precio de Ada Vegas, no sale_total.

13. Errores

HTTPcodeSignificado
400validation_errorCampo ausente o inválido (service_id, pax, children; service_date es obligatorio)
400invalid_bodyEl cuerpo no es JSON válido
400invalid_currencyMoneda distinta de TRY/USD/EUR
401unauthorizedClave o secreto ausente o inválido
403forbiddenIP no permitida o cuenta suspendida
403site_disabledCanal web usado sin web publicada / tour oculto
404service_not_foundTour desconocido o no disponible para usted
404booking_not_foundReferencia desconocida
409not_cancellablePor API solo se cancelan reservas pendientes
413invalid_bodyCuerpo de más de 64 KB
422date_in_pastservice_date es anterior a hoy
422no_price_for_dateNo hay precio de temporada para esa fecha
422pax_below_min / pax_above_maxTamaño de grupo fuera de los límites del tour (limit indica el límite)
422occupancy_required / invalid_occupancy / no_accommodation_priceTours con alojamiento: falta el tipo de habitación, es incorrecto o no tiene precio
429rate_limitedDemasiadas peticiones; espere Retry-After segundos

Una reserva aceptada pero a la espera de crédito no es un error: recibe 201 con status: "pending" y hold_reason: "insufficient_credit".

14. Buenas prácticas

15. Soporte

Consultas, cancelación de reservas confirmadas, aumentos de límite, aprobación automática o ayuda con la integración: contacte con su responsable de cuenta en Ada Vegas. Indique el booking_ref y la hora de la petición.

Ada Vegas Partner API v1