Ir al contenido principal
Escríbenos por WhatsAppMis reservas

API para desarrolladores

Última actualización: 18 de septiembre de 2026

Busca nuestros vuelos, lleva a los pasajeros directamente a una reserva y gana comisión por lo que nos envías. Todo lo que aparece a continuación se sirve desde https://aviodeals.com.

Cómo obtener acceso

El programa de afiliados está abierto: cualquiera puede unirse. Ponte en contacto, cuéntanos quién eres y aproximadamente qué tráfico esperas, y te daremos de alta.

  • Un código de seguimiento: el valor que pones en el parámetro ref en cada enlace que nos envías.
  • Un token de API para los endpoints de búsqueda y de feeds.
  • Condiciones de comisión: un porcentaje del total del pedido, hasta un máximo acordado por reserva.

Tu token es una credencial al portador: quien lo tenga puede hacer consultas en tu nombre. Solo guardamos un hash del token, así que no podemos volver a mostrártelo; guárdalo en un lugar seguro y avísanos de inmediato si se filtra, y lo reemplazaremos.

Autenticación

Envía tu token en cada solicitud de feed y de búsqueda, ya sea como un encabezado Authorization con el token tal cual —sin el prefijo Bearer— o como un parámetro de consulta accessToken. Los endpoints de redirección son públicos y no requieren token.

Ejemplo

curl -H "Authorization: YOUR_TOKEN" \
  "https://aviodeals.com/api/v2/data/routes.json"

Errores

Ambos responden HTTP 401 con el código ERROR_UNAUTHORIZED:

  • Sin ningún token: Authentication required
  • Un token que no reconocemos, o uno que pertenece a una cuenta desactivada: Access Denied [1]

Endpoints

Las respuestas son JSON. Las fechas son ISO 8601 (YYYY-MM-DD). Los aeropuertos se identifican por su código IATA o por el id numérico del feed de aeropuertos; ambos se aceptan en todos los lugares donde se indica un aeropuerto.

GET/api/v2/data/airports.jsonRequiere token

Todos los aeropuertos que servimos, con su id numérico, código IATA, ciudad y país.

Datos de referencia estáticos. Guárdalos en caché: cambian rara vez y los ids son estables.

Respuesta de ejemplo · 200 OK

[
  {
    "id": 51,
    "code": "DUS",
    "city": "Dusseldorf",
    "country": "Germany"
  },
  {
    "id": 242,
    "code": "DAR",
    "city": "Dar es salaam",
    "country": "Tanzania"
  }
]
GET/api/v2/data/routes.jsonRequiere token

Los pares de aeropuertos que realmente volamos, como pares de origen y destino.

Dos aeropuertos que servimos no forman necesariamente un par reservable. Usa este feed para limitar tus búsquedas a rutas que existen: un par que no esté en él solo puede responder vacío.

Respuesta de ejemplo · 200 OK

[
  {
    "departure": {
      "id": 242,
      "code": "DAR",
      "city": "Dar es salaam",
      "country": "Tanzania"
    },
    "destination": {
      "id": 267,
      "code": "ZNZ",
      "city": "Zanzibar",
      "country": "Tanzania"
    }
  }
]
GET/api/v2/data/routes/with-availability.jsonRequiere token

Los mismos pares, con los días en que opera cada ruta.

Úsalo para evitar buscar una ruta en un día en que no vuela.

Respuesta de ejemplo · 200 OK

[
  {
    "dep": "DAR",
    "des": "ZNZ",
    "dow": "Mon,Tue,Wed,Thu,Fri,Sat,Sun",
    "from": "2026-01-01",
    "to": "2027-12-31"
  }
]
GET/api/v2/flights.jsonRequiere token

Busca una ruta en una fecha, solo ida o ida y vuelta.

Responde un objeto con los arreglos departure y return. Cada vuelo lleva su propio id: pasa ese id al endpoint de redirección para llevar al pasajero a ese vuelo.

Parámetros

from obligatorio
Aeropuerto de origen, código IATA o id.
to obligatorio
Aeropuerto de destino, código IATA o id.
departureDate obligatorio
Fecha de ida, YYYY-MM-DD.
returnDate opcional
Fecha de vuelta para un viaje de ida y vuelta. Omítela para solo ida.
adults opcional
Pasajeros adultos. El valor predeterminado es 1.
children opcional
Pasajeros niños. El valor predeterminado es 0.
infants opcional
Bebés en brazos. El valor predeterminado es 0.
  • Un par que no volamos responde arreglos vacíos, no un error: una respuesta vacía nunca es motivo para reintentar.
  • Una fecha en el pasado responde vacío en lugar de fallar.
  • return solo está presente cuando se envió un returnDate.

Respuesta de ejemplo · 200 OK

{
  "departure": [
    {
      "from": {
        "id": 242,
        "code": "DAR",
        "city": "Dar es salaam",
        "country": "Tanzania"
      },
      "to": {
        "id": 267,
        "code": "ZNZ",
        "city": "Zanzibar",
        "country": "Tanzania"
      },
      "legs": [
        {
          "from": {
            "id": 242,
            "code": "DAR",
            "city": "Dar es salaam",
            "country": "Tanzania"
          },
          "to": {
            "id": 267,
            "code": "ZNZ",
            "city": "Zanzibar",
            "country": "Tanzania"
          },
          "number": "611",
          "dates": {
            "departure": "2026-10-27 07:15",
            "arrival": "2026-10-27 07:30"
          },
          "duration": 900,
          "airline": {
            "id": 173,
            "name": "Auric Air",
            "code": "UI"
          }
        }
      ],
      "dates": {
        "departure": "2026-10-27 07:15",
        "arrival": "2026-10-27 07:30"
      },
      "duration": 900,
      "airline": {
        "id": 173,
        "name": "Auric Air",
        "code": "UI"
      },
      "price": {
        "currency": "USD",
        "adult": "122.00",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceUsd": {
        "adult": "122.00",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceEur": {
        "adult": "106.05",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceGbp": {
        "adult": "90.88",
        "child": "0.00",
        "infant": "0.00"
      },
      "requiredFields": {
        "phone": true,
        "nationality": true,
        "documentType": true,
        "documentNumber": true,
        "documentExpiry": false,
        "documentIssuer": false,
        "documentIssueDate": false,
        "birthDate": false,
        "birthDateForChildren": false,
        "birthDateForInfants": false,
        "placeOfBirth": false
      },
      "id": 1000000383705
    }
  ]
}
GET/api/v2/flights-tcs.jsonRequiere token

La misma búsqueda, con equipaje y hasta cuatro opciones de tarifa por vuelo.

Responde exactamente lo mismo que flights.json, y cada objeto de vuelo incorpora un arreglo fareOptions: las tarifas que puedes vender en ese vuelo, de la más barata a la más cara, con un máximo de cuatro. Cada opción tiene su propio id para el endpoint de redirección, sus propios bloques de precio, un fareFamilyName y el equipaje que incluye: cabinBag y checkedBag, cada uno con pieces, status (FREE o NOT_INCLUDED) y, cuando la aerolínea lo indica, un peso por pieza en kilogramos. Pensado para la comparación de costo total, como Skyscanner Total Cost Search.

Parámetros

from obligatorio
Aeropuerto de origen, código IATA o id.
to obligatorio
Aeropuerto de destino, código IATA o id.
departureDate obligatorio
Fecha de ida, YYYY-MM-DD.
returnDate opcional
Fecha de vuelta para un viaje de ida y vuelta. Omítela para solo ida.
adults opcional
Pasajeros adultos. El valor predeterminado es 1.
children opcional
Pasajeros niños. El valor predeterminado es 0.
infants opcional
Bebés en brazos. El valor predeterminado es 0.
  • La primera opción de tarifa es la oferta propia del vuelo: mismo id y mismo precio que el objeto de vuelo.
  • Un campo que la aerolínea no indicó se omite, nunca se envía como cero: trata la ausencia de cabinBag o checkedBag como dato desconocido.
  • cancellation y flightChange solo aparecen como FREE, y solo cuando la aerolínea lo indica; su ausencia no afirma nada.
  • Dos tarifas con atributos idénticos son un mismo producto: solo se lista la más barata.
  • No vendemos equipaje de pago, por lo que nunca se envía un precio de equipaje.
  • flights.json no cambia y sigue disponible; usa el que mejor se adapte a tu integración.

Respuesta de ejemplo · 200 OK

{
  "departure": [
    {
      "from": {
        "id": 242,
        "code": "DAR",
        "city": "Dar es salaam",
        "country": "Tanzania"
      },
      "to": {
        "id": 267,
        "code": "ZNZ",
        "city": "Zanzibar",
        "country": "Tanzania"
      },
      "legs": [
        {
          "from": {
            "id": 242,
            "code": "DAR",
            "city": "Dar es salaam",
            "country": "Tanzania"
          },
          "to": {
            "id": 267,
            "code": "ZNZ",
            "city": "Zanzibar",
            "country": "Tanzania"
          },
          "number": "611",
          "dates": {
            "departure": "2026-10-27 07:15",
            "arrival": "2026-10-27 07:30"
          },
          "duration": 900,
          "airline": {
            "id": 173,
            "name": "Auric Air",
            "code": "UI"
          }
        }
      ],
      "dates": {
        "departure": "2026-10-27 07:15",
        "arrival": "2026-10-27 07:30"
      },
      "duration": 900,
      "airline": {
        "id": 173,
        "name": "Auric Air",
        "code": "UI"
      },
      "price": {
        "currency": "USD",
        "adult": "122.00",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceUsd": {
        "adult": "122.00",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceEur": {
        "adult": "106.05",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceGbp": {
        "adult": "90.88",
        "child": "0.00",
        "infant": "0.00"
      },
      "requiredFields": {
        "phone": true,
        "nationality": true,
        "documentType": true,
        "documentNumber": true,
        "documentExpiry": false,
        "documentIssuer": false,
        "documentIssueDate": false,
        "birthDate": false,
        "birthDateForChildren": false,
        "birthDateForInfants": false,
        "placeOfBirth": false
      },
      "id": 1000000383705,
      "fareOptions": [
        {
          "id": 1000000383705,
          "fareFamilyName": "NR",
          "price": {
            "currency": "USD",
            "adult": "122.00",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceUsd": {
            "adult": "122.00",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceEur": {
            "adult": "106.05",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceGbp": {
            "adult": "90.88",
            "child": "0.00",
            "infant": "0.00"
          },
          "cabinBag": {
            "pieces": 1,
            "status": "FREE",
            "weight": {
              "value": 5,
              "unit": "KG"
            }
          },
          "checkedBag": {
            "pieces": 1,
            "status": "FREE",
            "weight": {
              "value": 20,
              "unit": "KG"
            }
          }
        },
        {
          "id": 1000000383706,
          "fareFamilyName": "Y",
          "price": {
            "currency": "USD",
            "adult": "168.00",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceUsd": {
            "adult": "168.00",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceEur": {
            "adult": "146.04",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceGbp": {
            "adult": "125.15",
            "child": "0.00",
            "infant": "0.00"
          },
          "checkedBag": {
            "pieces": 2,
            "status": "FREE",
            "weight": {
              "value": 23,
              "unit": "KG"
            }
          },
          "flightChange": "FREE"
        }
      ]
    }
  ]
}
GET/api/v2/redirectPúblico

El enlace directo. Envía aquí a los pasajeros para que lleguen al vuelo en el que hicieron clic.

Redirige a nuestra página de resultados con el viaje ya completado y registra tu atribución. Este endpoint nunca devuelve un error: un id que no podemos resolver igualmente lleva al pasajero a una página utilizable y no a un callejón sin salida.

Parámetros

flightId obligatorio
El id del vuelo de ida de una respuesta de búsqueda.
returnFlightId opcional
El id del vuelo de vuelta, para un viaje de ida y vuelta.
ref obligatorio
Tu código de seguimiento. Sin él, la visita no te genera nada.
subAffiliate opcional
Tu propia etiqueta de subcanal, que te devolvemos en los reportes.
campaign opcional
Tu propia etiqueta de campaña.
partnerClickId opcional
Tu identificador de clic, para que puedas conciliar una reserva con tus propios registros.
currency opcional
Moneda en la que se muestran los precios. No cambia la moneda en que se cobra.

Respuesta de ejemplo · 301 Moved Permanently

Location: https://aviodeals.com/search?from=DAR&to=ZNZ&depart=2026-10-27&adults=1&children=0&infants=0#results
GET/api/v2/redirect-multiPúblico

El enlace directo para un viaje de ida y vuelta, que recibe ambos tramos como una lista.

Lee flightIds como una colección: la primera entrada es la ida y la segunda, la vuelta. Acepta los mismos parámetros de atribución que la redirección simple.

Parámetros

flightIds[] obligatorio
Ids de vuelo en orden: primero la ida, después la vuelta.
ref obligatorio
Tu código de seguimiento.

Respuesta de ejemplo · 301 Moved Permanently

Location: https://aviodeals.com/search?from=DAR&to=ZNZ&depart=2026-10-27&adults=1&children=0&infants=0#results
GET/api/v2/results-multiPúblico

Un enlace directo construido a partir de aeropuertos y fechas en lugar de ids de vuelo.

Úsalo cuando no tengas un id de vuelo a mano, por ejemplo a partir de una búsqueda en caché o vencida. Lee los destinos como parámetros indexados: destinations[0][from], destinations[0][to], destinations[0][date].

Parámetros

destinations[N][from] obligatorio
Aeropuerto de origen del tramo N.
destinations[N][to] obligatorio
Aeropuerto de destino del tramo N.
destinations[N][date] obligatorio
Fecha del tramo N.
ref obligatorio
Tu código de seguimiento.
  • Un destino que no podemos resolver se omite en lugar de rechazarse.

Respuesta de ejemplo · 301 Moved Permanently

Location: https://aviodeals.com/search?from=DAR&to=ZNZ&depart=2026-10-27&adults=1&children=0&infants=0#results

Errores

Todos los errores tienen la misma estructura: success es false, code indica la clase de error y errors enumera lo que falló, con un path que nombra el parámetro cuando uno es el causante. Un token ausente o desconocido responde 401; una búsqueda que no se puede interpretar responde 400. Un resultado vacío nunca es un error.

401 Unauthorized

{
  "success": false,
  "code": "ERROR_UNAUTHORIZED",
  "errors": [
    {
      "message": "Authentication required"
    }
  ]
}

400 Bad Request

{
  "success": false,
  "code": "ERROR_GENERAL",
  "errors": [
    {
      "message": "To airport is required",
      "path": "to"
    },
    {
      "message": "Departure date is required",
      "path": "departureDate"
    }
  ]
}

Atribución

Pon tu código de seguimiento en el parámetro ref de cada enlace. Guardamos una cookie propia cuando el pasajero llega y la leemos si reserva, así que una reserva cuenta para ti incluso cuando ocurre días después del clic.

https://aviodeals.com/api/v2/redirect?flightId=1000000000123&ref=YOUR_CODE
  • La ventana de atribución es de 42 días desde el clic.
  • Gana el clic más reciente: si un pasajero llega a través de otro socio después de ti, la reserva es de ese socio.
  • Una reserva se atribuye una sola vez, en el momento en que se crea.

Comisión

Ganas un porcentaje acordado del total del pedido, hasta un máximo acordado por reserva. Las cifras exactas están en tu propio acuerdo; las reglas siguientes se aplican a todos.

  • El máximo es por reserva, no por pasajero: una reserva genera una sola comisión con tope, sin importar cuántos pasajeros incluya.
  • La comisión se calcula sobre el total del pedido realmente cobrado, no sobre un precio cotizado antes.
  • Los importes se redondean hacia abajo al centavo.
  • La comisión se gana en las reservas que se pagan. Una compra con la tarifa bloqueada o abandonada no genera nada.
  • Una reserva vendida en una moneda distinta de tu moneda de pago se te informa en lugar de pagarse automáticamente: no convertimos al liquidar, acordamos el tipo de cambio contigo.

Reportes

Estamos reconstruyendo los reportes para socios junto con la nueva plataforma. Hasta que estén listos, pídenos tu estado de cuenta y te lo enviaremos, con todo lo necesario para una factura.

Uso razonable

Compramos nuestro inventario a las aerolíneas con contratos que miden cuántas búsquedas les enviamos por cada reserva. Ese presupuesto se comparte contigo, así que unos pocos hábitos mantienen la conexión sana para ambos.

  • Busca solo pares del feed de rutas, en los días en que el feed de disponibilidad indica que operan. Un par que no volamos solo puede responder vacío, y consultarlo de todos modos gasta el presupuesto para nada.
  • Guarda en caché los feeds de aeropuertos y rutas. Cambian rara vez.
  • No consultes repetidamente una búsqueda para el mismo viaje. Los precios se garantizan al reservar, no al buscar.
  • Avísanos antes de aumentar de forma considerable tu volumen de consultas, para que podamos ampliar primero nuestros propios límites.

Preguntas

¿Algo no está claro, algo no funciona o necesitas un endpoint que no está aquí? Ponte en contacto: preferimos cambiar la API antes que obligarte a buscar una solución alternativa.

API para desarrolladores | aviodeals