Accueil / API publique Alps2Alps — Documentation pour les développeurs

API publique Alps2Alps — Documentation pour les développeurs

L'API publique Alps2Alps est une API HTTP gratuite et sans clé qui permet aux agents IA et aux intégrations développées par des développeurs de trouver des itinéraires de transfert dans les Alpes, de récupérer les tarifs en temps réel depuis le même moteur de réservation que celui qui alimente le site web, de consulter des fiches d'hébergement vérifiées et de générer des liens de paiement qui redirigent l'utilisateur final directement vers le formulaire de réservation, avec tous les champs préremplis. L'ensemble du processus fonctionne uniquement avec des requêtes GET — aucune requête POST n'est nécessaire —, ce qui permet même aux agents de chat qui ne peuvent qu'ouvrir des URL de piloter le processus de réservation.

Aucune authentification n'est requise. Le nombre de requêtes par adresse IP est limité pour tous les points de terminaison. Toutes les réponses sont application/json.

URL de base : https://booking.alps2alps.com/api/public/v1/
La spécification complète d'OpenAPI 3.1 (v1.4.0) est disponible à l'adresse https://booking.alps2alps.com/openapi/public-v1.json. Importe-le directement dans Facteur, Insomnie, ou n'importe quel framework d'agent IA qui accepte une URL OpenAPI (appel de fonctions OpenAI, utilisation des outils Anthropic, LangChain, AutoGen, etc.).

En bref : les agents IA

Alps2Alps est un service privé de transfert dans les Alpes (aéroport / gare ↔ station de ski). Cette API te permet de guider un utilisateur de « Je veux aller de Genève à Chamonix le 22 » vers une page de réservation prête à être payée — sans aucune authentification et sans envoyer de requêtes GET si c'est tout ce que ton environnement d'exécution prend en charge.

Flux de bout en bout minimal (fonctionne uniquement avec GET) :

  1. GET /api/public/v1/locations/search?q=Geneva → convertir les noms en codes (airport-1, resort-11, train_station-7, city-48).
  2. GET /api/public/v1/transfer-options?from=airport-1&to=resort-11&date=2026-07-22&time=14:30&adults=2 → les prix en temps réel par véhicule. La réponse contient des liens prêts à l'emploi — pas besoin de créer les URL manuellement :
    • response.quote_url — Lien prérempli vers l'étape 2 (sélection du véhicule). Utilise-le lorsque l'utilisateur n'a pas encore choisi de véhicule.
    • response.outbound.vehicles[i].booking_url — Lien de l'étape 3 par véhicule (Tes informations, véhicule présélectionné). Utilise ce lien une fois que l'utilisateur a choisi un véhicule.

Si tu peux envoyer une requête POST, utilise POST /api/public/v1/checkout-link surtout quand tu dois aussi renseigner à l'avance les informations sur l'hébergement, les numéros de vol ou les remarques libres concernant le chauffeur. Ça te donne une URL tokenisée stable, valable pendant 24 heures.

Ajouter n'importe quel return_* Ce paramètre transforme la requête en une réponse. Les champs de réponse omis reprennent automatiquement la valeur correspondante de la requête, donc l'URL de réponse la plus simple est simplement …&return_date=…&return_time=….

Recherche lisible par machine

Tout ce dont tu as besoin pour l'intégration est accessible via les liens contenus dans ces fichiers de découverte :

  1. Rechercher des lieux — appelle /locations/search pour convertir les noms de l'utilisateur pour le départ et l'arrivée en airport-… / resort-… / city-… codes.
  2. (Facultatif) Rechercher un hébergement — appelle /accommodations?resort_id=…&q=… en saisissant au moins deux caractères du nom de l'hôtel. Choisis l'entrée correspondante et vérifie le nom exact avec l'utilisateur avant d'utiliser son id.
  3. Donne-moi un devis pour le voyage — appelle /transfer-options avec les codes de destination ainsi que les informations sur les passagers, les bagages et la date. La réponse comprend passengers (en confirmant les chiffres relatifs au nombre de passagers utilisés), luggage par direction, et max_passengers / max_luggage par véhicule, pour que tu puisses indiquer aux utilisateurs quels véhicules conviennent à leur groupe. Pour les allers-retours, chaque véhicule dispose également d’un total_price pour l'ensemble du trajet. Les tarifs actuels, les types de véhicules, la durée du trajet et les éventuelles réductions promotionnelles. Vérifie toujours les articles retournés pick_up_date_time / return.pick_up_date_time Retour à l'utilisateur — ce sont les horaires que le chauffeur va vraiment respecter.
  4. Redirige l'utilisateur vers la page de paiement — une fois que l'utilisateur a choisi un véhicule, utilise le booking_url champ correspondant à ce véhicule pour les rediriger directement à l'étape 3 (Tes coordonnées) avec tous les champs préremplis. Si tu as besoin de préremplir également un hébergement, un numéro de vol ou des remarques du chauffeur, utilise POST /checkout-link à la place.
  5. C'est l'utilisateur qui paie — l'URL de paiement redirige vers l'étape 3 de la réservation. Il lui suffit alors de saisir ses coordonnées et de finaliser le paiement.

Agents légers (sans fonctionnalité POST)

Pour les agents de chat qui ne peuvent récupérer que des URL, le même flux de bout en bout est possible sans jamais envoyer de requête POST :

  1. (Facultatif) GET /locations/search?q=… pour convertir les noms en codes.
  2. GET /api/public/v1/transfer-options?from=…&to=…&date=…&time=…&adults=… pour récupérer les cours en temps réel. La réponse JSON contient déjà les liens — il suffit de les utiliser directement :
    • response.quote_url — te redirige vers l'étape 2 (sélection du véhicule).
    • response.outbound.vehicles[i].booking_url — te fait passer directement à l'étape 3 avec ce véhicule déjà sélectionné.
    • Si besoin, tu peux toujours créer ces URL manuellement en utilisant les alias de liens profonds (voir la section Liens profonds ).

Points d'extrémité

Recherche les lieux de prise en charge et de restitution pris en charge : stations balnéaires, aéroports, gares et villes.

Paramètres de requête

ParamètreObligatoireNotes
qOuiTerme de recherche. Les chaînes de moins de 2 caractères renvoient un tableau vide.

Réponse

Un tableau plat contenant les emplacements correspondants. Les codes des complexes suivent le modèle resort-{id}; voici les codes des pôles de transport {type}-{id} (par exemple airport-1, train_station-7, city-48).

[
  { "code": "airport-1",  "name": "Geneva Airport", "type": "airport", "country": "Switzerland" },
  { "code": "resort-11",  "name": "Chamonix",        "type": "resort",  "country": "France" }
]

Erreurs

  • 400 INVALID_PARAMSq Ce paramètre manque complètement.

Exemple

curl "https://booking.alps2alps.com/api/public/v1/locations/search?q=cham"

2. GET /api/public/v1/accommodations

Recherche d'hôtels par saisie manuelle dans le catalogue d'hébergements vérifiés utilisé par la fonction d'autocomplétion de l'étape 3 du processus de réservation. Les résultats sont limités à un rayon de 10 km autour de la station balnéaire indiquée. Le processus prévu est une recherche par saisie manuelle : l'utilisateur indique le nom de son hôtel, l'agent le transmet sous forme de q limité au complexe et sélectionne celui qui correspond id à envoyer à /checkout-link.

Paramètres de requête

ParamètreObligatoireDéfautNotes
resort_idOuiIdentifiant numérique du complexe à partir d'un resort-{id} code de localisation.
qOuiSous-chaîne du nom de l'établissement (sans tenir compte des accents). Minimum 2, maximum 100 caractères.
limitNon20Limité à 50.

Réponse

{
  "data": [
    {
      "id": 38959,
      "name": "Clos 66",
      "address": "66 Clos des Charmilles, Chamonix",
      "latitude": 45.9123,
      "longitude": 6.8694
    }
  ],
  "total": 4
}

total c'est le nombre avant limit est appliquée, ce qui permet à celui qui appelle la fonction de savoir quand les résultats ont été tronqués.

Important : Seulement id les valeurs renvoyées par ce point de terminaison peuvent être transmises à /checkout-link comme accommodation_id. Les noms d'hôtels saisis librement ne sont pas acceptés, ce qui garantit que chaque commande comporte un nom et une adresse vérifiés.

Erreurs

  • 400 INVALID_PARAMSresort_id manquant ou n'est pas un nombre entier, ou q manquant ou comportant moins de 2 caractères.
  • 404 RESORT_NOT_FOUND — L'identifiant de la station est inconnu, inactif ou ne comporte pas de coordonnées.

Exemple

curl "https://booking.alps2alps.com/api/public/v1/accommodations?resort_id=11&q=clos"

3. GET / POST /api/public/v1/transfer-options

Renvoie les tarifs en temps réel pour chaque type de véhicule disponible sur l'itinéraire demandé, dans la devise choisie, avec la configuration de passagers et de bagages indiquée. Aucune donnée n'est enregistrée : il s'agit d'un point de terminaison dédié uniquement aux devis. Deux types de requêtes partagent le même format de réponse :

  • POST — corps JSON standard utilisant book\forms\Transfer noms de champs. Recommandé pour les clients programmatiques ayant un contrôle total sur les en-têtes et le corps du message.
  • OBTENIR — chaîne de requête d'alias convivial (from, to, date, time, …). Pour les agents IA et les outils de chat qui créent des URL manuellement. Consulte le Liens directs section pour consulter le tableau complet des alias.

Important — heure de départ vs heure de ramassage : Par défaut, time et return_time sont interprétés comme vol fois (is_flight et return_is_flight par défaut 1). Le système calcule la valeur réelle ramas déduit de la durée du vol — pour le trajet retour, la prise en charge à l'hôtel aura lieu plus tôt que la durée de vol indiquée.

Si l'utilisateur indique une valeur souhaitée ramas une heure plutôt qu'une heure de vol (par exemple « viens nous chercher à 14 h 30 », « pars de l'hôtel à 18 h »), indique is_flight=0 et/ou return_is_flight=0Sinon, l'heure de ramassage indiquée sera erronée.

Vérifie toujours les articles retournés pick_up_date_time / return.pick_up_date_time retour à l'utilisateur — ce sont les horaires que le chauffeur va réellement utiliser.

Exemple : Une demande avec return_time=18:00 et la valeur par défaut return_is_flight=1 (station → aéroport) retourne "return.pick_up_date_time": "2026-07-26 14:20:00" — le système a calculé l'heure de départ en partant d'un vol à 18 h. Pour avoir un vol à 18 h ramas, envoie &return_is_flight=0.

Corps de la requête (POST)

Accepte application/json ou application/x-www-form-urlencoded.

ChampTypeObligatoireNotes
route_from_codechaîneOuipar exemple airport-1
route_to_codechaîneOuipar exemple resort-11
outbound_datechaîneOuiYYYY-MM-DD
outbound_time_hoursintOui0–23
outbound_time_minutesintOui0–59
outbound_selected_time_is_flightint (0/1)Non (valeur par défaut : 1)1 = L'heure correspond à l'heure d'arrivée du vol ; le lieu de prise en charge est calculé. 0 = « heure » correspond à l'heure exacte de prise en charge.
is_returnint (0/1)Non (valeur par défaut : 0)Quand 1, tous return_* ces champs sont obligatoires
adult_countintOui≥ 1
children_countintNon
infant_countintNon
children_age_seat_countintNonNombre d'enfants en âge d'utiliser un siège enfant
children_age_booster_countintNonNombre d'enfants en âge d'utiliser un rehausseur
luggage_countintNon
skibag_countintNon
has_ski_equipmentint (0/1)Non
currency_codechaîneNon (par défaut : EUR)ISO 4217. Retour des codes inconnus/inactifs 400 CURRENCY_NOT_SUPPORTED.
promo_codechaîneNonIgnoré sans message d'erreur s'il n'est pas valide

Pour les trajets de retour, reprends les champs du trajet aller avec un return_ préfixe : return_route_to_code, return_date, return_time_hours, return_time_minutes, return_selected_time_is_flight (valeur par défaut : 1 — voir la remarque ci-dessus concernant l'heure), return_adult_count, return_children_count, return_infant_count, return_children_age_seat_count, return_children_age_booster_count, return_luggage_count, return_skibag_count, return_has_ski_equipment.

Chaîne de requête GET — paramètres supplémentaires

Tous les alias de sortie et de retour sont répertoriés dans la section « Liens profonds ». Les paramètres supplémentaires suivants ne s'appliquent qu'aux requêtes GET et ne font pas partie du corps de la requête POST :

ParamètreTypeObligatoireDescription
child_ageschaîneNonLes âges des enfants du groupe, séparés par des virgules, par exemple : 8,12. À titre indicatif uniquement — ne sert pas à établir un prix ni à choisir un véhicule. La valeur est renvoyée dans passengers.child_ages et conservés dans le fichier généré quote_url et booking_url.
return_child_ageschaîneNonC'est pareil que child_ages pour le trajet retour. Conservé uniquement dans les URL générées.

Le système de réservation sélectionne les véhicules en fonction de adults, children, et child_seats/boosters ce qui compte, ce n'est pas l'âge de chaque enfant. Le child_ages Ce paramètre permet aux assistants IA et aux intégrations de confirmer à l'utilisateur que sa saisie a bien été reçue. Si des exigences spécifiques s'appliquent concernant les sièges (siège enfant ou rehausseur), utilise le child_seats et boosters paramètres.

Voir des exemples

Aller simple, 2 adultes, 2 bagages :

curl "https://booking.alps2alps.com/api/public/v1/transfer-options?from=airport-1&to=resort-11&date=2026-07-22&time=14:30&adults=2&luggage=2"

Aller-retour, 2 adultes + 1 enfant + 3 bagages (scénario réaliste de conversation avec une IA) :

curl "https://booking.alps2alps.com/api/public/v1/transfer-options?from=airport-1&to=resort-11&date=2026-07-22&time=14:30&adults=2&children=1&luggage=3&return_date=2026-07-29&return_time=10:00"

Réponse

Exemple de réponse GET (tous les champs renseignés, aller simple) :

{
  "disclaimer": "Prices shown are real-time and calculated using the same engine as the booking website.",
  "quote_url": "https://booking.alps2alps.com/book/quick-search?from=airport-1&to=resort-11&date=2026-07-22&time=14%3A30&adults=2",
  "route": {
    "from": "Geneva Airport",
    "from_code": "airport-1",
    "to": "Chamonix",
    "to_code": "resort-11",
    "distance_km": 99,
    "duration_minutes": 100,
    "travel_time": "01:40:00"
  },
  "currency": "EUR",
  "passengers": {
    "adults": 4,
    "children": 2,
    "child_ages": [8, 12],
    "infants": 0,
    "child_seats": 0,
    "boosters": 0
  },
  "outbound": {
    "pick_up_date_time": "2026-07-22 14:30:00",
    "luggage": {
      "normal_suitcases": 2,
      "ski_equipment": 0
    },
    "vehicles": [
      {
        "vehicle_type_id": 10,
        "name": "Standard minivan",
        "price": 247,
        "max_passengers": 8,
        "max_luggage": 8,
        "offer_code": "requested",
        "total_price": null,
        "booking_url": "https://booking.alps2alps.com/book/quick-checkout?from=airport-1&to=resort-11&date=2026-07-22&time=14%3A30&adults=4&children=2&vehicle=10"
      },
      {
        "vehicle_type_id": 4,
        "name": "VIP",
        "price": 418.50,
        "max_passengers": 7,
        "max_luggage": 7,
        "offer_code": "requested",
        "total_price": null,
        "booking_url": "https://booking.alps2alps.com/book/quick-checkout?from=airport-1&to=resort-11&date=2026-07-22&time=14%3A30&adults=4&children=2&vehicle=4"
      }
    ]
  },
  "return": null,
  "promo_code_applied": false
}

Pour un aller-retour, chaque véhicule dans les deux outbound et return les blocs comportent en outre un total_price:

{
  "vehicle_type_id": 11,
  "name": "Standard XL minivan",
  "price": 257.21,
  "max_passengers": 8,
  "max_luggage": 8,
  "offer_code": "requested",
  "total_price": 473.81,
  "booking_url": "https://booking.alps2alps.com/book/quick-checkout?from=airport-1&to=resort-11&..."
}

Champs en lecture seule (null (lorsque tu utilises la méthode POST) :

  • quote_url — Lien prêt à l'emploi pour l'étape 2, prérempli avec tous les paramètres de recherche actuels. Utilise-le lorsque l'utilisateur n'a pas encore choisi de véhicule.
  • vehicles[].booking_url — un lien vers l'étape 3 du paiement, prêt à l'emploi pour chaque véhicule, avec ce véhicule déjà sélectionné. Une fois que l'utilisateur a choisi un véhicule, transmets-lui directement cette URL.

Remarque sur l'encodage des URL : Le quote_url et booking_url les valeurs de la réponse JSON utilisent un littéral & caractère pour séparer les paramètres de requête (par ex. …children=2&currency=EUR), ce qui est correct pour les chaînes d'URL dans les fichiers JSON. Certains outils — notamment certains panneaux DevTools des navigateurs et certaines interfaces de chat IA — peuvent afficher visuellement &currency comme ¤cy parce que &curren Il s'agit d'une entité HTML (le symbole ¤). C'est un artefact d'affichage sans incidence. L'URL réelle renvoyée par l'API est correcte. Copie la valeur brute de la réponse JSON, et non celle d'une vue HTML rendue.

Champs présents à la fois dans les requêtes GET et POST :

  • route.from_code / route.to_code — les codes de localisation indiqués dans la requête.
  • passengers — la configuration complète du passager une fois les paramètres par défaut appliqués. Comprend child_ages (tableau d'entiers, ou null (si ce n'est pas fourni ou dans une requête POST).
  • outbound.luggage / return.luggage — les bagages pris en compte pour le calcul du prix de chaque trajet (normal_suitcases, ski_equipment). Indique le type de moteur utilisé.
  • vehicles[].max_passengers — nombre maximal de passagers que ce véhicule peut transporter. Tous les véhicules proposés ont déjà passé le filtre de capacité ; leur adéquation avec le groupe est donc confirmée.
  • vehicles[].max_luggage — nombre maximal de valises que ce véhicule peut transporter.
  • vehicles[].total_priceAllers-retours uniquement. Le prix total pour ce type de véhicule sur les deux trajets, arrondi à deux décimales. null pour les allers simples. N'essaie pas de calculer manuellement le prix des trajets — utilise total_price lors de l'affichage du coût total du trajet.

Champs de saisie du code promo :

Lorsqu'une offre promotionnelle valide a été appliquée :

"promo_code": "AMI10",
"promo_code_applied": true,
"promo_code_discount": { "type": "percent", "value": 5 }

Lorsqu'un code promotionnel a été saisi mais qu'il n'est pas valable pour cet itinéraire, cette date ou ce groupe :

"promo_code": "AMI10",
"promo_code_applied": false,
"promo_code_message": "Promo code is not valid for this route, date, or group."

Erreurs

  • 400 INVALID_PARAMS — corps vide, échec de la validation ou date incorrecte.
  • 400 CURRENCY_NOT_SUPPORTED — devise ne figurant pas dans la liste des devises actives (GET et POST).
  • 404 ROUTE_NOT_FOUND — La combinaison de codes de localisation ne correspond à aucun itinéraire actif.
  • 422 UNSUPPORTED_ROUTE — de gare à gare, de station à station, ou d'autres combinaisons non prises en compte par le système.
  • 422 MANUAL_BOOKING_REQUIRED — L'itinéraire nécessite une intervention manuelle.
  • 429 RATE_LIMITED — Trop de requêtes provenant de cette adresse IP. Patiente un peu et réessaie.
  • 500 INTERNAL_ERROR — Le moteur de tarification a généré une exception non reconnue.

Exemple POST

Aller simple :

curl -X POST -H "Content-Type: application/json" \
  -d '{
        "route_from_code": "airport-1",
        "route_to_code": "resort-11",
        "outbound_date": "2026-07-22",
        "outbound_time_hours": 14,
        "outbound_time_minutes": 30,
        "outbound_selected_time_is_flight": 1,
        "is_return": 0,
        "adult_count": 2,
        "luggage_count": 2,
        "currency_code": "EUR"
      }' \
  "https://booking.alps2alps.com/api/public/v1/transfer-options"

Aller-retour, 2 adultes + 1 enfant + 3 bagages (scénario réaliste de conversation avec une IA) :

curl -X POST -H "Content-Type: application/json" \
  -d '{
        "route_from_code": "airport-1",
        "route_to_code": "resort-11",
        "outbound_date": "2026-07-22",
        "outbound_time_hours": 14,
        "outbound_time_minutes": 30,
        "outbound_selected_time_is_flight": 1,
        "is_return": 1,
        "adult_count": 2,
        "children_count": 1,
        "luggage_count": 3,
        "currency_code": "EUR",
        "return_date": "2026-07-29",
        "return_time_hours": 10,
        "return_time_minutes": 0,
        "return_selected_time_is_flight": 0,
        "return_adult_count": 2,
        "return_children_count": 1,
        "return_luggage_count": 3
      }' \
  "https://booking.alps2alps.com/api/public/v1/transfer-options"

Accepte le même corps que /transfer-options plus quelques champs à remplir au préalable (facultatifs). Renvoie une URL à usage unique valable pour 24 heures. Utilise cette interface de programmation d'application (API) lorsque tu as besoin de préremplir des informations relatives à une aide à la mobilité, un numéro de vol ou des remarques pour le chauffeur lors de la réservation — pour tout le reste, l' booking_url champ dans le /transfer-options La réponse GET est plus simple.

Champs supplémentaires du corps

ChampTypeNotes
outbound_vehicle_type_idintFacultatif. Par défaut, c'est le véhicule de départ le moins cher disponible.
return_vehicle_type_idintFacultatif. Utilisé uniquement lorsque is_return = 1.
outbound_flight_numberchaîneFacultatif. Caractères alphanumériques + tiret, 16 caractères maximum.
return_flight_numberchaîneFacultatif. Utilisé uniquement lorsque is_return = 1.
accommodation_idintFacultatif. Doit être un identifiant renvoyé par /accommodations et à moins de 10 km de la station où passe l'itinéraire.
additional_infochaîneFacultatif. Note du conducteur (texte libre). 1 000 caractères maximum.
return_additional_infochaîneFacultatif. Note du chauffeur pour le trajet retour. À utiliser uniquement lorsque is_return = 1.

Réponse

{
  "checkout_url": "https://alps2alps.com/book/public-checkout/8f1c2c…",
  "expires_at":   "2026-05-28 09:14:22",
  "currency":     "EUR",
  "promo_code_applied": true
}

Erreurs

Toutes les erreurs provenant de /transfer-options, et aussi :

  • 400 INVALID_PARAMSaccommodation_id n'est pas un nombre entier positif.
  • 400 VALIDATION_ERROR — Identifiant de l'hébergement inconnu, hors du rayon de la station de la piste, ou la piste n'a pas de côté station.
  • 422 NO_BOOKABLE_VEHICLE — aucun véhicule n'avait de prix valable sur cet itinéraire.
  • 429 RATE_LIMITED — Trop de requêtes provenant de cette adresse IP. Patiente un peu et réessaie.
  • 500 INTERNAL_ERROR — Impossible de sauvegarder le lien vers la page de paiement.

Exemple

curl -X POST -H "Content-Type: application/json" \
  -d '{
        "route_from_code": "airport-1",
        "route_to_code": "resort-11",
        "outbound_date": "2026-07-22",
        "outbound_time_hours": 14,
        "outbound_time_minutes": 30,
        "outbound_selected_time_is_flight": 1,
        "is_return": 0,
        "adult_count": 2,
        "luggage_count": 2,
        "currency_code": "EUR",
        "outbound_vehicle_type_id": 4,
        "outbound_flight_number": "BA123",
        "accommodation_id": 38959,
        "additional_info": "Please call on arrival."
      }' \
  "https://booking.alps2alps.com/api/public/v1/checkout-link"

Une famille d'endpoints GET sans état qui permet à des agents IA simples et à des outils de chat de gérer le processus de réservation à l'aide d'URL simples — pas besoin de POST, pas d'enregistrement dans la base de données, pas de date d'expiration. Dans la plupart des cas, le quote_url et booking_url champs renvoyés par GET /transfer-options sont déjà générées pour toi — la méthode de création manuelle d'URL ci-dessous est destinée aux cas où tu as besoin d'un contrôle total sur les paramètres ou où tu ne peux pas effectuer d'appel API préalable.

Le compromis par rapport à POST /checkout-link: les liens directs ne peuvent pas contenir d'identifiant de réservation, de numéro de vol ou de remarques en texte libre destinées au chauffeur (ces éléments nécessitent une validation côté serveur). Utilise POST /checkout-link quand tu as besoin d'un petit plus.

Correspondance entre les alias conviviaux et les champs canoniques

Ces trois points de terminaison de liens profonds traduisent les mêmes alias de chaînes de requête compactes. L'URL minimale viable est simplement from + to + date + time.

Sortant / partagé :

AliasChamp canoniqueDéfautNotes
fromroute_from_codeObligatoire. Par exemple : airport-1
toroute_to_codeObligatoire. Par exemple : resort-11
dateoutbound_dateObligatoire. YYYY-MM-DD
timeoutbound_time_hours + _minutesObligatoire. HH:MM. Considéré par défaut comme l'heure d'arrivée du vol (is_flight=1). Définir is_flight=0 pour connaître l'heure exacte de retrait.
is_flightoutbound_selected_time_is_flight11 = time L'arrivée du vol et la prise en charge sont calculées. 0 = time C'est l'heure exacte de l'enlèvement.
adultsadult_count2
childrenchildren_count0
child_ages— (GET uniquement)Âges des enfants séparés par des virgules, par exemple : 8,12. Repris dans passengers.child_ages et conservées dans les URL générées. À titre indicatif uniquement.
infantsinfant_count0
child_seatschildren_age_seat_count0
boosterschildren_age_booster_count0
luggageluggage_count2
ski_bagsskibag_count0
skihas_ski_equipment0
currencycurrency_codeEURRetour des codes inconnus/inactifs 400 CURRENCY_NOT_SUPPORTED sur les points de terminaison JSON. Les liens profonds du navigateur (quick-search, quick-checkout) reviennent automatiquement à l'euro, pour qu'une valeur obsolète n'interrompe jamais le parcours d'un utilisateur dans l'entonnoir.
promopromo_codeMême comportement « silencieux en cas d'échec » que le POST

Aller-retour — n'importe quel return_* paramètre (ou return=1) active implicitement is_return=1. Champs de retour omis mise en miroir automatique la valeur de sortie correspondante, donc l'URL de retour la plus simple est simplement …&return_date=…&return_time=…:

AliasChamp canoniqueRéglage par défaut de la répliqueNotes
return_toreturn_route_to_codesortant from
return_datereturn_date
return_timereturn_time_hours + _minutesConsidéré par défaut comme l'heure de départ du vol (return_is_flight=1). L'heure de prise en charge à l'hôtel sera avancée. Définis return_is_flight=0 pour connaître l'heure exacte de prise en charge à la station.
return_is_flightreturn_selected_time_is_flightsortant is_flight1 = return_time C'est l'heure de départ du vol ; l'heure de prise en charge est calculée automatiquement. 0 = return_time C'est l'heure exacte de prise en charge à l'hôtel.
return_adultsreturn_adult_countsortant adults
return_childrenreturn_children_countsortant children
return_child_ages— (GET uniquement)sortant child_agesÂges des enfants séparés par des virgules pour le trajet retour. Conservés uniquement dans les URL générées.
return_infantsreturn_infant_countsortant infants
return_child_seatsreturn_children_age_seat_countsortant child_seats
return_boostersreturn_children_age_booster_countsortant boosters
return_luggagereturn_luggage_countsortant luggage
return_ski_bagsreturn_skibag_countsortant ski_bags
return_skireturn_has_ski_equipmentsortant ski

Clés de requête inconnues (par ex. utm_source=…) sont ignorés sans avertissement.

3a. GET /api/public/v1/transfer-options (citation)

Même format de réponse que la variante POST. Renvoie du JSON, ne stocke jamais rien. La réponse comprend quote_url et par véhicule booking_url des champs prêts à l'emploi.

Aller simple :

curl "https://booking.alps2alps.com/api/public/v1/transfer-options?from=airport-1&to=resort-11&date=2026-07-22&time=14:30&adults=2&luggage=2&currency=EUR"

Aller-retour, 2 adultes + 1 enfant + 3 bagages — car les champs de retour reflètent automatiquement ceux de l'envoi, uniquement return_date et return_time Il faut ajouter :

curl "https://booking.alps2alps.com/api/public/v1/transfer-options?from=airport-1&to=resort-11&date=2026-07-22&time=14:30&adults=2&children=1&luggage=3&return_date=2026-07-29&return_time=10:00"

3b. GET /book/quick-search (passe à l'étape 2)

Lien profond sans état qui redirige le navigateur vers Étape 2 de l'entonnoir de réservation (sélection du véhicule) avec les prix déjà calculés. Cela correspond à la quote_url renvoyé par GET /transfer-options. Utile lorsque tu souhaites créer le lien manuellement sans passer par un appel API préalable.

Aller simple :

Aller-retour, 2 adultes + 1 enfant + 3 bagages :

Les erreurs (erreur de validation, route non prise en charge, route introuvable, date incorrecte) redirigent vers /book/?step=1 L'utilisateur arrive donc directement sur le formulaire de réservation — il ne voit jamais de page d'erreur.

3c. GET /book/quick-checkout (passe à l'étape 3)

Équivalent sans état de POST /checkout-link. Redirige le navigateur vers Étape 3 (Tes informations) avec le paramètre « funnel » récupéré dans la chaîne de requête. Équivalent à la booking_url champ sur chaque véhicule dans le GET /transfer-options réponse. Le vehicle Ce paramètre sélectionne automatiquement le type de véhicule.

Aller simple, véhicule déjà sélectionné :

Aller-retour, 2 adultes + 1 enfant + 3 bagages, véhicule choisi à l'avance :

En plus quick-checkout paramètres :

AliasNotes
vehicleSortie vehicle_type_id de /transfer-options. Si tu ne le précises pas, le système sélectionne automatiquement le véhicule le moins cher.
return_vehicleType de véhicule pour le trajet retour. Par défaut : vehicle pour les allers-retours.

accommodation_id, les numéros de vol et les notes du chauffeur sont pas pris en charge dans le flux GET. Utilise POST /checkout-link pour ceux-là.

POST ou GET — lequel choisir ?

BesoinUtilisation
Uniquement JSON, contrôle total, de machine à machinePOST /api/public/v1/transfer-options
Citer une URL (chat, e-mail, blog)GET /api/public/v1/transfer-options
Transfert de l'utilisateur vers le préparateur de commandes (étape 2) — utilise le modèle prêt à l'emploi quote_url à partir de la réponse, ou créer manuellementGET /book/quick-search
Dirige l'utilisateur vers l'étape 3 avec un véhicule déjà sélectionné — utilise le modèle prêt à l'emploi booking_url à partir de la réponse, ou créer manuellementGET /book/quick-checkout
Redirige l'utilisateur vers l'étape 3 avec les informations sur l'hébergement / les notes du chauffeur / les numéros de vol / un lien valable 24 heuresPOST /api/public/v1/checkout-link

Enveloppe d'erreur et codes d'erreur

Toutes les erreurs partagent la même structure JSON :

{ "error": { "code": "UNSUPPORTED_ROUTE", "message": "The routes from station to station is not supported" } }
HTTPCodeQuand
400INVALID_PARAMSChamps de requête manquants ou non valides, dates mal formatées ou échecs de validation.
400CURRENCY_NOT_SUPPORTEDCode de devise inconnu ou inactif sur un point de terminaison JSON (GET ou POST).
400VALIDATION_ERRORaccommodation_id introuvable, hors de portée ou non applicable à cet itinéraire.
404RESORT_NOT_FOUND/accommodations n'a pas pu résoudre le problème.
404ROUTE_NOT_FOUNDLa combinaison de codes de localisation ne correspond à aucun itinéraire actif.
422UNSUPPORTED_ROUTEFunnel rejette cette combinaison de type de destination (par exemple, de gare à gare).
422MANUAL_BOOKING_REQUIREDCet itinéraire nécessite une gestion manuelle ; il n'est pas possible de le réserver en ligne.
422NO_BOOKABLE_VEHICLEAucun véhicule n'avait de prix valable sur cet itinéraire.
429RATE_LIMITEDLimite de requêtes par IP dépassée. Attends un peu, puis réessaie avec un délai d'attente exponentiel.
500INTERNAL_ERRORBloc de capture pour toutes les autres exceptions non gérées.

Limites de débit

L'API ne nécessite aucune authentification et est soumise à une limitation de débit par adresse IP du client. Lorsque la limite est dépassée, l'API renvoie un statut HTTP 429 avec l'enveloppe d'erreur type :

{ "error": { "code": "RATE_LIMITED", "message": "Too many requests. Please slow down and retry." } }
  • Espace tes demandes. Un processus complet typique comprend 3 à 4 appels : locations/searchtransfer-options → si tu veux checkout-link. Les points de terminaison de tarification ont une limite inférieure à celle des points de terminaison de recherche.
  • Sur un 429, attends un peu et réessaie en utilisant un délai d'attente exponentiel plutôt que de réessayer tout de suite.
  • Adresses IP partagées — les utilisateurs connectés via une adresse IP partagée (par exemple, celle d'un bureau) partagent le même quota et peuvent atteindre la limite plus rapidement.
  • Tu as besoin d'un quota plus élevé ? Contacte-nous : on peut mettre en place un quota par clé pour les intégrations en production.

Les chiffres exacts par minute ne sont pas publiés, c'est un choix délibéré qui permet de les ajuster sans modifier le contrat. Considère 429 comme un « ralentissement », et non comme une panne définitive.


Devises

Passe un code de devise ISO 4217 valide currency_code (POST) ou currency (GET alias) — par exemple EUR, GBP, CHF, USD. La valeur par défaut est EUR.

  • Points de terminaison JSON (GET et POST /transfer-options, POST /checkout-link) — un code de devise inconnu ou inactif est renvoyé 400 CURRENCY_NOT_SUPPORTED. Les agents qui appellent ces points de terminaison doivent gérer cette erreur plutôt que de se rabattre sur un EUR par défaut.
  • Liens profonds dans le navigateur (/book/quick-search, /book/quick-checkout) — un invalide currency= La valeur revient automatiquement à l'euro, ce qui évite qu'un paramètre obsolète ne perturbe le parcours d'un utilisateur dans l'entonnoir.

Pour les réponses qui ne sont pas en euros, le disclaimer champ dans /transfer-options Note que le montant total de la commande peut varier légèrement en raison des taux de change en temps réel (fournis par la BCE, comme sur le site de réservation).


Codes promo

Passer promo_code (POST) ou promo (GET alias) sur l'un ou l'autre /transfer-options ou /checkout-link. Le code est validé côté serveur. Si la validation échoue ou si le service promotionnel est temporairement inaccessible, le code est ignoré en silence et promo_code_applied retours false — la requête aboutit quand même.

Lorsqu'un code est envoyé mais n'est pas appliqué, la réponse contient promo_code (extrait du code envoyé) et promo_code_message en expliquant pourquoi il n'a pas été pris en compte (par exemple, le code a expiré ou n'est pas valable pour l'itinéraire choisi). promo_code_applied reste false. La requête aboutit quand même : les prix sont renvoyés au tarif plein.

Lorsqu'une offre promotionnelle est appliquée sur /transfer-options, la réponse comprend promo_code_discount avec un type (par exemple "percent") et value. Consulte la section « Réponse » ci-dessus pour les deux cas de figure concernant les codes promotionnels.


CORS et méthodes HTTP

L'API est accessible depuis un navigateur sans configuration supplémentaire :

  • Access-Control-Allow-Origin: *
  • Access-Control-Allow-Headers: Content-Type, Accept
  • Access-Control-Allow-Methods: GET, POST, OPTIONS
  • OPTIONS La vérification préalable renvoie un code HTTP 204 sans corps.
  • La validation CSRF est désactivée sur tous les points de terminaison de l'API publique.