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.
https://booking.alps2alps.com/api/public/v1/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.).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) :
GET /api/public/v1/locations/search?q=Geneva→ convertir les noms en codes (airport-1,resort-11,train_station-7,city-48).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-linksurtout 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=….
Tout ce dont tu as besoin pour l'intégration est accessible via les liens contenus dans ces fichiers de découverte :
https://booking.alps2alps.com/.well-known/api-catalog — Catalogue des API de l'IETF.https://booking.alps2alps.com/.well-known/agent-skills/index.json — Liste des compétences de l'agent IA avec des modèles d'URL, des alias faciles à retenir et des exemples de requêtes.https://booking.alps2alps.com/openapi/public-v1.json — Spécification complète OpenAPI 3.1 (v1.4.0)./locations/search pour convertir les noms de l'utilisateur pour le départ et l'arrivée en airport-… / resort-… / city-… codes./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./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.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.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 :
GET /locations/search?q=… pour convertir les noms en codes.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é./api/public/v1/locations/searchRecherche les lieux de prise en charge et de restitution pris en charge : stations balnéaires, aéroports, gares et villes.
| Paramètre | Obligatoire | Notes |
|---|---|---|
q | Oui | Terme de recherche. Les chaînes de moins de 2 caractères renvoient un tableau vide. |
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" }
]
400 INVALID_PARAMS — q Ce paramètre manque complètement.curl "https://booking.alps2alps.com/api/public/v1/locations/search?q=cham"
→ Essaie-le en direct : cherche « Genève »
/api/public/v1/accommodationsRecherche 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ètre | Obligatoire | Défaut | Notes |
|---|---|---|---|
resort_id | Oui | — | Identifiant numérique du complexe à partir d'un resort-{id} code de localisation. |
q | Oui | — | Sous-chaîne du nom de l'établissement (sans tenir compte des accents). Minimum 2, maximum 100 caractères. |
limit | Non | 20 | Limité à 50. |
{
"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
idles valeurs renvoyées par ce point de terminaison peuvent être transmises à/checkout-linkcommeaccommodation_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.
400 INVALID_PARAMS — resort_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.curl "https://booking.alps2alps.com/api/public/v1/accommodations?resort_id=11&q=clos"
→ Essaie-le en direct : cherche « clos » près de Chamonix (station n° 11)
/api/public/v1/transfer-optionsRenvoie 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 :
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.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,
timeetreturn_timesont interprétés comme vol fois (is_flightetreturn_is_flightpar défaut1). 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=0et/oureturn_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_timeretour à l'utilisateur — ce sont les horaires que le chauffeur va réellement utiliser.Exemple : Une demande avec
return_time=18:00et la valeur par défautreturn_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.
Accepte application/json ou application/x-www-form-urlencoded.
| Champ | Type | Obligatoire | Notes |
|---|---|---|---|
route_from_code | chaîne | Oui | par exemple airport-1 |
route_to_code | chaîne | Oui | par exemple resort-11 |
outbound_date | chaîne | Oui | YYYY-MM-DD |
outbound_time_hours | int | Oui | 0–23 |
outbound_time_minutes | int | Oui | 0–59 |
outbound_selected_time_is_flight | int (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_return | int (0/1) | Non (valeur par défaut : 0) | Quand 1, tous return_* ces champs sont obligatoires |
adult_count | int | Oui | ≥ 1 |
children_count | int | Non | |
infant_count | int | Non | |
children_age_seat_count | int | Non | Nombre d'enfants en âge d'utiliser un siège enfant |
children_age_booster_count | int | Non | Nombre d'enfants en âge d'utiliser un rehausseur |
luggage_count | int | Non | |
skibag_count | int | Non | |
has_ski_equipment | int (0/1) | Non | |
currency_code | chaîne | Non (par défaut : EUR) | ISO 4217. Retour des codes inconnus/inactifs 400 CURRENCY_NOT_SUPPORTED. |
promo_code | chaîne | Non | Ignoré 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.
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ètre | Type | Obligatoire | Description |
|---|---|---|---|
child_ages | chaîne | Non | Les â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_ages | chaîne | Non | C'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, etchild_seats/boostersce qui compte, ce n'est pas l'âge de chaque enfant. Lechild_agesCe 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 lechild_seatsetboostersparamètres.
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"
→ Essaie en direct : Aéroport de Genève → Chamonix, aller simple
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"
→ Essaie en ligne : aller-retour, 2 adultes + 1 enfant + 3 bagages
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_urletbooking_urlles 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¤cy=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¤cycomme¤cyparce que¤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. Comprendchild_ages(tableau d'entiers, ounull(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_price— Allers-retours uniquement. Le prix total pour ce type de véhicule sur les deux trajets, arrondi à deux décimales.nullpour les allers simples. N'essaie pas de calculer manuellement le prix des trajets — utilisetotal_pricelors 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."
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.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"
/api/public/v1/checkout-linkAccepte 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.
| Champ | Type | Notes |
|---|---|---|
outbound_vehicle_type_id | int | Facultatif. Par défaut, c'est le véhicule de départ le moins cher disponible. |
return_vehicle_type_id | int | Facultatif. Utilisé uniquement lorsque is_return = 1. |
outbound_flight_number | chaîne | Facultatif. Caractères alphanumériques + tiret, 16 caractères maximum. |
return_flight_number | chaîne | Facultatif. Utilisé uniquement lorsque is_return = 1. |
accommodation_id | int | Facultatif. Doit être un identifiant renvoyé par /accommodations et à moins de 10 km de la station où passe l'itinéraire. |
additional_info | chaîne | Facultatif. Note du conducteur (texte libre). 1 000 caractères maximum. |
return_additional_info | chaîne | Facultatif. Note du chauffeur pour le trajet retour. À utiliser uniquement lorsque is_return = 1. |
{
"checkout_url": "https://alps2alps.com/book/public-checkout/8f1c2c…",
"expires_at": "2026-05-28 09:14:22",
"currency": "EUR",
"promo_code_applied": true
}
Toutes les erreurs provenant de /transfer-options, et aussi :
400 INVALID_PARAMS — accommodation_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.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.
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é :
| Alias | Champ canonique | Défaut | Notes |
|---|---|---|---|
from | route_from_code | — | Obligatoire. Par exemple : airport-1 |
to | route_to_code | — | Obligatoire. Par exemple : resort-11 |
date | outbound_date | — | Obligatoire. YYYY-MM-DD |
time | outbound_time_hours + _minutes | — | Obligatoire. 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_flight | outbound_selected_time_is_flight | 1 | 1 = 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. |
adults | adult_count | 2 | |
children | children_count | 0 | |
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. |
infants | infant_count | 0 | |
child_seats | children_age_seat_count | 0 | |
boosters | children_age_booster_count | 0 | |
luggage | luggage_count | 2 | |
ski_bags | skibag_count | 0 | |
ski | has_ski_equipment | 0 | |
currency | currency_code | EUR | Retour 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. |
promo | promo_code | — | Mê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=…:
| Alias | Champ canonique | Réglage par défaut de la réplique | Notes |
|---|---|---|---|
return_to | return_route_to_code | sortant from | |
return_date | return_date | — | |
return_time | return_time_hours + _minutes | — | Considé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_flight | return_selected_time_is_flight | sortant is_flight | 1 = 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_adults | return_adult_count | sortant adults | |
return_children | return_children_count | sortant 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_infants | return_infant_count | sortant infants | |
return_child_seats | return_children_age_seat_count | sortant child_seats | |
return_boosters | return_children_age_booster_count | sortant boosters | |
return_luggage | return_luggage_count | sortant luggage | |
return_ski_bags | return_skibag_count | sortant ski_bags | |
return_ski | return_has_ski_equipment | sortant ski |
Clés de requête inconnues (par ex. utm_source=…) sont ignorés sans avertissement.
/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¤cy=EUR"
→ Essaie en direct : Aéroport de Genève → Chamonix, aller simple
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"
→ Essaie en ligne : aller-retour, 2 adultes + 1 enfant + 3 bagages
/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.
/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 :
| Alias | Notes |
|---|---|
vehicle | Sortie 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_vehicle | Type 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. UtilisePOST /checkout-linkpour ceux-là.
| Besoin | Utilisation |
|---|---|
| Uniquement JSON, contrôle total, de machine à machine | POST /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 manuellement | GET /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 manuellement | GET /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 heures | POST /api/public/v1/checkout-link |
Toutes les erreurs partagent la même structure JSON :
{ "error": { "code": "UNSUPPORTED_ROUTE", "message": "The routes from station to station is not supported" } }
| HTTP | Code | Quand |
|---|---|---|
| 400 | INVALID_PARAMS | Champs de requête manquants ou non valides, dates mal formatées ou échecs de validation. |
| 400 | CURRENCY_NOT_SUPPORTED | Code de devise inconnu ou inactif sur un point de terminaison JSON (GET ou POST). |
| 400 | VALIDATION_ERROR | accommodation_id introuvable, hors de portée ou non applicable à cet itinéraire. |
| 404 | RESORT_NOT_FOUND | /accommodations n'a pas pu résoudre le problème. |
| 404 | ROUTE_NOT_FOUND | La combinaison de codes de localisation ne correspond à aucun itinéraire actif. |
| 422 | UNSUPPORTED_ROUTE | Funnel rejette cette combinaison de type de destination (par exemple, de gare à gare). |
| 422 | MANUAL_BOOKING_REQUIRED | Cet itinéraire nécessite une gestion manuelle ; il n'est pas possible de le réserver en ligne. |
| 422 | NO_BOOKABLE_VEHICLE | Aucun véhicule n'avait de prix valable sur cet itinéraire. |
| 429 | RATE_LIMITED | Limite de requêtes par IP dépassée. Attends un peu, puis réessaie avec un délai d'attente exponentiel. |
| 500 | INTERNAL_ERROR | Bloc de capture pour toutes les autres exceptions non gérées. |
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." } }
locations/search → transfer-options → si tu veux checkout-link. Les points de terminaison de tarification ont une limite inférieure à celle des points de terminaison de recherche.429, attends un peu et réessaie en utilisant un délai d'attente exponentiel plutôt que de réessayer tout de suite.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.
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.
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./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).
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.
L'API est accessible depuis un navigateur sans configuration supplémentaire :
Access-Control-Allow-Origin: *Access-Control-Allow-Headers: Content-Type, AcceptAccess-Control-Allow-Methods: GET, POST, OPTIONSOPTIONS La vérification préalable renvoie un code HTTP 204 sans corps.