Rate shopping · relevé de terrain · août 2026
Échantillon aléatoire de sites d'hôtels français, page d'accueil aspirée, moteur identifié sur l'URL réelle du bouton « Réserver ». Le classement ci-dessous est un relevé, pas une intuition marché.
website)Part des 1 326 sites répondants. Un même hôtel peut compter deux fois (moteur direct + repli OTA). Les 36 % restants chargent leur moteur par widget JavaScript après clic : ils se répartissent très probablement comme le haut de ce tableau, ce qui en fait un plancher, pas un plafond.
| Moteur | Hôtels | Empreinte URL observée | État / mode |
|---|---|---|---|
| D-EDGEex-Availpro + Fastbooking | 231 17,4 % | moteur secure-hotel-booking.com/{canal}/{slug}/{CODE}/{locale} — fermé lecture : widgets.secure-hotel-booking.com/{slug}/{CODE}/0/{locale}/BestPrice repli BigCalendar · aussi websdk.d-edge.com · redirect.fastbooking.com |
opérationnel · http prix d'appel par nuit ( basis: night) — le moteur, lui, reste interdit par robots.txt + DataDome |
| Reservit+ marque blanche Logis | 217 16,4 % | secure.reservit.com · premium.logishotels.com/fo/booking/{custid}/{hotelid} aussi reservit.otelico.net, seh-hotels.reservit.com |
opérationnel |
| Misterbooking | 45 3,4 % | secure-direct-hotel-booking.com/module_booking_engine/index.php?id_etab={md5} même chemin sur misterbooking.com/booking_engine/ |
opérationnel · http prix vitrine, occupation non appliquée · grille /calendar sans montant (restrictions seules) |
| Thais | 31 2,3 % | {instance}.thais-hotel.com/direct-booking | opérationnel |
| My Groom Servicemoteur « Neo », agence FR | 30 2,3 % | neo-direct-booking.com/{CODE}[/{langue}] données : POST neo.my-groom-service.com/api/public/roomtypes/{id}grille : GET /api/public/smartcalendar/{slug} |
opérationnel http grille /calendar : toute la plage en un appel, prix d'appel par nuit (basis: night) |
| Booking.comrepli OTA | 30 2,3 % | booking.com/hotel/{cc}/{slug}.html grille : POST /fragment.{langue}.json — hotel.availability_calendar |
opérationnel · repli http/calendar couvert : 62 dates par appel, durée et occupation honorées — prix OTA |
| Mews Distributor | 29 2,2 % | app.mews.com/distributor/{guid} | opérationnel |
| SynXisSabre — chaînes, Best Western | 22 1,7 % | be.synxis.com/?chain={id}&hotel={id}&level=hotel données : POST /gw/product/v1/getProductAvailability |
reconnu · Incapsula + hCaptcha voie ouverte : API partenaire Aven Hospitality |
| Elloha | 19 1,4 % | reservation.elloha.com/?idPublication={uuid}&idoi={uuid} | à faire |
| Amadeus iHotelierex-TravelClick · The Originals | 17 1,3 % | reservations.travelclick.com/{hotelId} marque blanche {domaine client}/…/book/accommodations?HotelId={id} données : POST api.amd.galaxy.tf/be5-shop/v2/hotels/{id}/avail |
opérationnel http |
| SiteMinder | 16 1,2 % | direct-book.com/[{groupe}/]properties/{slug} legacy app.thebookingbutton.com/properties/{slug} données : POST direct-book.com/api/graphql — settings + roomTypes + quoteSetsgrille : GET /api/properties/{slug}/availability |
opérationnel http |
| Mirai | 16 1,2 % | reservation.mirai.com/XMAS/reservation/miraiFrontDispatcher.htm?idtokenprovider={id} | à faire |
| eviivo | 13 1,0 % | fr-securebooking.eviivo.com/mywebsite/{code}.home | à faire |
| Amenitiz | 13 1,0 % | {slug}.amenitiz.io/{lang}/booking/room API interne /api_public/v1/client_booking_engine/… |
à faire · Cloudflare |
| Octorate | 12 0,9 % | book.octorate.com/octobook/site/reservation/calendar.xhtml?codice={id} | à faire |
| Asterio | 11 0,8 % | {slug}-booking.myasterio.com/betemplate/{tpl}/…?kml_code={code} | à faire |
| WuBook | 10 0,8 % | widget wubook.net/js/nebk/bwidget.jgz — moteur hébergé chez l'hôtel | à faire |
| RoomCloud | 5 0,4 % | booking.roomcloud.net/be/se2/hotel.jsp?hotel={id} aussi écrit ?hotel_property={id} sur les liens sortantsdonnées : la page elle-même — var contentHotels + var rc_products + var jSonAmounts |
opérationnel http une seule requête GET, sans cookie ni jeton : pas de robots.txt, pas de WAF. La page dépose son propre modèle JSON, c'est lui qu'on lit — pas le rendu./calendar couvert, mais sans montant : le moteur ne publie aucun prix par date |
Un rate shopper utile veut le prix par date, pas pour une date. Interroger jour par jour est impraticable — soixante appels par hôtel, et jusqu'à dix secondes chacun quand il faut piloter un tunnel. La question est donc : quels moteurs publient une surface multi-dates, et ce que vaut ce qu'ils y mettent. Relevé du 2026-08-29, mesuré sur une plage de soixante jours. Un seul moteur n'en publie aucune et se fait quand même lire — Mews, date par date, en écartant d'avance ce qui ne peut rien vendre.
| Moteur | Surface | Coût / 60 dates | Ce qu'une case vaut |
|---|---|---|---|
| Reservit | POST /api/rs/secure/calendar/price/post/period/0/{du}/{au}61 dates par appel · nightNumber et numAdult honorés |
1 appel1,6 s | recherche de séjour total réel du séjour demandé à chaque date d'arrivée. Le seul du lot à ce niveau — et il supprime le navigateur, que /rates doit encore piloter pour le détail chambre par chambre. |
| iHotelierAmadeus / TravelClick | GET tc.galaxy.tf/tc/shop/v1/hotel/{id}/calendar91 jours par appel · booking_url nomme le roomtypeid et le rateplanid |
1 appel0,16 s | calendrier du moteur meilleur prix d'une nuit, un adulte. Fenêtre imposée : toujours à partir d'aujourd'hui, 90 jours au plus. Sa clé x-galaxy-key appartient au site d'un hôtelier — voir
IHOTELIER_WIDGET_KEY, vide par défaut et délibérément. |
| Thais | GET /hub/api/booking-engine/prices + /availabilitiesplage entière par appel · chaque couple chambre × tarif, avec min/max stay, COA/COD, stop-sell + stay-search sur une seule nuit de référence, quand un tarif porte des articles liés |
2 appels0,7 s +1 si packages · /config en cache |
calendrier du moteur le seul au grain chambre × tarif. L'inventaire seul sous-évaluait (packages et règles d'occupation ignorés) : la grille applique désormais la formule du calendrier du moteur — hébergement à l'occupation demandée, plus le supplément des articles liés mesuré en un séjour de référence. Reste basis: night, jamais sommé ; le drapeau packaged ne marque plus que les tarifs
qu'aucune date de la plage n'ouvrait. |
| D-EDGE | POST widgets.…/{slug}/{CODE}/{id}/{locale}/BigCalendar/GetAvailabilityun mois par appel, jeton anti-forgery émis une seule fois |
2-3 appels1,3 s | calendrier du moteur meilleur prix d'une nuit à l'occupation par défaut, avec MinStay et les fermetures.
L'adapter téléchargeait déjà ce mois entier pour n'en lire qu'une case. |
| SiteMinder | GET direct-book.com/api/properties/{slug}/availabilityun mois calendaire par appel, sans jeton ni cookie · los accepté mais inutilisable |
2-3 appels0,7 s | calendrier du moteur meilleur prix d'une nuit à l'occupation par défaut, avec minStay et les fermetures.
Il colle à la recherche de séjour : trois ancrages contre /rates à un adulte, une nuit,
dans la devise de l'hôtel — 0 % d'écart. Son cache de bord ne retient que checkInsFrom — un
los=1 demandé peut être servi avec le corps d'un los=3 émis une heure plus tôt, en
HTTP 200. La réponse porte sa date et son lengthOfStay : on les confronte à la
question, et on refuse plutôt que de publier 426 € la nuit pour ce qui en vaut 133. |
| My Groom Servicemoteur « Neo » | GET neo.my-groom-service.com/api/public/smartcalendar/{slug}?dates=…toute la plage en un appel — 365 dates tiennent dans une requête, sans jeton ni cookie · prix d'appel, min_stay, COA/COD et stock restant par date · la case nomme l'hébergement et le
plan tarifaire qui portent le prixcette route prend le slug, là où roomtypes exige l'identifiant numérique |
1 appel0,8 s | calendrier du moteur meilleur prix d'une nuit pour une personne, taxe de séjour exclue : exactement ce que /rates facture à cette occupation — 82 € au Canal le 5 octobre, 60 € au Bourguet le 12,
identiques des deux côtés, quand la même date à deux adultes passe à 92 €. Ancrages à
adults=1&nights=1 : 0 % d'écart. Le moteur répond HTTP 500 quand aucune des
dates demandées n'est chargée chez l'hôtelier : l'adapter joint une date-témoin (aujourd'hui) pour
qu'un calendrier vide ne prenne pas l'apparence d'une panne. |
| Mews | aucune surface multi-dates — la grille est construitegetPricing sur trente nuits rend le total d'un séjour de trente nuits,
pas une série ; services/getCalendarData ne rend que les libellés. En revanche
getAvailability couvre toute la plage en un appel, et sert à ne pas tarifer les dates sans stock. |
1 + 1/date8,3 s / 21 dates | recherche de séjour la plus fiable du lot : occupation et durée honorées, détail chambre × tarif, et le moteur applique lui-même ses restrictions — les tarifs de violatedRestrictions ne sont pas dans les prix.
Trois ancrages contre /rates : 0 % d'écart. Seule grille dont le coût croît avec la plage,
d'où le plafond CALENDAR_MAX_PER_DATE_CALLS. |
| Misterbooking | POST ajax.php?fct=ajaxCalendarRestrictionle mois demandé et le suivant, état cumulé de la session · 3 mois déjà publiés en clair dans la page d'entrée ( jsonSearchCalendarParameter) · par hébergement × tarif : ouvert/fermé,
COA/COD, min, max et durée exacte — sans prix |
1-2 appels0,8 s / 91 dates | aucun montant le sélecteur de dates du moteur n'affiche pas un seul prix. Chiffrer une date coûterait un ajaxSelectionPage plus un appel par hébergement — une quinzaine par case. La grille dit donc
ce qui est vendable, durée demandée honorée par la formule du moteur lui-même (isDateBookable) ;
anchors=N achète les prix réels. Un mois que le moteur n'a pas publié est rendu indisponible
et signalé : sa propre carte dates distingue le trou du complet. |
| RoomCloud | POST /be/ajax/be_closed_dates.jspmois entiers par appel, autant qu'on en demande · qnt, COA/COD, min/max |
1-2 appels1,7 s | aucun montant le moteur ne publie aucun prix par date — son propre sélecteur de dates n'en affiche pas un seul. La grille dit ce qui est vendable, durée demandée honorée (nuits ouvertes, COA/COD, min et max stay) ; anchors=N achète les prix réels. Le second appel sert à distinguer un hôtel inconnu —
que cette route rend comme un hôtel entièrement fermé — d'un hôtel réellement complet ; un hôtel reconnu
l'est pour douze heures, et la grille ne coûte alors plus qu'un appel. |
| Booking.comrepli OTA | POST /fragment.{langue}.json — name=hotel.availability_calendar62 dates par appel · los et respect_min_los_restriction honorés ·
l'occupation vient de b_search_config, que la fiche construit elle-mêmela fiche publie l'URL du fragment, b_csrf_token et b_sid : sans le jeton de page
ou sans les cookies qu'elle pose, le fragment répond 403 |
2 appels2,7 s | calendrier du moteur c'est le calendrier que le sélecteur de dates du front mobile affiche — prix OTA, pas le tarif direct. Total réel du séjour demandé : à los=2 les nuits sont additionnées, jamais
doublées, d'où basis: stay. Vingt ancrages contre /rates : dix-sept à 0 %,
et trois à −7,1 % sur deux dates d'arrivée, le prix exact étant inférieur à la grille —
le prix d'appel du calendrier n'attrape pas toutes les remises de la grille des chambres.
b_avg_price_raw est ignoré — "1.9" pour 1 879 €, une pastille et pas un montant. |
Elles pèsent peu en nombre de sites mais énormément en volume de chambres — et ce sont littéralement les concurrents que le yield veut suivre. Chacune expose son propre front, pas un moteur du marché.
| Enseigne | Hôtels | Empreinte URL observée | Remarque |
|---|---|---|---|
| Louvre HotelsKyriad · Campanile · Première Classe · Golden Tulip | 160 domaines OSM | {ville}.kyriad.com · campanile.com · premiereclasse.com · goldentulip.com données : POST api.louvrehotels.com/api/v1/graphql | opérationnel http le front est bien une SPA sous Akamai, mais l'API du groupe est ouverte — et son robots.txt l'autorise nommément |
| Best Western France | 19 1,4 % | bestwestern.fr/infos_hotel.jsp?HotelCode={id} → be.synxis.com | Retombe sur SynXis, donc bloqué comme lui. Le front est lui-même derrière Cloudflare. |
| Brit Hotel | 19 1,4 % | brithotel.fr/client/reservation.html | Front propriétaire. |
| Accor | 18 1,4 % | all.accor.com/hotel/{code}/index.fr.shtml | Ibis / Mercure / Novotel. Front ALL, très protégé. |
| Contact Hôtel | 15 1,1 % | contact-hotel.com/reserver-hotel-france/{id}/{slug}.htm | HTML classique — probablement lisible en HTTP. |
| Citotel | 7 0,5 % | {slug}.galaxy-reservation.fr | Moteur Galaxy, éditeur français. |
2 à 8 hôtels chacun dans l'échantillon. L'intérêt est de savoir les reconnaître :
mieux vaut un UNSUPPORTED_ENGINE nommé qu'un domaine inconnu.
| Moteur | Hôtels | Empreinte URL observée |
|---|---|---|
| Pure Informatique | 8 | book.pure-informatique.com/?locationID={id} |
| Hotelnet SmartBooking | 6 | smartbooking.hotelnet.biz/home/accomodation?hotel={id} |
| Novaresa | 6 | novaresa.net/firm.php?id_firm={id} |
| Overfull | 5 | app.overfull.fr/booking-v2?key_id={id} |
| book-secure.com | 5 | book-secure.com/?property=fr{ville}{id} — derrière DataDome |
| MyGuestDiary | 5 | bookingengine.myguestdiary.com/{id} |
| Vertical Booking | 3 | reservations.verticalbooking.com/premium/index.html?id_albergo={id}&dc={id} |
| Hotel-Spider | 3 | reservations.hotel-spider.com/#/{hash} |
| ResaSecure | 3 | scripts.resasecure.net |
| Booking Channel | 3 | {slug}.booking-channel.com |
| Housity | 2 | housity.net/book_hotel/{slug}/ |
| BookVisit | 2 | online.bookvisit.com/accommodation/list?channelId={uuid} |
| Cubilis (Stardekk) | 1 | reservations.cubilis.eu/{slug}/Rooms/Select |
| Simple Booking · GuestCentric | 1+1 | simplebooking.it/ibe/hotelbooking/search?hid={id} · secure.guestcentric.net |
L'ordre suit le rapport couverture / coût d'implémentation, pas le classement brut.
17,4 % du parc, premier moteur du marché — lu depuis le 29 août 2026. Le moteur de
réservation reste hors d'atteinte et le reste : robots.txt l'interdit et DataDome
y pose un CAPTCHA. Mais D-EDGE publie à côté un widget tarifaire, fait pour être
embarqué chez l'hôtelier, sans robots restrictif ni anti-bot — c'est lui que l'adapter lit,
en deux appels HTTP. Limite assumée : un prix d'appel par nuit, jamais un total de
séjour ; les offres portent basis: night et ne doivent pas être multipliées.
3,4 % — troisième moteur du marché FR, lu en trois appels HTTP. Livré le 29 août 2026.
Limite assumée : le moteur n'applique pas l'occupation demandée avant le tunnel, les prix
rendus sont ceux de la vitrine et meta.warnings le signale. Le calendrier suit
le même jour, en restrictions seules : la surface multi-dates du moteur ne porte aucun
montant, la grille dit donc où le prix existe et anchors=N l'achète.
Corrigé le 17 septembre 2026 : la session du moteur retient les dates de la recherche, et
des lectures concurrentes sur un même hôtel se rendaient les prix les unes des autres. Chaque
lecture a désormais sa propre session.
1,3 % en direct, plus The Originals en entier sur les mêmes identifiants. Livré le
29 août 2026 en deux appels HTTP, sans navigateur : le jeton s'obtient sur
le seul Referer, sans clé ni secret, et vaut pour tous les hôtels.
Limite assumée : le nom de l'hôtel vit derrière un second système de jeton et n'est pas lu.
2,3 % — moteur « Neo », édité par une agence web française. Livré le 29 août 2026.
Le moteur est vendu « 100 % intégré » au site de l'hôtelier, mais il publie aussi son
point d'entrée autonome neo-direct-booking.com/{CODE}, et c'est cette URL
que porte la barre d'adresse. Le tunnel ne calcule rien : il interroge
neo.my-groom-service.com/api/public/*, une API JSON sans jeton ni clé,
ouverte à toutes les origines pour que le site du client puisse l'appeler.
Total du séjour déjà calculé, pension, annulation, taxe de séjour et
disponibilité restante en champs dédiés. Le calendrier a suivi le 29 août 2026 :
smartcalendar/{slug}, la surface que le sélecteur de dates du moteur interroge pour
lui-même, rend toute la plage en un seul GET — prix d'appel, durée minimale,
COA/COD et stock par date. Ce montant vaut exactement ce que /rates facture à
une personne pour une nuit, mesuré sur deux hôtels, d'où
basis: night et une occupation qui n'est pas honorée : la grille donne la forme,
anchors=N donne le niveau. Réserve à garder en tête : les deux hôtes disent
Disallow: / dans leur robots.txt, alors que rien d'autre ne ferme
la porte — arbitrage assumé et documenté dans le README, réversible en retirant l'adapter
du registre.
Le plus gros gisement du parc français — 160 domaines pour Campanile, Kyriad, Première
Classe et Golden Tulip — livré le 29 août 2026 en un seul appel HTTP.
Le front est bien ce qu'annonçait le relevé : une SPA propriétaire derrière
Akamai Bot Manager, qui sert un 403 dès la première requête à un Chromium
headless. Mais la chaîne publie à côté une API GraphQL dont le robots.txt
dit : Disallow: / puis Allow: /api/v1/graphql — l'autorisation
est écrite. C'est cette porte-là que l'adapter prend, avec l'opération
searchRoomsQuery, celle que le mini-site émet lui-même.
Total du séjour déjà calculé, pension, annulation, taxe de séjour et
inventaire restant en champs dédiés. Trois pièges documentés dans le code : le mini-site ne
porte pas le code hôtel (il se résout par seoRoutes, et un mauvais code marque
rend un autre hôtel sans erreur), une occupation trop grande fait répondre le moteur
sur un découpage de son cru — non tarifé ici —, et les tarifs « Exclusif Membres » sont
rendus mais signalés quand ils tiennent le meilleur prix.
1,7 % en direct plus Best Western France, mais hors de portée du code, et pour la même
raison que D-EDGE. Mesuré le 29 août 2026 : robots.txt dit
Disallow: /, le HTTP direct reçoit un 403 Imperva Incapsula, et un Chromium
headless — quelle que soit l'UA — se voit servir un hCaptcha.
Seul un navigateur non automatisé passe : s'y ramener ne serait pas résoudre le défi mais
échapper à la détection. L'API partenaire Aven Hospitality (ex-Sabre) est la seule voie.
Les deux moteurs qui montent sur le petit indépendant français. Amenitiz est derrière Cloudflare — navigateur obligatoire, à budgéter comme tel.
1,2 %, livré le 29 août 2026 sans navigateur. Le relevé le classait
« à faire · WAF AWS » : le tunnel est bien une SPA vide qui charge le challenge.js
d'AWS dès le <head>. Mais elle publie son propre chemin d'API en clair —
/static/config.js donne BOOKING_ENGINE_BEEF_URL: "/api/graphql" —
et le robots.txt de direct-book.com ne porte
aucun groupe User-agent: *, seulement des interdictions
nominatives ; le domaine historique dit même Allow: /properties. L'endpoint
répond sans cookie, sans Origin ni Referer : il ne reste que le
filtre du WAF sur l'UA, traité comme celui de Booking.com.
Total du séjour déjà calculé par quoteSets, pension et fenêtre
d'annulation lues dans roomTypes. Un piège, et il est cher :
quoteSets ignore l'occupation demandée — il rend les mêmes
montants à 1, 2 ou 3 adultes, chambre simple comprise. Servir sa réponse brute pour un
couple, c'est annoncer 242,48 € pour une chambre à un lit quand la double vaut 332,46 € :
le prix le plus bas, et le plus faux. La règle vit dans roomTypes, l'adapter
l'applique tarif par tarif.
Grille livrée le 29 août 2026, sur la surface que le tunnel interroge pour son propre
calendrier : GET /api/properties/{slug}/availability, un mois calendaire par appel, sans jeton ni
cookie. Un second piège, aussi cher que le premier : son cache de bord ne retient du ? que
checkInsFrom. checkInsTo et los en sont absents, si bien qu'un
los=1 demandé revient servi avec le corps d'un los=3 émis une heure plus tôt — mesuré,
en HTTP 200. La réponse se décrit heureusement elle-même, chaque case portant sa date et son
lengthOfStay : on la confronte à la question avant de la lire, et on refuse la grille plutôt que
d'annoncer 426 € la nuit pour ce qui en vaut 133. Le décalage n'est pas rattrapable — le cache tient une heure
et ne converge pas sur une nouvelle tentative.
Ajouter les empreintes de la longue traîne au registre, avec
ENGINE_NOT_IMPLEMENTED. Coût quasi nul, et l'API cesse de répondre
« domaine inconnu » sur des moteurs parfaitement identifiés.
Deux limites à garder en tête.
36 % des sites visités ne révèlent pas leur moteur sur la page d'accueil : le bouton « Réserver » ouvre un widget JavaScript. Les chiffres ci-dessus sont donc des planchers, et les sites d'agences (MMCréation, Agence Webcom, Sitehotel, API&YOU) concentrent l'essentiel de cet angle mort. Un second passage au navigateur sur ces 479 sites affinerait le classement.
La base de départ est OpenStreetMap : elle sur-représente l'hôtel indépendant qui a un site web et sous-représente les chaînes intégrées, dont un seul domaine couvre parfois 300 hôtels. D'où le tableau « chaînes » séparé — leur poids réel ne se lit pas en nombre de domaines.