Rate shopping · relevé de terrain · août 2026

Quels moteurs restent à brancher sur l'hôtellerie française

É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é.

6 076domaines d'hôtels FR recensés (OpenStreetMap, tag website)
1 600tirés au sort et visités
1 326ont répondu — la base de tous les pourcentages
847moteur identifié dès la page d'accueil (64 %)

Le classement

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.

MoteurHôtelsEmpreinte 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 + quoteSets
grille : 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 sortants
donné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

Qui publie un calendrier

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.

MoteurSurfaceCoût / 60 datesCe 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}/calendar
91 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 + /availabilities
plage 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/GetAvailability
un 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}/availability
un 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 prix
cette 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 construite
getPricing 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=ajaxCalendarRestriction
le 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.jsp
mois 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_calendar
62 dates par appel · los et respect_min_los_restriction honorés · l'occupation vient de b_search_config, que la fiche construit elle-même
la 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.

Les chaînes, à traiter à part

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

EnseigneHôtelsEmpreinte URL observéeRemarque
Louvre HotelsKyriad · Campanile · Première Classe · Golden Tulip160 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 France19 1,4 %bestwestern.fr/infos_hotel.jsp?HotelCode={id} → be.synxis.comRetombe sur SynXis, donc bloqué comme lui. Le front est lui-même derrière Cloudflare.
Brit Hotel19 1,4 %brithotel.fr/client/reservation.htmlFront propriétaire.
Accor18 1,4 %all.accor.com/hotel/{code}/index.fr.shtmlIbis / Mercure / Novotel. Front ALL, très protégé.
Contact Hôtel15 1,1 %contact-hotel.com/reserver-hotel-france/{id}/{slug}.htmHTML classique — probablement lisible en HTTP.
Citotel7 0,5 %{slug}.galaxy-reservation.frMoteur Galaxy, éditeur français.

Longue traîne — repérée, à ne pas implémenter maintenant

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.

MoteurHôtelsEmpreinte URL observée
Pure Informatique8book.pure-informatique.com/?locationID={id}
Hotelnet SmartBooking6smartbooking.hotelnet.biz/home/accomodation?hotel={id}
Novaresa6novaresa.net/firm.php?id_firm={id}
Overfull5app.overfull.fr/booking-v2?key_id={id}
book-secure.com5book-secure.com/?property=fr{ville}{id} — derrière DataDome
MyGuestDiary5bookingengine.myguestdiary.com/{id}
Vertical Booking3reservations.verticalbooking.com/premium/index.html?id_albergo={id}&dc={id}
Hotel-Spider3reservations.hotel-spider.com/#/{hash}
ResaSecure3scripts.resasecure.net
Booking Channel3{slug}.booking-channel.com
Housity2housity.net/book_hotel/{slug}/
BookVisit2online.bookvisit.com/accommodation/list?channelId={uuid}
Cubilis (Stardekk)1reservations.cubilis.eu/{slug}/Rooms/Select
Simple Booking · GuestCentric1+1simplebooking.it/ibe/hotelbooking/search?hid={id} · secure.guestcentric.net

Ce que je ferais dans cet ordre

L'ordre suit le rapport couverture / coût d'implémentation, pas le classement brut.

LIVRÉ

D-EDGE

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.

LIVRÉ

Misterbooking

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.

LIVRÉ

Amadeus iHotelier

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.

LIVRÉ

My Groom Service

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.

LIVRÉ

Louvre Hotels Group

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.

HORS DEV

SynXis : voie commerciale

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.

PUIS

Elloha & Amenitiz

Les deux moteurs qui montent sur le petit indépendant français. Amenitiz est derrière Cloudflare — navigateur obligatoire, à budgéter comme tel.

LIVRÉ

SiteMinder

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.

EN FOND

Reconnaître sans lire

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.