Ir al contenido principal
Escríbenos por WhatsAppMis reservas

API para desarrolladores

Última actualización: 23 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.

¿Ya eres socio? Tus estadísticas, reservas y liquidaciones mensuales están en el portal de socios. Acceso para socios

Cómo obtener acceso

El programa de afiliados está abierto: cualquiera puede unirse. Rellena el formulario de abajo y te enviamos de inmediato un enlace a tus credenciales de prueba. Cuéntanos a la vez sobre tu proyecto: en eso basamos un acuerdo comercial.

  • 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.

Una cuenta de prueba tiene límites, para que evaluarnos nunca cueste un contrato con una aerolínea:

  • Termina a los 30 días, salvo que para entonces hayamos acordado condiciones.
  • Hasta 500 solicitudes de búsqueda al día.
  • Las búsquedas se responden desde nuestro almacén de precios, que nuestros clientes y los socios en producción mantienen lleno. Una ruta y fecha que nadie haya buscado hace poco puede responder vacía; las cuentas de producción activan actualizaciones en vivo.
  • Las reservas que envíes durante la prueba se registran con tu código. La comisión se paga desde la fecha de tu acuerdo.

Obtén credenciales de prueba

Se convierte en tu código de seguimiento, por ejemplo acme-travel.

Aquí enviamos el enlace a tus credenciales y lo usamos para todo lo demás.

Opcional. Dónde se mostrarán nuestros vuelos.

Una o dos frases: el producto, los mercados y dónde aparecerían nuestros vuelos.

Usamos estos datos solo para configurar tu acceso y para contactarte sobre un acuerdo.

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.

El equipaje y las opciones de tarifa solo los devuelven las dos direcciones que terminan en -tcs: flights-tcs.json y flights-multi-tcs. Las demás direcciones no cambian nunca, así que una integración construida sobre ellas sigue funcionando exactamente como hoy.

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"
        }
      ]
    }
  ]
}
POST/api/v2/flights-multiRequiere token

Busca hasta cinco rutas y fechas en una sola solicitud, sin equipaje.

La solicitud es un cuerpo JSON. Cada destino es una ruta en una fecha; un viaje de ida y vuelta son dos destinos, la ida y la vuelta. La respuesta es un objeto llamado result, con claves FROM-TO-DATE (por ejemplo MGA-RNI-2026-10-27), y cada clave contiene los vuelos de ese destino en el mismo formato que flights.json. Su respuesta no cambia nunca: para obtener equipaje y opciones de tarifa, envía la misma solicitud a flights-multi-tcs.

Parámetros

passengers.adults opcional
Pasajeros adultos. El valor predeterminado es 1.
passengers.children opcional
Pasajeros niños. El valor predeterminado es 0.
passengers.infants opcional
Bebés en brazos. El valor predeterminado es 0.
destinations[N].from obligatorio
Aeropuerto de origen, código IATA o id.
destinations[N].to obligatorio
Aeropuerto de destino, código IATA o id.
destinations[N].date obligatorio
Fecha, YYYY-MM-DD.
  • Se leen como máximo cinco destinos; los que vengan después del quinto se ignoran.
  • Para enlazar un viaje de ida y vuelta, pasa a redirect-multi el id del vuelo de ida y el de vuelta.
  • Un par que no está en el feed de rutas se rechaza con HTTP 400 y el código ERROR_DATA_VALIDATION (Route X-Y is not supported), mientras que flights.json responde al mismo par con arreglos vacíos.
  • Un destino en un día que no volamos, o en una fecha pasada, responde con una lista vacía. Una solicitud sin destinos responde con un arreglo vacío.

Ejemplo de solicitud

{
  "passengers": {
    "adults": 1,
    "children": 0,
    "infants": 0
  },
  "destinations": [
    {
      "from": "MGA",
      "to": "RNI",
      "date": "2026-10-27"
    }
  ]
}

Respuesta de ejemplo · 200 OK

{
  "result": {
    "MGA-RNI-2026-10-27": [
      {
        "from": {
          "id": 5217,
          "code": "MGA",
          "city": "Managua",
          "country": "Nicaragua"
        },
        "to": {
          "id": 5219,
          "code": "RNI",
          "city": "Corn Island",
          "country": "Nicaragua"
        },
        "legs": [
          {
            "from": {
              "id": 5217,
              "code": "MGA",
              "city": "Managua",
              "country": "Nicaragua"
            },
            "to": {
              "id": 5219,
              "code": "RNI",
              "city": "Corn Island",
              "country": "Nicaragua"
            },
            "number": "142",
            "dates": {
              "departure": "2026-10-27 07:00",
              "arrival": "2026-10-27 08:30"
            },
            "duration": 5400,
            "airline": {
              "id": 1320,
              "name": "LAC",
              "code": "6Y"
            }
          }
        ],
        "dates": {
          "departure": "2026-10-27 07:00",
          "arrival": "2026-10-27 08:30"
        },
        "duration": 5400,
        "airline": {
          "id": 1320,
          "name": "LAC",
          "code": "6Y"
        },
        "price": {
          "currency": "USD",
          "adult": "161.74",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceUsd": {
          "adult": "161.74",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceEur": {
          "adult": "140.60",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceGbp": {
          "adult": "120.48",
          "child": "0.00",
          "infant": "0.00"
        },
        "requiredFields": {
          "phone": false,
          "nationality": true,
          "documentType": false,
          "documentNumber": true,
          "documentExpiry": false,
          "documentIssuer": false,
          "documentIssueDate": false,
          "birthDate": false,
          "birthDateForChildren": false,
          "birthDateForInfants": false,
          "placeOfBirth": false
        },
        "id": 1000000384088
      }
    ]
  }
}
POST/api/v2/flights-multi-tcsRequiere token

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

Recibe exactamente la misma solicitud que flights-multi y responde exactamente lo mismo, y cada objeto de vuelo incorpora un arreglo fareOptions, como se describe en flights-tcs.json: 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 una con su propio id para los endpoints de redirección, sus propios bloques de precio, un fareFamilyName y el equipaje que incluye. Pensado para la comparación de costo total, como Skyscanner Total Cost Search.

Parámetros

passengers.adults opcional
Pasajeros adultos. El valor predeterminado es 1.
passengers.children opcional
Pasajeros niños. El valor predeterminado es 0.
passengers.infants opcional
Bebés en brazos. El valor predeterminado es 0.
destinations[N].from obligatorio
Aeropuerto de origen, código IATA o id.
destinations[N].to obligatorio
Aeropuerto de destino, código IATA o id.
destinations[N].date obligatorio
Fecha, YYYY-MM-DD.
  • 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.
  • No vendemos equipaje de pago, por lo que nunca se envía un precio de equipaje.
  • flights-multi no cambia y sigue disponible; cambiar solo requiere cambiar la dirección.

Ejemplo de solicitud

{
  "passengers": {
    "adults": 1,
    "children": 0,
    "infants": 0
  },
  "destinations": [
    {
      "from": "MGA",
      "to": "RNI",
      "date": "2026-10-27"
    }
  ]
}

Respuesta de ejemplo · 200 OK

{
  "result": {
    "MGA-RNI-2026-10-27": [
      {
        "from": {
          "id": 5217,
          "code": "MGA",
          "city": "Managua",
          "country": "Nicaragua"
        },
        "to": {
          "id": 5219,
          "code": "RNI",
          "city": "Corn Island",
          "country": "Nicaragua"
        },
        "legs": [
          {
            "from": {
              "id": 5217,
              "code": "MGA",
              "city": "Managua",
              "country": "Nicaragua"
            },
            "to": {
              "id": 5219,
              "code": "RNI",
              "city": "Corn Island",
              "country": "Nicaragua"
            },
            "number": "142",
            "dates": {
              "departure": "2026-10-27 07:00",
              "arrival": "2026-10-27 08:30"
            },
            "duration": 5400,
            "airline": {
              "id": 1320,
              "name": "LAC",
              "code": "6Y"
            }
          }
        ],
        "dates": {
          "departure": "2026-10-27 07:00",
          "arrival": "2026-10-27 08:30"
        },
        "duration": 5400,
        "airline": {
          "id": 1320,
          "name": "LAC",
          "code": "6Y"
        },
        "price": {
          "currency": "USD",
          "adult": "161.74",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceUsd": {
          "adult": "161.74",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceEur": {
          "adult": "140.60",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceGbp": {
          "adult": "120.48",
          "child": "0.00",
          "infant": "0.00"
        },
        "requiredFields": {
          "phone": false,
          "nationality": true,
          "documentType": false,
          "documentNumber": true,
          "documentExpiry": false,
          "documentIssuer": false,
          "documentIssueDate": false,
          "birthDate": false,
          "birthDateForChildren": false,
          "birthDateForInfants": false,
          "placeOfBirth": false
        },
        "id": 1000000384088,
        "fareOptions": [
          {
            "id": 1000000384088,
            "fareFamilyName": "Light",
            "price": {
              "currency": "USD",
              "adult": "161.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceUsd": {
              "adult": "161.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceEur": {
              "adult": "140.60",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceGbp": {
              "adult": "120.48",
              "child": "0.00",
              "infant": "0.00"
            },
            "cabinBag": {
              "pieces": 1,
              "status": "FREE",
              "weight": {
                "value": 9.5,
                "unit": "KG"
              }
            },
            "checkedBag": {
              "pieces": 0,
              "status": "NOT_INCLUDED"
            }
          },
          {
            "id": 1000000384091,
            "fareFamilyName": "Standard",
            "price": {
              "currency": "USD",
              "adult": "172.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceUsd": {
              "adult": "172.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceEur": {
              "adult": "150.16",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceGbp": {
              "adult": "128.68",
              "child": "0.00",
              "infant": "0.00"
            },
            "checkedBag": {
              "pieces": 1,
              "status": "FREE",
              "weight": {
                "value": 14,
                "unit": "KG"
              }
            }
          },
          {
            "id": 1000000384092,
            "fareFamilyName": "Essential",
            "price": {
              "currency": "USD",
              "adult": "194.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceUsd": {
              "adult": "194.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceEur": {
              "adult": "169.29",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceGbp": {
              "adult": "145.07",
              "child": "0.00",
              "infant": "0.00"
            },
            "cabinBag": {
              "pieces": 1,
              "status": "FREE",
              "weight": {
                "value": 9.5,
                "unit": "KG"
              }
            },
            "checkedBag": {
              "pieces": 1,
              "status": "FREE",
              "weight": {
                "value": 14,
                "unit": "KG"
              }
            }
          }
        ]
      }
    ]
  }
}
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
GET/api/v2/partner/statistics.jsonRequiere token

Tus búsquedas, clics, reservas y comisión, por día o por ruta.

Las cifras de la página de Estadísticas de tu portal de socios, para tus propios sistemas. Las búsquedas son las solicitudes de búsqueda que hizo tu token; los clics son las redirecciones que nos enviaste, y un clic sin destino es uno que no pudimos asociar a un vuelo. Las reservas cuentan el día en que se pagaron; la comisión suma solo las reservas confirmadas.

Parámetros

from opcional
Primer día, AAAA-MM-DD (UTC). Por defecto, el día 1 del mes de to.
to opcional
Último día, AAAA-MM-DD (UTC), incluido. Por defecto, hoy. Como máximo 366 días después de from.
groupBy opcional
day (por defecto) o route. Las rutas cuentan ambos sentidos juntos.
  • Solo tus propias cifras. Se responde desde nuestros registros: nunca llega a una aerolínea.
  • La comisión es un número en la moneda indicada en la respuesta.

Respuesta de ejemplo · 200 OK

{
  "partner": {
    "code": "your-code",
    "id": 10001
  },
  "from": "2026-09-01",
  "to": "2026-09-26",
  "groupBy": "day",
  "currency": "USD",
  "totals": {
    "searches": 41280,
    "clicks": 312,
    "deadEnds": 4,
    "bookings": 9,
    "commission": 51.32
  },
  "days": [
    {
      "date": "2026-09-01",
      "searches": 1466,
      "clicks": 11,
      "deadEnds": 0,
      "bookings": 0,
      "commission": 0
    },
    {
      "date": "2026-09-02",
      "searches": 1655,
      "clicks": 13,
      "deadEnds": 0,
      "bookings": 0,
      "commission": 0
    },
    {
      "date": "2026-09-03",
      "searches": 1702,
      "clicks": 12,
      "deadEnds": 0,
      "bookings": 1,
      "commission": 3.05
    }
  ]
}
GET/api/v2/partner/bookings.jsonRequiere token

Tus reservas de un mes, con la comisión y tus propios ids de clic.

Las filas de la página de Reservas de tu portal de socios. Una reserva pertenece al mes en que se pagó; si se reembolsa o cancela después, sigue en la lista con su estado y su comisión se descuenta en tu próxima liquidación.

Parámetros

month opcional
AAAA-MM. Por defecto, el mes en curso.
  • status es confirmed, cancelled o refunded; la comisión del mes cuenta solo las reservas confirmadas.
  • clickId y subId son los valores que nos enviaste con el clic.

Respuesta de ejemplo · 200 OK

{
  "partner": {
    "code": "your-code",
    "id": 10001
  },
  "month": "2026-09",
  "currency": "USD",
  "count": 9,
  "commission": 51.32,
  "bookings": [
    {
      "paidAt": "2026-09-25T10:14:03.000Z",
      "reference": "00GDSG",
      "route": "SAP-RTB-SAP",
      "travelFrom": "2026-12-20",
      "travelTo": "2027-01-03",
      "passengers": 1,
      "commission": 7.5,
      "currency": "USD",
      "status": "confirmed",
      "clickId": "c-B4C912",
      "subId": null
    }
  ]
}

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

Accede al portal de socios para ver tus estadísticas, reservas y liquidaciones mensuales, o consulta las mismas cifras con los dos endpoints para socios de arriba. El día 2 de cada mes te enviamos por correo la liquidación del mes anterior, 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