@findhotel/sapi 0.23.9 → 0.23.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +337 -40
- package/dist/index.js +1 -1
- package/dist/types/packages/core/src/app-config.d.ts +1 -0
- package/dist/types/packages/core/src/hotel.d.ts +3 -1
- package/dist/types/packages/core/src/offers-client.d.ts +108 -0
- package/dist/types/packages/core/src/{raa/utils.test.d.ts → offers-client.test.d.ts} +0 -0
- package/dist/types/packages/core/src/offers.d.ts +27 -100
- package/dist/types/packages/core/src/sapi.d.ts +1 -1
- package/dist/types/packages/core/src/types/sapi-client.d.ts +2 -0
- package/dist/types/packages/core/src/types/types.d.ts +4 -1
- package/dist/types/packages/core/src/utils/build-offers-response.d.ts +21 -0
- package/dist/types/packages/core/src/utils/build-offers-response.test.d.ts +1 -0
- package/dist/types/packages/core/src/utils/index.d.ts +2 -0
- package/dist/types/packages/core/src/utils/search-id.d.ts +4 -4
- package/dist/types/packages/core/src/utils/sorting-boosts.d.ts +11 -0
- package/dist/types/packages/core/src/utils/sorting-boosts.test.d.ts +1 -0
- package/package.json +1 -1
- package/dist/types/packages/core/src/raa/index.d.ts +0 -2
- package/dist/types/packages/core/src/raa/raa.d.ts +0 -45
- package/dist/types/packages/core/src/raa/utils.d.ts +0 -36
package/README.md
CHANGED
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
2. [Tutorials](#tutorials)
|
|
6
6
|
1. [Getting Started](#getting-started)
|
|
7
7
|
2. [Usage](#usage)
|
|
8
|
-
1. [
|
|
9
|
-
2. [Get rooms
|
|
8
|
+
1. [Search](#tutorial-hotels-search)
|
|
9
|
+
2. [Get hotel's rooms offers](#tutorial-get-rooms)
|
|
10
10
|
3. [Get hotel](#tutorial-get-hotel)
|
|
11
|
+
4. [Get hotel offers](#tutorial-get-offers)
|
|
11
12
|
3. [API Reference](#api-reference)
|
|
12
13
|
1. [SAPI client](#sapi-client)
|
|
13
14
|
1. [Supported options](#client-options)
|
|
@@ -25,6 +26,10 @@
|
|
|
25
26
|
5. [`hotel()` method](#hotel-method)
|
|
26
27
|
1. [Hotel parameters](#hotel-parameters)
|
|
27
28
|
2. [Response](#hotel-response)
|
|
29
|
+
6. [`offers()` method](#offers-method)
|
|
30
|
+
1. [Offers parameters](#hotel-parameters)
|
|
31
|
+
2. [Callbacks](#offers-callbacks)
|
|
32
|
+
3. [Response](#offers-response)
|
|
28
33
|
|
|
29
34
|
SDK provides a high level TypeScript/JavaScript API for searching
|
|
30
35
|
hotels, hotels' offers and rooms.
|
|
@@ -80,7 +85,7 @@ For full documentation and supported options check [client api](#sapi-client).
|
|
|
80
85
|
|
|
81
86
|
<a id="tutorial-hotels-search"></a>
|
|
82
87
|
|
|
83
|
-
###
|
|
88
|
+
### Search
|
|
84
89
|
|
|
85
90
|
Search for the hotels and hotels' offers:
|
|
86
91
|
|
|
@@ -93,19 +98,19 @@ Search for the hotels and hotels' offers:
|
|
|
93
98
|
|
|
94
99
|
const callbacks = {
|
|
95
100
|
onStart: (response) => {
|
|
96
|
-
|
|
101
|
+
log('Search started', response)
|
|
97
102
|
},
|
|
98
103
|
onAnchorReceived: (response) => {
|
|
99
|
-
|
|
104
|
+
log('Anchor received', response)
|
|
100
105
|
},
|
|
101
106
|
onHotelsReceived: (response) => {
|
|
102
|
-
|
|
107
|
+
log('Hotels received', response)
|
|
103
108
|
},
|
|
104
109
|
onOffersReceived: (response) => {
|
|
105
|
-
|
|
110
|
+
log('Offers received', response)
|
|
106
111
|
},
|
|
107
112
|
onComplete: (response) => {
|
|
108
|
-
|
|
113
|
+
log('Search completed', response)
|
|
109
114
|
}
|
|
110
115
|
}
|
|
111
116
|
|
|
@@ -116,9 +121,9 @@ For full documentation, check [search method api](#search-method).
|
|
|
116
121
|
|
|
117
122
|
<a id="tutorial-get-rooms"></a>
|
|
118
123
|
|
|
119
|
-
### Get rooms
|
|
124
|
+
### Get hotel's rooms offers
|
|
120
125
|
|
|
121
|
-
Get rooms and rooms' offers:
|
|
126
|
+
Get rooms data and rooms' offers:
|
|
122
127
|
|
|
123
128
|
const rooms = await sapiClient.rooms({
|
|
124
129
|
hotelId: '47319',
|
|
@@ -141,6 +146,33 @@ Get hotel by id:
|
|
|
141
146
|
For full documentation, check [hotel method api](#hotel-method).
|
|
142
147
|
|
|
143
148
|
|
|
149
|
+
<a id="tutorial-get-offers"></a>
|
|
150
|
+
|
|
151
|
+
### Get hotel offers
|
|
152
|
+
|
|
153
|
+
Get offers for a single hotel:
|
|
154
|
+
|
|
155
|
+
const parameters = {
|
|
156
|
+
hotelId: '1196472'
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const callbacks = {
|
|
160
|
+
onStart: (response) => {
|
|
161
|
+
log('Offers started', response)
|
|
162
|
+
},
|
|
163
|
+
onOffersReceived: (response) => {
|
|
164
|
+
log('Offers received', response)
|
|
165
|
+
},
|
|
166
|
+
onComplete: (response) => {
|
|
167
|
+
log('Offers completed', response)
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const offers = await sapiClient.offers(parameters, callbacks)
|
|
172
|
+
|
|
173
|
+
For full documentation, check [offers method api](#offers-method).
|
|
174
|
+
|
|
175
|
+
|
|
144
176
|
<a id="api-reference"></a>
|
|
145
177
|
|
|
146
178
|
# API Reference
|
|
@@ -175,7 +207,7 @@ Create SAPI client:
|
|
|
175
207
|
},
|
|
176
208
|
callbacks: {
|
|
177
209
|
onConfigReceived: (config) => {
|
|
178
|
-
|
|
210
|
+
log('Config received', config)
|
|
179
211
|
}
|
|
180
212
|
}
|
|
181
213
|
})
|
|
@@ -528,19 +560,19 @@ Search method receives callbacks object as the second argument:
|
|
|
528
560
|
|
|
529
561
|
const callbacks = {
|
|
530
562
|
onStart: (response) => {
|
|
531
|
-
|
|
563
|
+
log('Search started', response)
|
|
532
564
|
},
|
|
533
565
|
onAnchorReceived: (response) => {
|
|
534
|
-
|
|
566
|
+
log('Anchor received', response)
|
|
535
567
|
},
|
|
536
568
|
onHotelsReceived: (response) => {
|
|
537
|
-
|
|
569
|
+
log('Hotels received', response)
|
|
538
570
|
},
|
|
539
571
|
onOffersReceived: (response) => {
|
|
540
|
-
|
|
572
|
+
log('Offers received', response)
|
|
541
573
|
},
|
|
542
574
|
onComplete: (response) => {
|
|
543
|
-
|
|
575
|
+
log('Search completed', response)
|
|
544
576
|
}
|
|
545
577
|
}
|
|
546
578
|
|
|
@@ -649,20 +681,20 @@ Suggest provides autosuggestions for a given query
|
|
|
649
681
|
|
|
650
682
|
[
|
|
651
683
|
{
|
|
652
|
-
highlightValue: "<em>London</em>",
|
|
653
|
-
objectID: "158584",
|
|
654
|
-
objectType: "place",
|
|
655
|
-
placeDisplayName: "United Kingdom",
|
|
656
|
-
placeTypeName: "city",
|
|
657
|
-
value: "London"
|
|
684
|
+
"highlightValue": "<em>London</em>",
|
|
685
|
+
"objectID": "158584",
|
|
686
|
+
"objectType": "place",
|
|
687
|
+
"placeDisplayName": "United Kingdom",
|
|
688
|
+
"placeTypeName": "city",
|
|
689
|
+
"value": "London"
|
|
658
690
|
},
|
|
659
691
|
{
|
|
660
|
-
highlightValue: "<em>London</em> Heathrow Airport",
|
|
661
|
-
objectID: "167733",
|
|
662
|
-
objectType: "place",
|
|
663
|
-
placeDisplayName: "London, United Kingdom",
|
|
664
|
-
placeTypeName: "airport",
|
|
665
|
-
value: "London Heathrow Airport"
|
|
692
|
+
"highlightValue": "<em>London</em> Heathrow Airport",
|
|
693
|
+
"objectID": "167733",
|
|
694
|
+
"objectType": "place",
|
|
695
|
+
"placeDisplayName": "London, United Kingdom",
|
|
696
|
+
"placeTypeName": "airport",
|
|
697
|
+
"value": "London Heathrow Airport"
|
|
666
698
|
}
|
|
667
699
|
]
|
|
668
700
|
|
|
@@ -670,20 +702,20 @@ Suggest provides autosuggestions for a given query
|
|
|
670
702
|
|
|
671
703
|
[
|
|
672
704
|
{
|
|
673
|
-
highlightValue: "Park Plaza Westminster Bridge <em>London</em>",
|
|
674
|
-
objectID: "1546646",
|
|
675
|
-
objectType: "hotel",
|
|
676
|
-
placeDisplayName: "London, United Kingdom",
|
|
677
|
-
placeTypeName: "property",
|
|
678
|
-
value: "Park Plaza Westminster Bridge London"
|
|
705
|
+
"highlightValue": "Park Plaza Westminster Bridge <em>London</em>",
|
|
706
|
+
"objectID": "1546646",
|
|
707
|
+
"objectType": "hotel",
|
|
708
|
+
"placeDisplayName": "London, United Kingdom",
|
|
709
|
+
"placeTypeName": "property",
|
|
710
|
+
"value": "Park Plaza Westminster Bridge London"
|
|
679
711
|
},
|
|
680
712
|
{
|
|
681
|
-
highlightValue: "Hampton by Hilton <em>London</em> Stansted Airport",
|
|
682
|
-
objectID: "3333916",
|
|
683
|
-
objectType: "hotel",
|
|
684
|
-
placeDisplayName: "United Kingdom",
|
|
685
|
-
placeTypeName: "property",
|
|
686
|
-
value: "Hampton by Hilton London Stansted Airport"
|
|
713
|
+
"highlightValue": "Hampton by Hilton <em>London</em> Stansted Airport",
|
|
714
|
+
"objectID": "3333916",
|
|
715
|
+
"objectType": "hotel",
|
|
716
|
+
"placeDisplayName": "United Kingdom",
|
|
717
|
+
"placeTypeName": "property",
|
|
718
|
+
"value": "Hampton by Hilton London Stansted Airport"
|
|
687
719
|
}
|
|
688
720
|
]
|
|
689
721
|
|
|
@@ -937,3 +969,268 @@ An example of the response for request with `hotelId` 1196472 and "pt-BR" `langu
|
|
|
937
969
|
"displayAddress": "Piet Heinkade 11, Oostelijk Havengebied, Amsterdã, Holanda"
|
|
938
970
|
}
|
|
939
971
|
|
|
972
|
+
|
|
973
|
+
<a id="offers-method"></a>
|
|
974
|
+
|
|
975
|
+
## `offers()` method
|
|
976
|
+
|
|
977
|
+
Retrieves offers for a single hotel by provided parameters
|
|
978
|
+
|
|
979
|
+
const parameters = {
|
|
980
|
+
hotelId: '1196472',
|
|
981
|
+
checkIn: '2022-10-10',
|
|
982
|
+
checkOut: '2022-10-11',
|
|
983
|
+
rooms: '2'
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
const callbacks = {
|
|
987
|
+
onStart: (response) => {
|
|
988
|
+
log('Offers started', response)
|
|
989
|
+
},
|
|
990
|
+
onOffersReceived: (response) => {
|
|
991
|
+
log('Offers received', response)
|
|
992
|
+
},
|
|
993
|
+
onComplete: (response) => {
|
|
994
|
+
log('Offers completed', response)
|
|
995
|
+
}
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
const offers = await sapiClient.offers(parameters, callbacks)
|
|
999
|
+
|
|
1000
|
+
|
|
1001
|
+
<a id="hotel-parameters"></a>
|
|
1002
|
+
|
|
1003
|
+
### Offers parameters
|
|
1004
|
+
|
|
1005
|
+
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
1006
|
+
|
|
1007
|
+
|
|
1008
|
+
<colgroup>
|
|
1009
|
+
<col class="org-left" />
|
|
1010
|
+
|
|
1011
|
+
<col class="org-left" />
|
|
1012
|
+
|
|
1013
|
+
<col class="org-left" />
|
|
1014
|
+
|
|
1015
|
+
<col class="org-left" />
|
|
1016
|
+
|
|
1017
|
+
<col class="org-left" />
|
|
1018
|
+
</colgroup>
|
|
1019
|
+
<thead>
|
|
1020
|
+
<tr>
|
|
1021
|
+
<th scope="col" class="org-left">name</th>
|
|
1022
|
+
<th scope="col" class="org-left">type</th>
|
|
1023
|
+
<th scope="col" class="org-left">description</th>
|
|
1024
|
+
<th scope="col" class="org-left">required</th>
|
|
1025
|
+
<th scope="col" class="org-left">example</th>
|
|
1026
|
+
</tr>
|
|
1027
|
+
</thead>
|
|
1028
|
+
|
|
1029
|
+
<tbody>
|
|
1030
|
+
<tr>
|
|
1031
|
+
<td class="org-left">`hotelId`</td>
|
|
1032
|
+
<td class="org-left">`string`</td>
|
|
1033
|
+
<td class="org-left">Hotel Id</td>
|
|
1034
|
+
<td class="org-left">yes</td>
|
|
1035
|
+
<td class="org-left">`1196472`</td>
|
|
1036
|
+
</tr>
|
|
1037
|
+
|
|
1038
|
+
|
|
1039
|
+
<tr>
|
|
1040
|
+
<td class="org-left">`checkIn`</td>
|
|
1041
|
+
<td class="org-left">`string`</td>
|
|
1042
|
+
<td class="org-left">Check in date (YYYY-MM-DD) (SDK generates default date if no provided)</td>
|
|
1043
|
+
<td class="org-left">no</td>
|
|
1044
|
+
<td class="org-left">`2022-10-10`</td>
|
|
1045
|
+
</tr>
|
|
1046
|
+
|
|
1047
|
+
|
|
1048
|
+
<tr>
|
|
1049
|
+
<td class="org-left">`checkOut`</td>
|
|
1050
|
+
<td class="org-left">`string`</td>
|
|
1051
|
+
<td class="org-left">Check out date (YYYY-MM-DD)) (SDK generates default date if no provided)</td>
|
|
1052
|
+
<td class="org-left">no</td>
|
|
1053
|
+
<td class="org-left">`2022-10-11`</td>
|
|
1054
|
+
</tr>
|
|
1055
|
+
|
|
1056
|
+
|
|
1057
|
+
<tr>
|
|
1058
|
+
<td class="org-left">`rooms`</td>
|
|
1059
|
+
<td class="org-left">`string`</td>
|
|
1060
|
+
<td class="org-left">[Rooms configuration](https://github.com/FindHotel/search-data-pipelines/wiki/Glossary#rooms-configuration)</td>
|
|
1061
|
+
<td class="org-left">no</td>
|
|
1062
|
+
<td class="org-left">`2`</td>
|
|
1063
|
+
</tr>
|
|
1064
|
+
|
|
1065
|
+
|
|
1066
|
+
<tr>
|
|
1067
|
+
<td class="org-left">`searchId`</td>
|
|
1068
|
+
<td class="org-left">`string`</td>
|
|
1069
|
+
<td class="org-left">SearchId override (SDK generates a new one if no provided)</td>
|
|
1070
|
+
<td class="org-left">no</td>
|
|
1071
|
+
<td class="org-left">`08230dfcc5f0fb95caaa82ce559ea60c4a975d6f`</td>
|
|
1072
|
+
</tr>
|
|
1073
|
+
|
|
1074
|
+
|
|
1075
|
+
<tr>
|
|
1076
|
+
<td class="org-left">`cugDeals`</td>
|
|
1077
|
+
<td class="org-left">`string[]`</td>
|
|
1078
|
+
<td class="org-left">Codes of closed user group deals to retrieve offers</td>
|
|
1079
|
+
<td class="org-left">no</td>
|
|
1080
|
+
<td class="org-left">`['signed_in', 'offline']`</td>
|
|
1081
|
+
</tr>
|
|
1082
|
+
|
|
1083
|
+
|
|
1084
|
+
<tr>
|
|
1085
|
+
<td class="org-left">`freeCancellation`</td>
|
|
1086
|
+
<td class="org-left">`boolean`</td>
|
|
1087
|
+
<td class="org-left">Promote offers with free cancelation (default `false`)</td>
|
|
1088
|
+
<td class="org-left">no</td>
|
|
1089
|
+
<td class="org-left">`true`</td>
|
|
1090
|
+
</tr>
|
|
1091
|
+
|
|
1092
|
+
|
|
1093
|
+
<tr>
|
|
1094
|
+
<td class="org-left">`isAnchor`</td>
|
|
1095
|
+
<td class="org-left">`boolean`</td>
|
|
1096
|
+
<td class="org-left">Anchor/Non anchor hotel (default `false`)</td>
|
|
1097
|
+
<td class="org-left">no</td>
|
|
1098
|
+
<td class="org-left">`true`</td>
|
|
1099
|
+
</tr>
|
|
1100
|
+
|
|
1101
|
+
|
|
1102
|
+
<tr>
|
|
1103
|
+
<td class="org-left">`getAllOffers`</td>
|
|
1104
|
+
<td class="org-left">`boolean`</td>
|
|
1105
|
+
<td class="org-left">Get all/only top offers (default `false`)</td>
|
|
1106
|
+
<td class="org-left">no</td>
|
|
1107
|
+
<td class="org-left">`true`</td>
|
|
1108
|
+
</tr>
|
|
1109
|
+
|
|
1110
|
+
|
|
1111
|
+
<tr>
|
|
1112
|
+
<td class="org-left">`originId`</td>
|
|
1113
|
+
<td class="org-left">`string`</td>
|
|
1114
|
+
<td class="org-left">Identifier of origin where the request was originated</td>
|
|
1115
|
+
<td class="org-left">no</td>
|
|
1116
|
+
<td class="org-left">`c3po6twr70`</td>
|
|
1117
|
+
</tr>
|
|
1118
|
+
|
|
1119
|
+
|
|
1120
|
+
<tr>
|
|
1121
|
+
<td class="org-left">`trafficSource`</td>
|
|
1122
|
+
<td class="org-left">`string`</td>
|
|
1123
|
+
<td class="org-left">Visitor's traffic source. Opaque value that will be passed to tracking systems</td>
|
|
1124
|
+
<td class="org-left">no</td>
|
|
1125
|
+
<td class="org-left">`gha-vr`</td>
|
|
1126
|
+
</tr>
|
|
1127
|
+
|
|
1128
|
+
|
|
1129
|
+
<tr>
|
|
1130
|
+
<td class="org-left">`preferredRate`</td>
|
|
1131
|
+
<td class="org-left">`number`</td>
|
|
1132
|
+
<td class="org-left">Offer's price user saw on a CA (meta) platform</td>
|
|
1133
|
+
<td class="org-left">no</td>
|
|
1134
|
+
<td class="org-left">`196`</td>
|
|
1135
|
+
</tr>
|
|
1136
|
+
</tbody>
|
|
1137
|
+
</table>
|
|
1138
|
+
|
|
1139
|
+
|
|
1140
|
+
<a id="offers-callbacks"></a>
|
|
1141
|
+
|
|
1142
|
+
### Callbacks
|
|
1143
|
+
|
|
1144
|
+
Object with callbacks:
|
|
1145
|
+
|
|
1146
|
+
const callbacks = {
|
|
1147
|
+
onStart: (response) => {
|
|
1148
|
+
log('Offers started', response)
|
|
1149
|
+
},
|
|
1150
|
+
onOffersReceived: (response) => {
|
|
1151
|
+
log('Offers received', response)
|
|
1152
|
+
},
|
|
1153
|
+
onComplete: (response) => {
|
|
1154
|
+
log('Offers completed', response)
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
1. onStart()
|
|
1159
|
+
|
|
1160
|
+
Runs at the beginning of the each new offers request.
|
|
1161
|
+
Returns adjusted and validated offers request parameters.
|
|
1162
|
+
|
|
1163
|
+
2. onOffersReceived()
|
|
1164
|
+
|
|
1165
|
+
Runs on every received batch of offers.
|
|
1166
|
+
Returns hotel's offers (incomplete response).
|
|
1167
|
+
|
|
1168
|
+
3. onComplete()
|
|
1169
|
+
|
|
1170
|
+
Runs after offers request complete.
|
|
1171
|
+
Returns hotel's offers (complete response).
|
|
1172
|
+
|
|
1173
|
+
|
|
1174
|
+
<a id="offers-response"></a>
|
|
1175
|
+
|
|
1176
|
+
### Response
|
|
1177
|
+
|
|
1178
|
+
An example of the response for request parameters:
|
|
1179
|
+
|
|
1180
|
+
const parameters = {
|
|
1181
|
+
hotelId: '1926746',
|
|
1182
|
+
checkIn: '2022-07-10',
|
|
1183
|
+
checkOut: '2022-07-11',
|
|
1184
|
+
rooms: '2'
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
{
|
|
1188
|
+
"anchorPriceRateBreakdown": {
|
|
1189
|
+
"baseRate": 113.21,
|
|
1190
|
+
"localTaxes": 8.64,
|
|
1191
|
+
"taxes": 10.19,
|
|
1192
|
+
"calculatedTotalRate": 132.04,
|
|
1193
|
+
"nightlyRate": 132.04
|
|
1194
|
+
},
|
|
1195
|
+
"availableOffersCount": 19,
|
|
1196
|
+
"fetchedAllOffers": false,
|
|
1197
|
+
"hasMoreOffers": true,
|
|
1198
|
+
"id": "1926746",
|
|
1199
|
+
"offers": [
|
|
1200
|
+
{
|
|
1201
|
+
"additionalProviderParams": {
|
|
1202
|
+
"feedId": "1524856"
|
|
1203
|
+
},
|
|
1204
|
+
"availableRooms": 10,
|
|
1205
|
+
"bookURI": "https://r.findhotel.net?...",
|
|
1206
|
+
"calculatedTotalRate": 110.72,
|
|
1207
|
+
"canPayLater": true,
|
|
1208
|
+
"cug": null,
|
|
1209
|
+
"currency": "EUR",
|
|
1210
|
+
"hasAnchorPrice": true,
|
|
1211
|
+
"hasFreeCancellation": true,
|
|
1212
|
+
"id": "oO8jdRHaO8y0",
|
|
1213
|
+
"isAnchorPriceOffer": false,
|
|
1214
|
+
"isCheapest": false,
|
|
1215
|
+
"isTopOffer": true,
|
|
1216
|
+
"meals": ["breakfast"],
|
|
1217
|
+
"nightlyRate": 110.72,
|
|
1218
|
+
"providerCode": "BKS",
|
|
1219
|
+
"proxyProviderCode": "BKS",
|
|
1220
|
+
"rateBreakdown": {
|
|
1221
|
+
"baseRate": 90.28,
|
|
1222
|
+
"localTaxes": 12.32,
|
|
1223
|
+
"taxes": 8.12
|
|
1224
|
+
},
|
|
1225
|
+
"roomID": "moc_08Ap8BcbIDg",
|
|
1226
|
+
"roomName": "Standard Double Room",
|
|
1227
|
+
"tags": ["top_offer"]
|
|
1228
|
+
}
|
|
1229
|
+
],
|
|
1230
|
+
"topOfferData": {
|
|
1231
|
+
"anchorPrice": 132.04,
|
|
1232
|
+
"anchorPriceNightly": 132.04,
|
|
1233
|
+
"offerIndexes": [0, 1, 2, 3]
|
|
1234
|
+
}
|
|
1235
|
+
}
|
|
1236
|
+
|