@voyant-travel/openapi 0.2.6 → 0.4.0

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.
Files changed (41) hide show
  1. package/package.json +8 -5
  2. package/spec/admin/accommodations.json +1443 -0
  3. package/spec/admin/action-ledger.json +6285 -0
  4. package/spec/admin/booking-requirements.json +5975 -0
  5. package/spec/admin/bookings.json +19276 -0
  6. package/spec/admin/catalog.json +703 -0
  7. package/spec/admin/distribution.json +20434 -0
  8. package/spec/admin/external-refs.json +1437 -0
  9. package/spec/admin/extras.json +4787 -0
  10. package/spec/admin/finance.json +36583 -0
  11. package/spec/admin/identity.json +4141 -0
  12. package/spec/admin/legal.json +14821 -0
  13. package/spec/admin/markets.json +5551 -0
  14. package/spec/admin/notifications.json +8667 -0
  15. package/spec/admin/operations.json +41627 -0
  16. package/spec/admin/operator-settings.json +1451 -0
  17. package/spec/admin/pricing.json +11136 -0
  18. package/spec/admin/products.json +23257 -0
  19. package/spec/admin/promotions.json +2778 -0
  20. package/spec/admin/quotes.json +7333 -0
  21. package/spec/admin/relationships.json +14512 -0
  22. package/spec/admin/sellability.json +5056 -0
  23. package/spec/admin/storefront.json +1973 -0
  24. package/spec/admin/suppliers.json +6094 -0
  25. package/spec/admin/trips.json +9531 -0
  26. package/spec/framework-admin.json +12715 -1375
  27. package/spec/framework-openapi.json +13731 -1482
  28. package/spec/framework-storefront.json +1022 -107
  29. package/spec/storefront/booking-requirements.json +380 -0
  30. package/spec/storefront/bookings.json +6213 -0
  31. package/spec/storefront/catalog.json +703 -0
  32. package/spec/storefront/customer-portal.json +6177 -0
  33. package/spec/storefront/finance.json +4914 -0
  34. package/spec/storefront/legal.json +2165 -0
  35. package/spec/storefront/markets.json +269 -0
  36. package/spec/storefront/operator-settings.json +329 -0
  37. package/spec/storefront/pricing.json +598 -0
  38. package/spec/storefront/products.json +2965 -0
  39. package/spec/storefront/storefront-verification.json +943 -0
  40. package/spec/storefront/storefront.json +4157 -0
  41. package/spec/storefront/trips.json +9531 -0
@@ -0,0 +1,4157 @@
1
+ {
2
+ "openapi": "3.1.0",
3
+ "info": {
4
+ "title": "Voyant Framework API",
5
+ "version": "0.0.0",
6
+ "description": "Generated from the Voyant framework's standard module composition. Do not edit by hand."
7
+ },
8
+ "servers": [
9
+ {
10
+ "url": "/",
11
+ "description": "This deployment (same origin)"
12
+ }
13
+ ],
14
+ "components": {
15
+ "schemas": {
16
+ "CatalogSearchFilter": {
17
+ "anyOf": [
18
+ {
19
+ "type": "object",
20
+ "properties": {
21
+ "kind": {
22
+ "type": "string",
23
+ "enum": [
24
+ "eq"
25
+ ]
26
+ },
27
+ "field": {
28
+ "type": "string",
29
+ "minLength": 1
30
+ },
31
+ "value": {
32
+ "anyOf": [
33
+ {
34
+ "type": "string"
35
+ },
36
+ {
37
+ "type": "number"
38
+ },
39
+ {
40
+ "type": "boolean"
41
+ }
42
+ ]
43
+ }
44
+ },
45
+ "required": [
46
+ "kind",
47
+ "field",
48
+ "value"
49
+ ]
50
+ },
51
+ {
52
+ "type": "object",
53
+ "properties": {
54
+ "kind": {
55
+ "type": "string",
56
+ "enum": [
57
+ "in"
58
+ ]
59
+ },
60
+ "field": {
61
+ "type": "string",
62
+ "minLength": 1
63
+ },
64
+ "values": {
65
+ "type": "array",
66
+ "items": {
67
+ "anyOf": [
68
+ {
69
+ "type": "string"
70
+ },
71
+ {
72
+ "type": "number"
73
+ }
74
+ ]
75
+ }
76
+ }
77
+ },
78
+ "required": [
79
+ "kind",
80
+ "field",
81
+ "values"
82
+ ]
83
+ },
84
+ {
85
+ "type": "object",
86
+ "properties": {
87
+ "kind": {
88
+ "type": "string",
89
+ "enum": [
90
+ "range"
91
+ ]
92
+ },
93
+ "field": {
94
+ "type": "string",
95
+ "minLength": 1
96
+ },
97
+ "gte": {
98
+ "type": "number"
99
+ },
100
+ "lte": {
101
+ "type": "number"
102
+ }
103
+ },
104
+ "required": [
105
+ "kind",
106
+ "field"
107
+ ]
108
+ },
109
+ {
110
+ "type": "object",
111
+ "properties": {
112
+ "kind": {
113
+ "type": "string",
114
+ "enum": [
115
+ "and"
116
+ ]
117
+ },
118
+ "clauses": {
119
+ "type": "array",
120
+ "items": {
121
+ "$ref": "#/components/schemas/CatalogSearchFilter"
122
+ }
123
+ }
124
+ },
125
+ "required": [
126
+ "kind",
127
+ "clauses"
128
+ ]
129
+ },
130
+ {
131
+ "type": "object",
132
+ "properties": {
133
+ "kind": {
134
+ "type": "string",
135
+ "enum": [
136
+ "or"
137
+ ]
138
+ },
139
+ "clauses": {
140
+ "type": "array",
141
+ "items": {
142
+ "$ref": "#/components/schemas/CatalogSearchFilter"
143
+ }
144
+ }
145
+ },
146
+ "required": [
147
+ "kind",
148
+ "clauses"
149
+ ]
150
+ }
151
+ ]
152
+ }
153
+ },
154
+ "parameters": {}
155
+ },
156
+ "paths": {
157
+ "/v1/public/products/{productId}/offers": {
158
+ "get": {
159
+ "parameters": [
160
+ {
161
+ "schema": {
162
+ "type": "string"
163
+ },
164
+ "required": true,
165
+ "name": "productId",
166
+ "in": "path"
167
+ },
168
+ {
169
+ "schema": {
170
+ "type": "string"
171
+ },
172
+ "required": false,
173
+ "name": "departureId",
174
+ "in": "query"
175
+ },
176
+ {
177
+ "schema": {
178
+ "type": "string",
179
+ "minLength": 2
180
+ },
181
+ "required": false,
182
+ "name": "locale",
183
+ "in": "query"
184
+ }
185
+ ],
186
+ "responses": {
187
+ "200": {
188
+ "description": "Promotional offers applicable to a product (and optional departure)",
189
+ "content": {
190
+ "application/json": {
191
+ "schema": {
192
+ "type": "object",
193
+ "properties": {
194
+ "data": {
195
+ "type": "array",
196
+ "items": {
197
+ "type": "object",
198
+ "properties": {
199
+ "id": {
200
+ "type": "string"
201
+ },
202
+ "name": {
203
+ "type": "string"
204
+ },
205
+ "slug": {
206
+ "type": [
207
+ "string",
208
+ "null"
209
+ ]
210
+ },
211
+ "description": {
212
+ "type": [
213
+ "string",
214
+ "null"
215
+ ]
216
+ },
217
+ "discountType": {
218
+ "type": "string",
219
+ "enum": [
220
+ "percentage",
221
+ "fixed_amount"
222
+ ]
223
+ },
224
+ "discountValue": {
225
+ "type": "string"
226
+ },
227
+ "currency": {
228
+ "type": [
229
+ "string",
230
+ "null"
231
+ ]
232
+ },
233
+ "applicableProductIds": {
234
+ "type": "array",
235
+ "items": {
236
+ "type": "string"
237
+ }
238
+ },
239
+ "applicableDepartureIds": {
240
+ "type": "array",
241
+ "items": {
242
+ "type": "string"
243
+ }
244
+ },
245
+ "validFrom": {
246
+ "type": [
247
+ "string",
248
+ "null"
249
+ ]
250
+ },
251
+ "validTo": {
252
+ "type": [
253
+ "string",
254
+ "null"
255
+ ]
256
+ },
257
+ "minTravelers": {
258
+ "type": [
259
+ "integer",
260
+ "null"
261
+ ]
262
+ },
263
+ "imageMobileUrl": {
264
+ "type": [
265
+ "string",
266
+ "null"
267
+ ]
268
+ },
269
+ "imageDesktopUrl": {
270
+ "type": [
271
+ "string",
272
+ "null"
273
+ ]
274
+ },
275
+ "stackable": {
276
+ "type": "boolean"
277
+ },
278
+ "createdAt": {
279
+ "type": "string"
280
+ },
281
+ "updatedAt": {
282
+ "type": "string"
283
+ }
284
+ },
285
+ "required": [
286
+ "id",
287
+ "name",
288
+ "slug",
289
+ "description",
290
+ "discountType",
291
+ "discountValue",
292
+ "currency",
293
+ "applicableProductIds",
294
+ "applicableDepartureIds",
295
+ "validFrom",
296
+ "validTo",
297
+ "minTravelers",
298
+ "imageMobileUrl",
299
+ "imageDesktopUrl",
300
+ "stackable",
301
+ "createdAt",
302
+ "updatedAt"
303
+ ]
304
+ }
305
+ }
306
+ },
307
+ "required": [
308
+ "data"
309
+ ]
310
+ }
311
+ }
312
+ }
313
+ }
314
+ },
315
+ "operationId": "getPublicProductsByProductIdOffers",
316
+ "summary": "GET /v1/public/products/{productId}/offers",
317
+ "tags": [
318
+ "storefront"
319
+ ],
320
+ "x-voyant-module": "storefront",
321
+ "x-voyant-surface": "storefront"
322
+ }
323
+ },
324
+ "/v1/public/offers/{slug}": {
325
+ "get": {
326
+ "parameters": [
327
+ {
328
+ "schema": {
329
+ "type": "string"
330
+ },
331
+ "required": true,
332
+ "name": "slug",
333
+ "in": "path"
334
+ },
335
+ {
336
+ "schema": {
337
+ "type": "string"
338
+ },
339
+ "required": false,
340
+ "name": "departureId",
341
+ "in": "query"
342
+ },
343
+ {
344
+ "schema": {
345
+ "type": "string",
346
+ "minLength": 2
347
+ },
348
+ "required": false,
349
+ "name": "locale",
350
+ "in": "query"
351
+ }
352
+ ],
353
+ "responses": {
354
+ "200": {
355
+ "description": "A promotional offer by slug",
356
+ "content": {
357
+ "application/json": {
358
+ "schema": {
359
+ "type": "object",
360
+ "properties": {
361
+ "data": {
362
+ "type": "object",
363
+ "properties": {
364
+ "id": {
365
+ "type": "string"
366
+ },
367
+ "name": {
368
+ "type": "string"
369
+ },
370
+ "slug": {
371
+ "type": [
372
+ "string",
373
+ "null"
374
+ ]
375
+ },
376
+ "description": {
377
+ "type": [
378
+ "string",
379
+ "null"
380
+ ]
381
+ },
382
+ "discountType": {
383
+ "type": "string",
384
+ "enum": [
385
+ "percentage",
386
+ "fixed_amount"
387
+ ]
388
+ },
389
+ "discountValue": {
390
+ "type": "string"
391
+ },
392
+ "currency": {
393
+ "type": [
394
+ "string",
395
+ "null"
396
+ ]
397
+ },
398
+ "applicableProductIds": {
399
+ "type": "array",
400
+ "items": {
401
+ "type": "string"
402
+ }
403
+ },
404
+ "applicableDepartureIds": {
405
+ "type": "array",
406
+ "items": {
407
+ "type": "string"
408
+ }
409
+ },
410
+ "validFrom": {
411
+ "type": [
412
+ "string",
413
+ "null"
414
+ ]
415
+ },
416
+ "validTo": {
417
+ "type": [
418
+ "string",
419
+ "null"
420
+ ]
421
+ },
422
+ "minTravelers": {
423
+ "type": [
424
+ "integer",
425
+ "null"
426
+ ]
427
+ },
428
+ "imageMobileUrl": {
429
+ "type": [
430
+ "string",
431
+ "null"
432
+ ]
433
+ },
434
+ "imageDesktopUrl": {
435
+ "type": [
436
+ "string",
437
+ "null"
438
+ ]
439
+ },
440
+ "stackable": {
441
+ "type": "boolean"
442
+ },
443
+ "createdAt": {
444
+ "type": "string"
445
+ },
446
+ "updatedAt": {
447
+ "type": "string"
448
+ }
449
+ },
450
+ "required": [
451
+ "id",
452
+ "name",
453
+ "slug",
454
+ "description",
455
+ "discountType",
456
+ "discountValue",
457
+ "currency",
458
+ "applicableProductIds",
459
+ "applicableDepartureIds",
460
+ "validFrom",
461
+ "validTo",
462
+ "minTravelers",
463
+ "imageMobileUrl",
464
+ "imageDesktopUrl",
465
+ "stackable",
466
+ "createdAt",
467
+ "updatedAt"
468
+ ]
469
+ }
470
+ },
471
+ "required": [
472
+ "data"
473
+ ]
474
+ }
475
+ }
476
+ }
477
+ },
478
+ "404": {
479
+ "description": "Storefront offer not found",
480
+ "content": {
481
+ "application/json": {
482
+ "schema": {
483
+ "type": "object",
484
+ "properties": {
485
+ "error": {
486
+ "type": "string"
487
+ }
488
+ },
489
+ "required": [
490
+ "error"
491
+ ]
492
+ }
493
+ }
494
+ }
495
+ }
496
+ },
497
+ "operationId": "getPublicOffersBySlug",
498
+ "summary": "GET /v1/public/offers/{slug}",
499
+ "tags": [
500
+ "storefront"
501
+ ],
502
+ "x-voyant-module": "storefront",
503
+ "x-voyant-surface": "storefront"
504
+ }
505
+ },
506
+ "/v1/public/offers/{slug}/apply": {
507
+ "post": {
508
+ "parameters": [
509
+ {
510
+ "schema": {
511
+ "type": "string"
512
+ },
513
+ "required": true,
514
+ "name": "slug",
515
+ "in": "path"
516
+ }
517
+ ],
518
+ "requestBody": {
519
+ "required": true,
520
+ "content": {
521
+ "application/json": {
522
+ "schema": {
523
+ "type": "object",
524
+ "properties": {
525
+ "productId": {
526
+ "type": "string",
527
+ "minLength": 1
528
+ },
529
+ "departureId": {
530
+ "type": [
531
+ "string",
532
+ "null"
533
+ ],
534
+ "minLength": 1
535
+ },
536
+ "bookingId": {
537
+ "type": [
538
+ "string",
539
+ "null"
540
+ ],
541
+ "minLength": 1
542
+ },
543
+ "sessionId": {
544
+ "type": [
545
+ "string",
546
+ "null"
547
+ ],
548
+ "minLength": 1
549
+ },
550
+ "locale": {
551
+ "type": "string",
552
+ "minLength": 2
553
+ },
554
+ "pax": {
555
+ "type": "integer",
556
+ "minimum": 1
557
+ },
558
+ "audience": {
559
+ "type": "string",
560
+ "enum": [
561
+ "staff",
562
+ "customer",
563
+ "partner",
564
+ "supplier"
565
+ ],
566
+ "default": "customer"
567
+ },
568
+ "market": {
569
+ "type": "string",
570
+ "minLength": 1,
571
+ "default": "default"
572
+ },
573
+ "basePriceCents": {
574
+ "type": [
575
+ "integer",
576
+ "null"
577
+ ],
578
+ "minimum": 0
579
+ },
580
+ "currency": {
581
+ "type": "string",
582
+ "minLength": 3,
583
+ "maxLength": 3
584
+ }
585
+ },
586
+ "required": [
587
+ "productId",
588
+ "pax",
589
+ "basePriceCents",
590
+ "currency"
591
+ ]
592
+ }
593
+ }
594
+ }
595
+ },
596
+ "responses": {
597
+ "200": {
598
+ "description": "Result of applying a promotional offer",
599
+ "content": {
600
+ "application/json": {
601
+ "schema": {
602
+ "type": "object",
603
+ "properties": {
604
+ "data": {
605
+ "type": "object",
606
+ "properties": {
607
+ "status": {
608
+ "type": "string",
609
+ "enum": [
610
+ "applied",
611
+ "not_applicable",
612
+ "invalid",
613
+ "conflict"
614
+ ]
615
+ },
616
+ "reason": {
617
+ "type": [
618
+ "string",
619
+ "null"
620
+ ],
621
+ "enum": [
622
+ "offer_not_found",
623
+ "offer_expired",
624
+ "offer_not_yet_valid",
625
+ "code_not_found",
626
+ "code_required",
627
+ "code_expired",
628
+ "code_not_yet_valid",
629
+ "scope",
630
+ "min_pax",
631
+ "eligibility",
632
+ "currency",
633
+ "no_discount",
634
+ "booking_mismatch",
635
+ "session_mismatch",
636
+ "conflict",
637
+ null
638
+ ]
639
+ },
640
+ "offer": {
641
+ "type": [
642
+ "object",
643
+ "null"
644
+ ],
645
+ "properties": {
646
+ "id": {
647
+ "type": "string"
648
+ },
649
+ "name": {
650
+ "type": "string"
651
+ },
652
+ "slug": {
653
+ "type": [
654
+ "string",
655
+ "null"
656
+ ]
657
+ },
658
+ "description": {
659
+ "type": [
660
+ "string",
661
+ "null"
662
+ ]
663
+ },
664
+ "discountType": {
665
+ "type": "string",
666
+ "enum": [
667
+ "percentage",
668
+ "fixed_amount"
669
+ ]
670
+ },
671
+ "discountValue": {
672
+ "type": "string"
673
+ },
674
+ "currency": {
675
+ "type": [
676
+ "string",
677
+ "null"
678
+ ]
679
+ },
680
+ "applicableProductIds": {
681
+ "type": "array",
682
+ "items": {
683
+ "type": "string"
684
+ }
685
+ },
686
+ "applicableDepartureIds": {
687
+ "type": "array",
688
+ "items": {
689
+ "type": "string"
690
+ }
691
+ },
692
+ "validFrom": {
693
+ "type": [
694
+ "string",
695
+ "null"
696
+ ]
697
+ },
698
+ "validTo": {
699
+ "type": [
700
+ "string",
701
+ "null"
702
+ ]
703
+ },
704
+ "minTravelers": {
705
+ "type": [
706
+ "integer",
707
+ "null"
708
+ ]
709
+ },
710
+ "imageMobileUrl": {
711
+ "type": [
712
+ "string",
713
+ "null"
714
+ ]
715
+ },
716
+ "imageDesktopUrl": {
717
+ "type": [
718
+ "string",
719
+ "null"
720
+ ]
721
+ },
722
+ "stackable": {
723
+ "type": "boolean"
724
+ },
725
+ "createdAt": {
726
+ "type": "string"
727
+ },
728
+ "updatedAt": {
729
+ "type": "string"
730
+ }
731
+ },
732
+ "required": [
733
+ "id",
734
+ "name",
735
+ "slug",
736
+ "description",
737
+ "discountType",
738
+ "discountValue",
739
+ "currency",
740
+ "applicableProductIds",
741
+ "applicableDepartureIds",
742
+ "validFrom",
743
+ "validTo",
744
+ "minTravelers",
745
+ "imageMobileUrl",
746
+ "imageDesktopUrl",
747
+ "stackable",
748
+ "createdAt",
749
+ "updatedAt"
750
+ ]
751
+ },
752
+ "target": {
753
+ "type": "object",
754
+ "properties": {
755
+ "bookingId": {
756
+ "type": [
757
+ "string",
758
+ "null"
759
+ ]
760
+ },
761
+ "sessionId": {
762
+ "type": [
763
+ "string",
764
+ "null"
765
+ ]
766
+ },
767
+ "productId": {
768
+ "type": "string"
769
+ },
770
+ "departureId": {
771
+ "type": [
772
+ "string",
773
+ "null"
774
+ ]
775
+ }
776
+ },
777
+ "required": [
778
+ "bookingId",
779
+ "sessionId",
780
+ "productId",
781
+ "departureId"
782
+ ]
783
+ },
784
+ "pricing": {
785
+ "type": "object",
786
+ "properties": {
787
+ "basePriceCents": {
788
+ "type": "integer"
789
+ },
790
+ "currency": {
791
+ "type": "string"
792
+ },
793
+ "discountAppliedCents": {
794
+ "type": "integer"
795
+ },
796
+ "discountedPriceCents": {
797
+ "type": "integer"
798
+ }
799
+ },
800
+ "required": [
801
+ "basePriceCents",
802
+ "currency",
803
+ "discountAppliedCents",
804
+ "discountedPriceCents"
805
+ ]
806
+ },
807
+ "appliedOffers": {
808
+ "type": "array",
809
+ "items": {
810
+ "type": "object",
811
+ "properties": {
812
+ "offerId": {
813
+ "type": "string"
814
+ },
815
+ "offerName": {
816
+ "type": "string"
817
+ },
818
+ "discountAppliedCents": {
819
+ "type": "integer"
820
+ },
821
+ "discountedPriceCents": {
822
+ "type": "integer"
823
+ },
824
+ "currency": {
825
+ "type": "string"
826
+ },
827
+ "discountKind": {
828
+ "type": "string",
829
+ "enum": [
830
+ "percentage",
831
+ "fixed_amount"
832
+ ]
833
+ },
834
+ "discountPercent": {
835
+ "type": [
836
+ "number",
837
+ "null"
838
+ ]
839
+ },
840
+ "discountAmountCents": {
841
+ "type": [
842
+ "integer",
843
+ "null"
844
+ ]
845
+ },
846
+ "appliedCode": {
847
+ "type": [
848
+ "string",
849
+ "null"
850
+ ]
851
+ },
852
+ "stackable": {
853
+ "type": "boolean"
854
+ }
855
+ },
856
+ "required": [
857
+ "offerId",
858
+ "offerName",
859
+ "discountAppliedCents",
860
+ "discountedPriceCents",
861
+ "currency",
862
+ "discountKind",
863
+ "discountPercent",
864
+ "discountAmountCents",
865
+ "appliedCode",
866
+ "stackable"
867
+ ]
868
+ }
869
+ },
870
+ "conflict": {
871
+ "type": [
872
+ "object",
873
+ "null"
874
+ ],
875
+ "properties": {
876
+ "policy": {
877
+ "type": "string",
878
+ "enum": [
879
+ "best_discount_wins",
880
+ "stackable_compose"
881
+ ]
882
+ },
883
+ "autoAppliedOfferIds": {
884
+ "type": "array",
885
+ "items": {
886
+ "type": "string"
887
+ }
888
+ },
889
+ "manualOfferId": {
890
+ "type": [
891
+ "string",
892
+ "null"
893
+ ]
894
+ },
895
+ "selectedOfferIds": {
896
+ "type": "array",
897
+ "items": {
898
+ "type": "string"
899
+ }
900
+ },
901
+ "message": {
902
+ "type": "string"
903
+ }
904
+ },
905
+ "required": [
906
+ "policy",
907
+ "autoAppliedOfferIds",
908
+ "manualOfferId",
909
+ "selectedOfferIds",
910
+ "message"
911
+ ]
912
+ }
913
+ },
914
+ "required": [
915
+ "status",
916
+ "reason",
917
+ "offer",
918
+ "target",
919
+ "pricing",
920
+ "appliedOffers",
921
+ "conflict"
922
+ ]
923
+ }
924
+ },
925
+ "required": [
926
+ "data"
927
+ ]
928
+ }
929
+ }
930
+ }
931
+ },
932
+ "501": {
933
+ "description": "Storefront offer application is not configured",
934
+ "content": {
935
+ "application/json": {
936
+ "schema": {
937
+ "type": "object",
938
+ "properties": {
939
+ "error": {
940
+ "type": "string"
941
+ }
942
+ },
943
+ "required": [
944
+ "error"
945
+ ]
946
+ }
947
+ }
948
+ }
949
+ }
950
+ },
951
+ "operationId": "postPublicOffersBySlugApply",
952
+ "summary": "POST /v1/public/offers/{slug}/apply",
953
+ "tags": [
954
+ "storefront"
955
+ ],
956
+ "x-voyant-module": "storefront",
957
+ "x-voyant-surface": "storefront"
958
+ }
959
+ },
960
+ "/v1/public/offers/redeem": {
961
+ "post": {
962
+ "requestBody": {
963
+ "required": true,
964
+ "content": {
965
+ "application/json": {
966
+ "schema": {
967
+ "type": "object",
968
+ "properties": {
969
+ "productId": {
970
+ "type": "string",
971
+ "minLength": 1
972
+ },
973
+ "departureId": {
974
+ "type": [
975
+ "string",
976
+ "null"
977
+ ],
978
+ "minLength": 1
979
+ },
980
+ "bookingId": {
981
+ "type": [
982
+ "string",
983
+ "null"
984
+ ],
985
+ "minLength": 1
986
+ },
987
+ "sessionId": {
988
+ "type": [
989
+ "string",
990
+ "null"
991
+ ],
992
+ "minLength": 1
993
+ },
994
+ "locale": {
995
+ "type": "string",
996
+ "minLength": 2
997
+ },
998
+ "pax": {
999
+ "type": "integer",
1000
+ "minimum": 1
1001
+ },
1002
+ "audience": {
1003
+ "type": "string",
1004
+ "enum": [
1005
+ "staff",
1006
+ "customer",
1007
+ "partner",
1008
+ "supplier"
1009
+ ],
1010
+ "default": "customer"
1011
+ },
1012
+ "market": {
1013
+ "type": "string",
1014
+ "minLength": 1,
1015
+ "default": "default"
1016
+ },
1017
+ "basePriceCents": {
1018
+ "type": [
1019
+ "integer",
1020
+ "null"
1021
+ ],
1022
+ "minimum": 0
1023
+ },
1024
+ "currency": {
1025
+ "type": "string",
1026
+ "minLength": 3,
1027
+ "maxLength": 3
1028
+ },
1029
+ "code": {
1030
+ "type": "string",
1031
+ "minLength": 1,
1032
+ "maxLength": 80
1033
+ }
1034
+ },
1035
+ "required": [
1036
+ "productId",
1037
+ "pax",
1038
+ "basePriceCents",
1039
+ "currency",
1040
+ "code"
1041
+ ]
1042
+ }
1043
+ }
1044
+ }
1045
+ },
1046
+ "responses": {
1047
+ "200": {
1048
+ "description": "Result of redeeming a promotional offer code",
1049
+ "content": {
1050
+ "application/json": {
1051
+ "schema": {
1052
+ "type": "object",
1053
+ "properties": {
1054
+ "data": {
1055
+ "type": "object",
1056
+ "properties": {
1057
+ "status": {
1058
+ "type": "string",
1059
+ "enum": [
1060
+ "applied",
1061
+ "not_applicable",
1062
+ "invalid",
1063
+ "conflict"
1064
+ ]
1065
+ },
1066
+ "reason": {
1067
+ "type": [
1068
+ "string",
1069
+ "null"
1070
+ ],
1071
+ "enum": [
1072
+ "offer_not_found",
1073
+ "offer_expired",
1074
+ "offer_not_yet_valid",
1075
+ "code_not_found",
1076
+ "code_required",
1077
+ "code_expired",
1078
+ "code_not_yet_valid",
1079
+ "scope",
1080
+ "min_pax",
1081
+ "eligibility",
1082
+ "currency",
1083
+ "no_discount",
1084
+ "booking_mismatch",
1085
+ "session_mismatch",
1086
+ "conflict",
1087
+ null
1088
+ ]
1089
+ },
1090
+ "offer": {
1091
+ "type": [
1092
+ "object",
1093
+ "null"
1094
+ ],
1095
+ "properties": {
1096
+ "id": {
1097
+ "type": "string"
1098
+ },
1099
+ "name": {
1100
+ "type": "string"
1101
+ },
1102
+ "slug": {
1103
+ "type": [
1104
+ "string",
1105
+ "null"
1106
+ ]
1107
+ },
1108
+ "description": {
1109
+ "type": [
1110
+ "string",
1111
+ "null"
1112
+ ]
1113
+ },
1114
+ "discountType": {
1115
+ "type": "string",
1116
+ "enum": [
1117
+ "percentage",
1118
+ "fixed_amount"
1119
+ ]
1120
+ },
1121
+ "discountValue": {
1122
+ "type": "string"
1123
+ },
1124
+ "currency": {
1125
+ "type": [
1126
+ "string",
1127
+ "null"
1128
+ ]
1129
+ },
1130
+ "applicableProductIds": {
1131
+ "type": "array",
1132
+ "items": {
1133
+ "type": "string"
1134
+ }
1135
+ },
1136
+ "applicableDepartureIds": {
1137
+ "type": "array",
1138
+ "items": {
1139
+ "type": "string"
1140
+ }
1141
+ },
1142
+ "validFrom": {
1143
+ "type": [
1144
+ "string",
1145
+ "null"
1146
+ ]
1147
+ },
1148
+ "validTo": {
1149
+ "type": [
1150
+ "string",
1151
+ "null"
1152
+ ]
1153
+ },
1154
+ "minTravelers": {
1155
+ "type": [
1156
+ "integer",
1157
+ "null"
1158
+ ]
1159
+ },
1160
+ "imageMobileUrl": {
1161
+ "type": [
1162
+ "string",
1163
+ "null"
1164
+ ]
1165
+ },
1166
+ "imageDesktopUrl": {
1167
+ "type": [
1168
+ "string",
1169
+ "null"
1170
+ ]
1171
+ },
1172
+ "stackable": {
1173
+ "type": "boolean"
1174
+ },
1175
+ "createdAt": {
1176
+ "type": "string"
1177
+ },
1178
+ "updatedAt": {
1179
+ "type": "string"
1180
+ }
1181
+ },
1182
+ "required": [
1183
+ "id",
1184
+ "name",
1185
+ "slug",
1186
+ "description",
1187
+ "discountType",
1188
+ "discountValue",
1189
+ "currency",
1190
+ "applicableProductIds",
1191
+ "applicableDepartureIds",
1192
+ "validFrom",
1193
+ "validTo",
1194
+ "minTravelers",
1195
+ "imageMobileUrl",
1196
+ "imageDesktopUrl",
1197
+ "stackable",
1198
+ "createdAt",
1199
+ "updatedAt"
1200
+ ]
1201
+ },
1202
+ "target": {
1203
+ "type": "object",
1204
+ "properties": {
1205
+ "bookingId": {
1206
+ "type": [
1207
+ "string",
1208
+ "null"
1209
+ ]
1210
+ },
1211
+ "sessionId": {
1212
+ "type": [
1213
+ "string",
1214
+ "null"
1215
+ ]
1216
+ },
1217
+ "productId": {
1218
+ "type": "string"
1219
+ },
1220
+ "departureId": {
1221
+ "type": [
1222
+ "string",
1223
+ "null"
1224
+ ]
1225
+ }
1226
+ },
1227
+ "required": [
1228
+ "bookingId",
1229
+ "sessionId",
1230
+ "productId",
1231
+ "departureId"
1232
+ ]
1233
+ },
1234
+ "pricing": {
1235
+ "type": "object",
1236
+ "properties": {
1237
+ "basePriceCents": {
1238
+ "type": "integer"
1239
+ },
1240
+ "currency": {
1241
+ "type": "string"
1242
+ },
1243
+ "discountAppliedCents": {
1244
+ "type": "integer"
1245
+ },
1246
+ "discountedPriceCents": {
1247
+ "type": "integer"
1248
+ }
1249
+ },
1250
+ "required": [
1251
+ "basePriceCents",
1252
+ "currency",
1253
+ "discountAppliedCents",
1254
+ "discountedPriceCents"
1255
+ ]
1256
+ },
1257
+ "appliedOffers": {
1258
+ "type": "array",
1259
+ "items": {
1260
+ "type": "object",
1261
+ "properties": {
1262
+ "offerId": {
1263
+ "type": "string"
1264
+ },
1265
+ "offerName": {
1266
+ "type": "string"
1267
+ },
1268
+ "discountAppliedCents": {
1269
+ "type": "integer"
1270
+ },
1271
+ "discountedPriceCents": {
1272
+ "type": "integer"
1273
+ },
1274
+ "currency": {
1275
+ "type": "string"
1276
+ },
1277
+ "discountKind": {
1278
+ "type": "string",
1279
+ "enum": [
1280
+ "percentage",
1281
+ "fixed_amount"
1282
+ ]
1283
+ },
1284
+ "discountPercent": {
1285
+ "type": [
1286
+ "number",
1287
+ "null"
1288
+ ]
1289
+ },
1290
+ "discountAmountCents": {
1291
+ "type": [
1292
+ "integer",
1293
+ "null"
1294
+ ]
1295
+ },
1296
+ "appliedCode": {
1297
+ "type": [
1298
+ "string",
1299
+ "null"
1300
+ ]
1301
+ },
1302
+ "stackable": {
1303
+ "type": "boolean"
1304
+ }
1305
+ },
1306
+ "required": [
1307
+ "offerId",
1308
+ "offerName",
1309
+ "discountAppliedCents",
1310
+ "discountedPriceCents",
1311
+ "currency",
1312
+ "discountKind",
1313
+ "discountPercent",
1314
+ "discountAmountCents",
1315
+ "appliedCode",
1316
+ "stackable"
1317
+ ]
1318
+ }
1319
+ },
1320
+ "conflict": {
1321
+ "type": [
1322
+ "object",
1323
+ "null"
1324
+ ],
1325
+ "properties": {
1326
+ "policy": {
1327
+ "type": "string",
1328
+ "enum": [
1329
+ "best_discount_wins",
1330
+ "stackable_compose"
1331
+ ]
1332
+ },
1333
+ "autoAppliedOfferIds": {
1334
+ "type": "array",
1335
+ "items": {
1336
+ "type": "string"
1337
+ }
1338
+ },
1339
+ "manualOfferId": {
1340
+ "type": [
1341
+ "string",
1342
+ "null"
1343
+ ]
1344
+ },
1345
+ "selectedOfferIds": {
1346
+ "type": "array",
1347
+ "items": {
1348
+ "type": "string"
1349
+ }
1350
+ },
1351
+ "message": {
1352
+ "type": "string"
1353
+ }
1354
+ },
1355
+ "required": [
1356
+ "policy",
1357
+ "autoAppliedOfferIds",
1358
+ "manualOfferId",
1359
+ "selectedOfferIds",
1360
+ "message"
1361
+ ]
1362
+ }
1363
+ },
1364
+ "required": [
1365
+ "status",
1366
+ "reason",
1367
+ "offer",
1368
+ "target",
1369
+ "pricing",
1370
+ "appliedOffers",
1371
+ "conflict"
1372
+ ]
1373
+ }
1374
+ },
1375
+ "required": [
1376
+ "data"
1377
+ ]
1378
+ }
1379
+ }
1380
+ }
1381
+ },
1382
+ "501": {
1383
+ "description": "Storefront offer redemption is not configured",
1384
+ "content": {
1385
+ "application/json": {
1386
+ "schema": {
1387
+ "type": "object",
1388
+ "properties": {
1389
+ "error": {
1390
+ "type": "string"
1391
+ }
1392
+ },
1393
+ "required": [
1394
+ "error"
1395
+ ]
1396
+ }
1397
+ }
1398
+ }
1399
+ }
1400
+ },
1401
+ "operationId": "postPublicOffersRedeem",
1402
+ "summary": "POST /v1/public/offers/redeem",
1403
+ "tags": [
1404
+ "storefront"
1405
+ ],
1406
+ "x-voyant-module": "storefront",
1407
+ "x-voyant-surface": "storefront"
1408
+ }
1409
+ },
1410
+ "/v1/public/leads": {
1411
+ "post": {
1412
+ "requestBody": {
1413
+ "required": true,
1414
+ "content": {
1415
+ "application/json": {
1416
+ "schema": {
1417
+ "type": "object",
1418
+ "properties": {
1419
+ "kind": {
1420
+ "type": "string",
1421
+ "enum": [
1422
+ "wishlist",
1423
+ "notify",
1424
+ "inquiry",
1425
+ "request_offer",
1426
+ "referral"
1427
+ ],
1428
+ "default": "inquiry"
1429
+ },
1430
+ "source": {
1431
+ "type": "string",
1432
+ "enum": [
1433
+ "form",
1434
+ "phone",
1435
+ "admin",
1436
+ "abandoned_cart",
1437
+ "website",
1438
+ "booking"
1439
+ ],
1440
+ "default": "website"
1441
+ },
1442
+ "contact": {
1443
+ "type": "object",
1444
+ "properties": {
1445
+ "name": {
1446
+ "type": "string",
1447
+ "minLength": 1,
1448
+ "maxLength": 240
1449
+ },
1450
+ "firstName": {
1451
+ "type": "string",
1452
+ "minLength": 1,
1453
+ "maxLength": 120
1454
+ },
1455
+ "lastName": {
1456
+ "type": "string",
1457
+ "minLength": 1,
1458
+ "maxLength": 120
1459
+ },
1460
+ "email": {
1461
+ "type": "string",
1462
+ "maxLength": 320,
1463
+ "format": "email"
1464
+ },
1465
+ "phone": {
1466
+ "type": "string",
1467
+ "minLength": 3,
1468
+ "maxLength": 64
1469
+ }
1470
+ }
1471
+ },
1472
+ "productId": {
1473
+ "type": [
1474
+ "string",
1475
+ "null"
1476
+ ],
1477
+ "minLength": 1,
1478
+ "maxLength": 160
1479
+ },
1480
+ "optionUnitId": {
1481
+ "type": [
1482
+ "string",
1483
+ "null"
1484
+ ],
1485
+ "minLength": 1,
1486
+ "maxLength": 160
1487
+ },
1488
+ "notes": {
1489
+ "type": [
1490
+ "string",
1491
+ "null"
1492
+ ],
1493
+ "maxLength": 4000
1494
+ },
1495
+ "tags": {
1496
+ "type": "array",
1497
+ "items": {
1498
+ "type": "string",
1499
+ "minLength": 1,
1500
+ "maxLength": 64
1501
+ },
1502
+ "maxItems": 20,
1503
+ "default": []
1504
+ },
1505
+ "sourceSubmissionId": {
1506
+ "type": [
1507
+ "string",
1508
+ "null"
1509
+ ],
1510
+ "minLength": 1,
1511
+ "maxLength": 160
1512
+ },
1513
+ "sourceUrl": {
1514
+ "type": [
1515
+ "string",
1516
+ "null"
1517
+ ],
1518
+ "format": "uri"
1519
+ },
1520
+ "locale": {
1521
+ "type": "string",
1522
+ "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
1523
+ },
1524
+ "payload": {
1525
+ "type": "object",
1526
+ "additionalProperties": {},
1527
+ "default": {}
1528
+ },
1529
+ "consent": {
1530
+ "type": "object",
1531
+ "properties": {
1532
+ "marketing": {
1533
+ "type": "boolean",
1534
+ "default": false
1535
+ },
1536
+ "newsletter": {
1537
+ "type": "boolean",
1538
+ "default": false
1539
+ },
1540
+ "gdpr": {
1541
+ "type": "boolean",
1542
+ "default": false
1543
+ },
1544
+ "scope": {
1545
+ "type": [
1546
+ "string",
1547
+ "null"
1548
+ ],
1549
+ "minLength": 1,
1550
+ "maxLength": 120
1551
+ },
1552
+ "acceptedAt": {
1553
+ "type": [
1554
+ "string",
1555
+ "null"
1556
+ ],
1557
+ "format": "date-time"
1558
+ }
1559
+ },
1560
+ "default": {
1561
+ "marketing": false,
1562
+ "newsletter": false,
1563
+ "gdpr": false
1564
+ }
1565
+ }
1566
+ },
1567
+ "required": [
1568
+ "contact"
1569
+ ]
1570
+ }
1571
+ }
1572
+ }
1573
+ },
1574
+ "responses": {
1575
+ "201": {
1576
+ "description": "The captured storefront lead/inquiry signal",
1577
+ "content": {
1578
+ "application/json": {
1579
+ "schema": {
1580
+ "type": "object",
1581
+ "properties": {
1582
+ "data": {
1583
+ "type": "object",
1584
+ "properties": {
1585
+ "id": {
1586
+ "type": "string"
1587
+ },
1588
+ "personId": {
1589
+ "type": "string"
1590
+ },
1591
+ "kind": {
1592
+ "type": "string",
1593
+ "enum": [
1594
+ "wishlist",
1595
+ "notify",
1596
+ "inquiry",
1597
+ "request_offer",
1598
+ "referral"
1599
+ ]
1600
+ },
1601
+ "source": {
1602
+ "type": "string",
1603
+ "enum": [
1604
+ "form",
1605
+ "phone",
1606
+ "admin",
1607
+ "abandoned_cart",
1608
+ "website",
1609
+ "booking"
1610
+ ]
1611
+ },
1612
+ "status": {
1613
+ "type": "string",
1614
+ "enum": [
1615
+ "new",
1616
+ "contacted",
1617
+ "qualified",
1618
+ "converted",
1619
+ "lost",
1620
+ "expired"
1621
+ ]
1622
+ },
1623
+ "duplicate": {
1624
+ "type": "boolean"
1625
+ }
1626
+ },
1627
+ "required": [
1628
+ "id",
1629
+ "personId",
1630
+ "kind",
1631
+ "source",
1632
+ "status",
1633
+ "duplicate"
1634
+ ]
1635
+ }
1636
+ },
1637
+ "required": [
1638
+ "data"
1639
+ ]
1640
+ }
1641
+ }
1642
+ }
1643
+ },
1644
+ "400": {
1645
+ "description": "Rejected by intake guard (invalid request)",
1646
+ "content": {
1647
+ "application/json": {
1648
+ "schema": {
1649
+ "type": "object",
1650
+ "properties": {
1651
+ "error": {
1652
+ "type": "string"
1653
+ }
1654
+ },
1655
+ "required": [
1656
+ "error"
1657
+ ]
1658
+ }
1659
+ }
1660
+ }
1661
+ },
1662
+ "403": {
1663
+ "description": "Rejected by the deployment intake guard (e.g. spam/abuse)",
1664
+ "content": {
1665
+ "application/json": {
1666
+ "schema": {
1667
+ "type": "object",
1668
+ "properties": {
1669
+ "error": {
1670
+ "type": "string"
1671
+ }
1672
+ },
1673
+ "required": [
1674
+ "error"
1675
+ ]
1676
+ }
1677
+ }
1678
+ }
1679
+ },
1680
+ "429": {
1681
+ "description": "Rejected by intake guard (rate limited)",
1682
+ "content": {
1683
+ "application/json": {
1684
+ "schema": {
1685
+ "type": "object",
1686
+ "properties": {
1687
+ "error": {
1688
+ "type": "string"
1689
+ }
1690
+ },
1691
+ "required": [
1692
+ "error"
1693
+ ]
1694
+ }
1695
+ }
1696
+ }
1697
+ }
1698
+ },
1699
+ "operationId": "postPublicLeads",
1700
+ "summary": "POST /v1/public/leads",
1701
+ "tags": [
1702
+ "storefront"
1703
+ ],
1704
+ "x-voyant-module": "storefront",
1705
+ "x-voyant-surface": "storefront"
1706
+ }
1707
+ },
1708
+ "/v1/public/newsletter/subscribe": {
1709
+ "post": {
1710
+ "requestBody": {
1711
+ "required": true,
1712
+ "content": {
1713
+ "application/json": {
1714
+ "schema": {
1715
+ "type": "object",
1716
+ "properties": {
1717
+ "email": {
1718
+ "type": "string",
1719
+ "maxLength": 320,
1720
+ "format": "email"
1721
+ },
1722
+ "name": {
1723
+ "type": "string",
1724
+ "minLength": 1,
1725
+ "maxLength": 240
1726
+ },
1727
+ "firstName": {
1728
+ "type": "string",
1729
+ "minLength": 1,
1730
+ "maxLength": 120
1731
+ },
1732
+ "lastName": {
1733
+ "type": "string",
1734
+ "minLength": 1,
1735
+ "maxLength": 120
1736
+ },
1737
+ "source": {
1738
+ "type": "string",
1739
+ "enum": [
1740
+ "form",
1741
+ "phone",
1742
+ "admin",
1743
+ "abandoned_cart",
1744
+ "website",
1745
+ "booking"
1746
+ ],
1747
+ "default": "website"
1748
+ },
1749
+ "sourceSubmissionId": {
1750
+ "type": [
1751
+ "string",
1752
+ "null"
1753
+ ],
1754
+ "minLength": 1,
1755
+ "maxLength": 160
1756
+ },
1757
+ "sourceUrl": {
1758
+ "type": [
1759
+ "string",
1760
+ "null"
1761
+ ],
1762
+ "format": "uri"
1763
+ },
1764
+ "locale": {
1765
+ "type": "string",
1766
+ "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
1767
+ },
1768
+ "tags": {
1769
+ "type": "array",
1770
+ "items": {
1771
+ "type": "string",
1772
+ "minLength": 1,
1773
+ "maxLength": 64
1774
+ },
1775
+ "maxItems": 20,
1776
+ "default": []
1777
+ },
1778
+ "payload": {
1779
+ "type": "object",
1780
+ "additionalProperties": {},
1781
+ "default": {}
1782
+ },
1783
+ "consent": {
1784
+ "type": "object",
1785
+ "properties": {
1786
+ "marketing": {
1787
+ "type": "boolean",
1788
+ "default": false
1789
+ },
1790
+ "newsletter": {
1791
+ "type": "boolean",
1792
+ "enum": [
1793
+ true
1794
+ ]
1795
+ },
1796
+ "gdpr": {
1797
+ "type": "boolean",
1798
+ "default": false
1799
+ },
1800
+ "scope": {
1801
+ "type": [
1802
+ "string",
1803
+ "null"
1804
+ ],
1805
+ "minLength": 1,
1806
+ "maxLength": 120
1807
+ },
1808
+ "acceptedAt": {
1809
+ "type": [
1810
+ "string",
1811
+ "null"
1812
+ ],
1813
+ "format": "date-time"
1814
+ }
1815
+ },
1816
+ "required": [
1817
+ "newsletter"
1818
+ ]
1819
+ }
1820
+ },
1821
+ "required": [
1822
+ "email",
1823
+ "consent"
1824
+ ]
1825
+ }
1826
+ }
1827
+ }
1828
+ },
1829
+ "responses": {
1830
+ "202": {
1831
+ "description": "The captured newsletter subscription signal",
1832
+ "content": {
1833
+ "application/json": {
1834
+ "schema": {
1835
+ "type": "object",
1836
+ "properties": {
1837
+ "data": {
1838
+ "type": "object",
1839
+ "properties": {
1840
+ "id": {
1841
+ "type": "string"
1842
+ },
1843
+ "personId": {
1844
+ "type": "string"
1845
+ },
1846
+ "kind": {
1847
+ "type": "string",
1848
+ "enum": [
1849
+ "wishlist",
1850
+ "notify",
1851
+ "inquiry",
1852
+ "request_offer",
1853
+ "referral"
1854
+ ]
1855
+ },
1856
+ "source": {
1857
+ "type": "string",
1858
+ "enum": [
1859
+ "form",
1860
+ "phone",
1861
+ "admin",
1862
+ "abandoned_cart",
1863
+ "website",
1864
+ "booking"
1865
+ ]
1866
+ },
1867
+ "status": {
1868
+ "type": "string",
1869
+ "enum": [
1870
+ "new",
1871
+ "contacted",
1872
+ "qualified",
1873
+ "converted",
1874
+ "lost",
1875
+ "expired"
1876
+ ]
1877
+ },
1878
+ "duplicate": {
1879
+ "type": "boolean"
1880
+ },
1881
+ "doubleOptIn": {
1882
+ "type": "string",
1883
+ "enum": [
1884
+ "not_configured",
1885
+ "requested"
1886
+ ]
1887
+ }
1888
+ },
1889
+ "required": [
1890
+ "id",
1891
+ "personId",
1892
+ "kind",
1893
+ "source",
1894
+ "status",
1895
+ "duplicate",
1896
+ "doubleOptIn"
1897
+ ]
1898
+ }
1899
+ },
1900
+ "required": [
1901
+ "data"
1902
+ ]
1903
+ }
1904
+ }
1905
+ }
1906
+ },
1907
+ "400": {
1908
+ "description": "Rejected by intake guard (invalid request)",
1909
+ "content": {
1910
+ "application/json": {
1911
+ "schema": {
1912
+ "type": "object",
1913
+ "properties": {
1914
+ "error": {
1915
+ "type": "string"
1916
+ }
1917
+ },
1918
+ "required": [
1919
+ "error"
1920
+ ]
1921
+ }
1922
+ }
1923
+ }
1924
+ },
1925
+ "403": {
1926
+ "description": "Rejected by the deployment intake guard (e.g. spam/abuse)",
1927
+ "content": {
1928
+ "application/json": {
1929
+ "schema": {
1930
+ "type": "object",
1931
+ "properties": {
1932
+ "error": {
1933
+ "type": "string"
1934
+ }
1935
+ },
1936
+ "required": [
1937
+ "error"
1938
+ ]
1939
+ }
1940
+ }
1941
+ }
1942
+ },
1943
+ "429": {
1944
+ "description": "Rejected by intake guard (rate limited)",
1945
+ "content": {
1946
+ "application/json": {
1947
+ "schema": {
1948
+ "type": "object",
1949
+ "properties": {
1950
+ "error": {
1951
+ "type": "string"
1952
+ }
1953
+ },
1954
+ "required": [
1955
+ "error"
1956
+ ]
1957
+ }
1958
+ }
1959
+ }
1960
+ }
1961
+ },
1962
+ "operationId": "postPublicNewsletterSubscribe",
1963
+ "summary": "POST /v1/public/newsletter/subscribe",
1964
+ "tags": [
1965
+ "storefront"
1966
+ ],
1967
+ "x-voyant-module": "storefront",
1968
+ "x-voyant-surface": "storefront"
1969
+ }
1970
+ },
1971
+ "/v1/public/settings": {
1972
+ "get": {
1973
+ "responses": {
1974
+ "200": {
1975
+ "description": "The deployment's public storefront settings",
1976
+ "content": {
1977
+ "application/json": {
1978
+ "schema": {
1979
+ "type": "object",
1980
+ "properties": {
1981
+ "data": {
1982
+ "type": "object",
1983
+ "properties": {
1984
+ "branding": {
1985
+ "type": "object",
1986
+ "properties": {
1987
+ "logoUrl": {
1988
+ "type": [
1989
+ "string",
1990
+ "null"
1991
+ ],
1992
+ "format": "uri"
1993
+ },
1994
+ "faviconUrl": {
1995
+ "type": [
1996
+ "string",
1997
+ "null"
1998
+ ],
1999
+ "format": "uri"
2000
+ },
2001
+ "brandMarkUrl": {
2002
+ "type": [
2003
+ "string",
2004
+ "null"
2005
+ ],
2006
+ "format": "uri"
2007
+ },
2008
+ "primaryColor": {
2009
+ "type": [
2010
+ "string",
2011
+ "null"
2012
+ ],
2013
+ "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
2014
+ },
2015
+ "accentColor": {
2016
+ "type": [
2017
+ "string",
2018
+ "null"
2019
+ ],
2020
+ "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
2021
+ },
2022
+ "supportedLanguages": {
2023
+ "type": "array",
2024
+ "items": {
2025
+ "type": "string",
2026
+ "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
2027
+ }
2028
+ }
2029
+ },
2030
+ "required": [
2031
+ "logoUrl",
2032
+ "faviconUrl",
2033
+ "brandMarkUrl",
2034
+ "primaryColor",
2035
+ "accentColor",
2036
+ "supportedLanguages"
2037
+ ]
2038
+ },
2039
+ "support": {
2040
+ "type": "object",
2041
+ "properties": {
2042
+ "email": {
2043
+ "type": [
2044
+ "string",
2045
+ "null"
2046
+ ],
2047
+ "format": "email"
2048
+ },
2049
+ "phone": {
2050
+ "type": [
2051
+ "string",
2052
+ "null"
2053
+ ],
2054
+ "minLength": 1
2055
+ },
2056
+ "links": {
2057
+ "type": "array",
2058
+ "items": {
2059
+ "type": "object",
2060
+ "properties": {
2061
+ "label": {
2062
+ "type": "string",
2063
+ "minLength": 1
2064
+ },
2065
+ "url": {
2066
+ "type": "string",
2067
+ "format": "uri"
2068
+ }
2069
+ },
2070
+ "required": [
2071
+ "label",
2072
+ "url"
2073
+ ]
2074
+ }
2075
+ }
2076
+ },
2077
+ "required": [
2078
+ "email",
2079
+ "phone",
2080
+ "links"
2081
+ ]
2082
+ },
2083
+ "legal": {
2084
+ "type": "object",
2085
+ "properties": {
2086
+ "termsUrl": {
2087
+ "type": [
2088
+ "string",
2089
+ "null"
2090
+ ],
2091
+ "format": "uri"
2092
+ },
2093
+ "privacyUrl": {
2094
+ "type": [
2095
+ "string",
2096
+ "null"
2097
+ ],
2098
+ "format": "uri"
2099
+ },
2100
+ "cancellationUrl": {
2101
+ "type": [
2102
+ "string",
2103
+ "null"
2104
+ ],
2105
+ "format": "uri"
2106
+ },
2107
+ "defaultContractTemplateId": {
2108
+ "type": [
2109
+ "string",
2110
+ "null"
2111
+ ],
2112
+ "minLength": 1
2113
+ }
2114
+ },
2115
+ "required": [
2116
+ "termsUrl",
2117
+ "privacyUrl",
2118
+ "cancellationUrl",
2119
+ "defaultContractTemplateId"
2120
+ ]
2121
+ },
2122
+ "localization": {
2123
+ "type": "object",
2124
+ "properties": {
2125
+ "defaultLocale": {
2126
+ "type": [
2127
+ "string",
2128
+ "null"
2129
+ ],
2130
+ "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
2131
+ },
2132
+ "currencyDisplay": {
2133
+ "type": "string",
2134
+ "enum": [
2135
+ "code",
2136
+ "symbol",
2137
+ "name"
2138
+ ]
2139
+ }
2140
+ },
2141
+ "required": [
2142
+ "defaultLocale",
2143
+ "currencyDisplay"
2144
+ ]
2145
+ },
2146
+ "forms": {
2147
+ "type": "object",
2148
+ "properties": {
2149
+ "billing": {
2150
+ "type": "object",
2151
+ "properties": {
2152
+ "fields": {
2153
+ "type": "array",
2154
+ "items": {
2155
+ "type": "object",
2156
+ "properties": {
2157
+ "key": {
2158
+ "type": "string",
2159
+ "minLength": 1
2160
+ },
2161
+ "label": {
2162
+ "type": "string",
2163
+ "minLength": 1
2164
+ },
2165
+ "type": {
2166
+ "type": "string",
2167
+ "enum": [
2168
+ "text",
2169
+ "email",
2170
+ "tel",
2171
+ "textarea",
2172
+ "select",
2173
+ "checkbox",
2174
+ "date",
2175
+ "country"
2176
+ ]
2177
+ },
2178
+ "required": {
2179
+ "type": "boolean"
2180
+ },
2181
+ "placeholder": {
2182
+ "type": [
2183
+ "string",
2184
+ "null"
2185
+ ],
2186
+ "minLength": 1
2187
+ },
2188
+ "description": {
2189
+ "type": [
2190
+ "string",
2191
+ "null"
2192
+ ],
2193
+ "minLength": 1
2194
+ },
2195
+ "autocomplete": {
2196
+ "type": [
2197
+ "string",
2198
+ "null"
2199
+ ],
2200
+ "minLength": 1
2201
+ },
2202
+ "options": {
2203
+ "type": "array",
2204
+ "items": {
2205
+ "type": "object",
2206
+ "properties": {
2207
+ "value": {
2208
+ "type": "string",
2209
+ "minLength": 1
2210
+ },
2211
+ "label": {
2212
+ "type": "string",
2213
+ "minLength": 1
2214
+ }
2215
+ },
2216
+ "required": [
2217
+ "value",
2218
+ "label"
2219
+ ]
2220
+ }
2221
+ }
2222
+ },
2223
+ "required": [
2224
+ "key",
2225
+ "label",
2226
+ "type",
2227
+ "required",
2228
+ "placeholder",
2229
+ "description",
2230
+ "autocomplete",
2231
+ "options"
2232
+ ]
2233
+ }
2234
+ }
2235
+ },
2236
+ "required": [
2237
+ "fields"
2238
+ ]
2239
+ },
2240
+ "travelers": {
2241
+ "type": "object",
2242
+ "properties": {
2243
+ "fields": {
2244
+ "type": "array",
2245
+ "items": {
2246
+ "type": "object",
2247
+ "properties": {
2248
+ "key": {
2249
+ "type": "string",
2250
+ "minLength": 1
2251
+ },
2252
+ "label": {
2253
+ "type": "string",
2254
+ "minLength": 1
2255
+ },
2256
+ "type": {
2257
+ "type": "string",
2258
+ "enum": [
2259
+ "text",
2260
+ "email",
2261
+ "tel",
2262
+ "textarea",
2263
+ "select",
2264
+ "checkbox",
2265
+ "date",
2266
+ "country"
2267
+ ]
2268
+ },
2269
+ "required": {
2270
+ "type": "boolean"
2271
+ },
2272
+ "placeholder": {
2273
+ "type": [
2274
+ "string",
2275
+ "null"
2276
+ ],
2277
+ "minLength": 1
2278
+ },
2279
+ "description": {
2280
+ "type": [
2281
+ "string",
2282
+ "null"
2283
+ ],
2284
+ "minLength": 1
2285
+ },
2286
+ "autocomplete": {
2287
+ "type": [
2288
+ "string",
2289
+ "null"
2290
+ ],
2291
+ "minLength": 1
2292
+ },
2293
+ "options": {
2294
+ "type": "array",
2295
+ "items": {
2296
+ "type": "object",
2297
+ "properties": {
2298
+ "value": {
2299
+ "type": "string",
2300
+ "minLength": 1
2301
+ },
2302
+ "label": {
2303
+ "type": "string",
2304
+ "minLength": 1
2305
+ }
2306
+ },
2307
+ "required": [
2308
+ "value",
2309
+ "label"
2310
+ ]
2311
+ }
2312
+ }
2313
+ },
2314
+ "required": [
2315
+ "key",
2316
+ "label",
2317
+ "type",
2318
+ "required",
2319
+ "placeholder",
2320
+ "description",
2321
+ "autocomplete",
2322
+ "options"
2323
+ ]
2324
+ }
2325
+ }
2326
+ },
2327
+ "required": [
2328
+ "fields"
2329
+ ]
2330
+ }
2331
+ },
2332
+ "required": [
2333
+ "billing",
2334
+ "travelers"
2335
+ ]
2336
+ },
2337
+ "payment": {
2338
+ "type": "object",
2339
+ "properties": {
2340
+ "defaultMethod": {
2341
+ "type": [
2342
+ "string",
2343
+ "null"
2344
+ ],
2345
+ "enum": [
2346
+ "card",
2347
+ "bank_transfer",
2348
+ "cash",
2349
+ "voucher",
2350
+ "invoice",
2351
+ null
2352
+ ]
2353
+ },
2354
+ "methods": {
2355
+ "type": "array",
2356
+ "items": {
2357
+ "type": "object",
2358
+ "properties": {
2359
+ "code": {
2360
+ "type": "string",
2361
+ "enum": [
2362
+ "card",
2363
+ "bank_transfer",
2364
+ "cash",
2365
+ "voucher",
2366
+ "invoice"
2367
+ ]
2368
+ },
2369
+ "label": {
2370
+ "type": "string",
2371
+ "minLength": 1
2372
+ },
2373
+ "description": {
2374
+ "type": [
2375
+ "string",
2376
+ "null"
2377
+ ],
2378
+ "minLength": 1
2379
+ },
2380
+ "enabled": {
2381
+ "type": "boolean"
2382
+ }
2383
+ },
2384
+ "required": [
2385
+ "code",
2386
+ "label",
2387
+ "description",
2388
+ "enabled"
2389
+ ]
2390
+ }
2391
+ },
2392
+ "structure": {
2393
+ "type": "string",
2394
+ "enum": [
2395
+ "full",
2396
+ "split"
2397
+ ]
2398
+ },
2399
+ "schedule": {
2400
+ "type": "array",
2401
+ "items": {
2402
+ "type": "object",
2403
+ "properties": {
2404
+ "percent": {
2405
+ "type": "number",
2406
+ "minimum": 0,
2407
+ "maximum": 100
2408
+ },
2409
+ "dueInDays": {
2410
+ "type": "integer",
2411
+ "minimum": 0
2412
+ },
2413
+ "dueCondition": {
2414
+ "type": "string",
2415
+ "enum": [
2416
+ "after_booking",
2417
+ "before_departure"
2418
+ ]
2419
+ }
2420
+ },
2421
+ "required": [
2422
+ "percent",
2423
+ "dueInDays",
2424
+ "dueCondition"
2425
+ ]
2426
+ }
2427
+ },
2428
+ "defaultSchedule": {
2429
+ "type": [
2430
+ "object",
2431
+ "null"
2432
+ ],
2433
+ "properties": {
2434
+ "depositPercent": {
2435
+ "type": [
2436
+ "number",
2437
+ "null"
2438
+ ],
2439
+ "minimum": 0,
2440
+ "maximum": 100
2441
+ },
2442
+ "balanceDueDaysBeforeDeparture": {
2443
+ "type": [
2444
+ "integer",
2445
+ "null"
2446
+ ],
2447
+ "minimum": 0
2448
+ }
2449
+ },
2450
+ "required": [
2451
+ "depositPercent",
2452
+ "balanceDueDaysBeforeDeparture"
2453
+ ]
2454
+ },
2455
+ "bankTransfer": {
2456
+ "type": [
2457
+ "object",
2458
+ "null"
2459
+ ],
2460
+ "properties": {
2461
+ "dueDays": {
2462
+ "type": [
2463
+ "integer",
2464
+ "null"
2465
+ ],
2466
+ "minimum": 0
2467
+ },
2468
+ "account": {
2469
+ "type": [
2470
+ "object",
2471
+ "null"
2472
+ ],
2473
+ "properties": {
2474
+ "provider": {
2475
+ "type": [
2476
+ "string",
2477
+ "null"
2478
+ ],
2479
+ "minLength": 1
2480
+ },
2481
+ "currency": {
2482
+ "type": [
2483
+ "string",
2484
+ "null"
2485
+ ],
2486
+ "minLength": 1
2487
+ },
2488
+ "iban": {
2489
+ "type": "string",
2490
+ "minLength": 1
2491
+ },
2492
+ "beneficiary": {
2493
+ "type": "string",
2494
+ "minLength": 1
2495
+ },
2496
+ "bank": {
2497
+ "type": "string",
2498
+ "minLength": 1
2499
+ }
2500
+ },
2501
+ "required": [
2502
+ "provider",
2503
+ "currency",
2504
+ "iban",
2505
+ "beneficiary",
2506
+ "bank"
2507
+ ]
2508
+ },
2509
+ "accountHolder": {
2510
+ "type": [
2511
+ "string",
2512
+ "null"
2513
+ ],
2514
+ "minLength": 1
2515
+ },
2516
+ "bankName": {
2517
+ "type": [
2518
+ "string",
2519
+ "null"
2520
+ ],
2521
+ "minLength": 1
2522
+ },
2523
+ "iban": {
2524
+ "type": [
2525
+ "string",
2526
+ "null"
2527
+ ],
2528
+ "minLength": 1
2529
+ },
2530
+ "bic": {
2531
+ "type": [
2532
+ "string",
2533
+ "null"
2534
+ ],
2535
+ "minLength": 1
2536
+ },
2537
+ "paymentReference": {
2538
+ "type": [
2539
+ "string",
2540
+ "null"
2541
+ ],
2542
+ "minLength": 1
2543
+ },
2544
+ "instructions": {
2545
+ "type": [
2546
+ "string",
2547
+ "null"
2548
+ ],
2549
+ "minLength": 1
2550
+ }
2551
+ },
2552
+ "required": [
2553
+ "dueDays",
2554
+ "account",
2555
+ "accountHolder",
2556
+ "bankName",
2557
+ "iban",
2558
+ "bic",
2559
+ "paymentReference",
2560
+ "instructions"
2561
+ ]
2562
+ }
2563
+ },
2564
+ "required": [
2565
+ "defaultMethod",
2566
+ "methods",
2567
+ "structure",
2568
+ "schedule",
2569
+ "defaultSchedule",
2570
+ "bankTransfer"
2571
+ ]
2572
+ }
2573
+ },
2574
+ "required": [
2575
+ "branding",
2576
+ "support",
2577
+ "legal",
2578
+ "localization",
2579
+ "forms",
2580
+ "payment"
2581
+ ]
2582
+ }
2583
+ },
2584
+ "required": [
2585
+ "data"
2586
+ ]
2587
+ }
2588
+ }
2589
+ }
2590
+ }
2591
+ },
2592
+ "operationId": "getPublicSettings",
2593
+ "summary": "GET /v1/public/settings",
2594
+ "tags": [
2595
+ "storefront"
2596
+ ],
2597
+ "x-voyant-module": "storefront",
2598
+ "x-voyant-surface": "storefront"
2599
+ }
2600
+ },
2601
+ "/v1/public/departures/{departureId}": {
2602
+ "get": {
2603
+ "parameters": [
2604
+ {
2605
+ "schema": {
2606
+ "type": "string"
2607
+ },
2608
+ "required": true,
2609
+ "name": "departureId",
2610
+ "in": "path"
2611
+ }
2612
+ ],
2613
+ "responses": {
2614
+ "200": {
2615
+ "description": "A storefront departure (availability slot) by id",
2616
+ "content": {
2617
+ "application/json": {
2618
+ "schema": {
2619
+ "type": "object",
2620
+ "properties": {
2621
+ "data": {
2622
+ "type": "object",
2623
+ "properties": {
2624
+ "id": {
2625
+ "type": "string"
2626
+ },
2627
+ "productId": {
2628
+ "type": "string"
2629
+ },
2630
+ "itineraryId": {
2631
+ "type": "string"
2632
+ },
2633
+ "optionId": {
2634
+ "type": [
2635
+ "string",
2636
+ "null"
2637
+ ]
2638
+ },
2639
+ "dateLocal": {
2640
+ "type": [
2641
+ "string",
2642
+ "null"
2643
+ ]
2644
+ },
2645
+ "startAt": {
2646
+ "type": [
2647
+ "string",
2648
+ "null"
2649
+ ]
2650
+ },
2651
+ "endAt": {
2652
+ "type": [
2653
+ "string",
2654
+ "null"
2655
+ ]
2656
+ },
2657
+ "timezone": {
2658
+ "type": "string"
2659
+ },
2660
+ "startTime": {
2661
+ "type": [
2662
+ "object",
2663
+ "null"
2664
+ ],
2665
+ "properties": {
2666
+ "id": {
2667
+ "type": "string"
2668
+ },
2669
+ "label": {
2670
+ "type": [
2671
+ "string",
2672
+ "null"
2673
+ ]
2674
+ },
2675
+ "startTimeLocal": {
2676
+ "type": "string"
2677
+ },
2678
+ "durationMinutes": {
2679
+ "type": [
2680
+ "integer",
2681
+ "null"
2682
+ ]
2683
+ }
2684
+ },
2685
+ "required": [
2686
+ "id",
2687
+ "label",
2688
+ "startTimeLocal",
2689
+ "durationMinutes"
2690
+ ]
2691
+ },
2692
+ "meetingPoint": {
2693
+ "type": [
2694
+ "string",
2695
+ "null"
2696
+ ]
2697
+ },
2698
+ "capacity": {
2699
+ "type": [
2700
+ "integer",
2701
+ "null"
2702
+ ]
2703
+ },
2704
+ "remaining": {
2705
+ "type": [
2706
+ "integer",
2707
+ "null"
2708
+ ]
2709
+ },
2710
+ "departureStatus": {
2711
+ "type": "string",
2712
+ "enum": [
2713
+ "open",
2714
+ "closed",
2715
+ "sold_out",
2716
+ "cancelled",
2717
+ "on_request"
2718
+ ]
2719
+ },
2720
+ "nights": {
2721
+ "type": [
2722
+ "integer",
2723
+ "null"
2724
+ ]
2725
+ },
2726
+ "days": {
2727
+ "type": [
2728
+ "integer",
2729
+ "null"
2730
+ ]
2731
+ },
2732
+ "ratePlans": {
2733
+ "type": "array",
2734
+ "items": {
2735
+ "type": "object",
2736
+ "properties": {
2737
+ "id": {
2738
+ "type": "string"
2739
+ },
2740
+ "active": {
2741
+ "type": "boolean"
2742
+ },
2743
+ "name": {
2744
+ "type": "string"
2745
+ },
2746
+ "pricingModel": {
2747
+ "type": "string"
2748
+ },
2749
+ "basePrices": {
2750
+ "type": "array",
2751
+ "items": {
2752
+ "type": "object",
2753
+ "properties": {
2754
+ "amount": {
2755
+ "type": "number"
2756
+ },
2757
+ "currencyCode": {
2758
+ "type": "string"
2759
+ }
2760
+ },
2761
+ "required": [
2762
+ "amount",
2763
+ "currencyCode"
2764
+ ]
2765
+ }
2766
+ },
2767
+ "roomPrices": {
2768
+ "type": "array",
2769
+ "items": {
2770
+ "type": "object",
2771
+ "properties": {
2772
+ "amount": {
2773
+ "type": "number"
2774
+ },
2775
+ "currencyCode": {
2776
+ "type": "string"
2777
+ },
2778
+ "roomType": {
2779
+ "type": "object",
2780
+ "properties": {
2781
+ "id": {
2782
+ "type": "string"
2783
+ },
2784
+ "name": {
2785
+ "type": "string"
2786
+ },
2787
+ "occupancy": {
2788
+ "type": "object",
2789
+ "properties": {
2790
+ "adultsMin": {
2791
+ "type": "integer",
2792
+ "minimum": 0
2793
+ },
2794
+ "adultsMax": {
2795
+ "type": "integer",
2796
+ "minimum": 0
2797
+ },
2798
+ "childrenMax": {
2799
+ "type": "integer",
2800
+ "minimum": 0
2801
+ }
2802
+ },
2803
+ "required": [
2804
+ "adultsMin",
2805
+ "adultsMax",
2806
+ "childrenMax"
2807
+ ]
2808
+ }
2809
+ },
2810
+ "required": [
2811
+ "id",
2812
+ "name",
2813
+ "occupancy"
2814
+ ]
2815
+ }
2816
+ },
2817
+ "required": [
2818
+ "amount",
2819
+ "currencyCode",
2820
+ "roomType"
2821
+ ]
2822
+ }
2823
+ }
2824
+ },
2825
+ "required": [
2826
+ "id",
2827
+ "active",
2828
+ "name",
2829
+ "pricingModel",
2830
+ "basePrices",
2831
+ "roomPrices"
2832
+ ]
2833
+ }
2834
+ },
2835
+ "resourceManifest": {
2836
+ "type": [
2837
+ "object",
2838
+ "null"
2839
+ ],
2840
+ "properties": {
2841
+ "kinds": {
2842
+ "type": "array",
2843
+ "items": {
2844
+ "type": "object",
2845
+ "properties": {
2846
+ "kind": {
2847
+ "type": "string"
2848
+ },
2849
+ "capacity": {
2850
+ "type": "number"
2851
+ },
2852
+ "assigned": {
2853
+ "type": "number"
2854
+ },
2855
+ "available": {
2856
+ "type": "number"
2857
+ }
2858
+ },
2859
+ "required": [
2860
+ "kind",
2861
+ "capacity",
2862
+ "assigned",
2863
+ "available"
2864
+ ]
2865
+ }
2866
+ },
2867
+ "resources": {
2868
+ "type": "array",
2869
+ "items": {
2870
+ "type": "object",
2871
+ "properties": {
2872
+ "id": {
2873
+ "type": "string"
2874
+ },
2875
+ "kind": {
2876
+ "type": "string"
2877
+ },
2878
+ "label": {
2879
+ "type": [
2880
+ "string",
2881
+ "null"
2882
+ ]
2883
+ },
2884
+ "refType": {
2885
+ "type": [
2886
+ "string",
2887
+ "null"
2888
+ ]
2889
+ },
2890
+ "refId": {
2891
+ "type": [
2892
+ "string",
2893
+ "null"
2894
+ ]
2895
+ },
2896
+ "capacity": {
2897
+ "type": "number"
2898
+ },
2899
+ "assigned": {
2900
+ "type": "number"
2901
+ },
2902
+ "available": {
2903
+ "type": "number"
2904
+ },
2905
+ "parentId": {
2906
+ "type": [
2907
+ "string",
2908
+ "null"
2909
+ ]
2910
+ },
2911
+ "flags": {
2912
+ "type": "object",
2913
+ "additionalProperties": {}
2914
+ }
2915
+ },
2916
+ "required": [
2917
+ "id",
2918
+ "kind",
2919
+ "label",
2920
+ "refType",
2921
+ "refId",
2922
+ "capacity",
2923
+ "assigned",
2924
+ "available",
2925
+ "parentId",
2926
+ "flags"
2927
+ ]
2928
+ }
2929
+ }
2930
+ },
2931
+ "required": [
2932
+ "kinds",
2933
+ "resources"
2934
+ ]
2935
+ }
2936
+ },
2937
+ "required": [
2938
+ "id",
2939
+ "productId",
2940
+ "itineraryId",
2941
+ "optionId",
2942
+ "dateLocal",
2943
+ "startAt",
2944
+ "endAt",
2945
+ "timezone",
2946
+ "startTime",
2947
+ "meetingPoint",
2948
+ "capacity",
2949
+ "remaining",
2950
+ "departureStatus",
2951
+ "nights",
2952
+ "days",
2953
+ "ratePlans",
2954
+ "resourceManifest"
2955
+ ]
2956
+ }
2957
+ },
2958
+ "required": [
2959
+ "data"
2960
+ ]
2961
+ }
2962
+ }
2963
+ }
2964
+ },
2965
+ "404": {
2966
+ "description": "Storefront departure not found",
2967
+ "content": {
2968
+ "application/json": {
2969
+ "schema": {
2970
+ "type": "object",
2971
+ "properties": {
2972
+ "error": {
2973
+ "type": "string"
2974
+ }
2975
+ },
2976
+ "required": [
2977
+ "error"
2978
+ ]
2979
+ }
2980
+ }
2981
+ }
2982
+ }
2983
+ },
2984
+ "operationId": "getPublicDeparturesByDepartureId",
2985
+ "summary": "GET /v1/public/departures/{departureId}",
2986
+ "tags": [
2987
+ "storefront"
2988
+ ],
2989
+ "x-voyant-module": "storefront",
2990
+ "x-voyant-surface": "storefront"
2991
+ }
2992
+ },
2993
+ "/v1/public/products/{productId}/departures": {
2994
+ "get": {
2995
+ "parameters": [
2996
+ {
2997
+ "schema": {
2998
+ "type": "string"
2999
+ },
3000
+ "required": true,
3001
+ "name": "productId",
3002
+ "in": "path"
3003
+ },
3004
+ {
3005
+ "schema": {
3006
+ "type": "string"
3007
+ },
3008
+ "required": false,
3009
+ "name": "optionId",
3010
+ "in": "query"
3011
+ },
3012
+ {
3013
+ "schema": {
3014
+ "type": "string",
3015
+ "enum": [
3016
+ "open",
3017
+ "closed",
3018
+ "sold_out",
3019
+ "cancelled"
3020
+ ]
3021
+ },
3022
+ "required": false,
3023
+ "name": "status",
3024
+ "in": "query"
3025
+ },
3026
+ {
3027
+ "schema": {
3028
+ "type": "string",
3029
+ "format": "date"
3030
+ },
3031
+ "required": false,
3032
+ "name": "dateFrom",
3033
+ "in": "query"
3034
+ },
3035
+ {
3036
+ "schema": {
3037
+ "type": "string",
3038
+ "format": "date"
3039
+ },
3040
+ "required": false,
3041
+ "name": "dateTo",
3042
+ "in": "query"
3043
+ },
3044
+ {
3045
+ "schema": {
3046
+ "type": "integer",
3047
+ "example": 100
3048
+ },
3049
+ "required": false,
3050
+ "name": "limit",
3051
+ "in": "query"
3052
+ },
3053
+ {
3054
+ "schema": {
3055
+ "type": "integer",
3056
+ "example": 0
3057
+ },
3058
+ "required": false,
3059
+ "name": "offset",
3060
+ "in": "query"
3061
+ }
3062
+ ],
3063
+ "responses": {
3064
+ "200": {
3065
+ "description": "Departures (availability slots) for a product",
3066
+ "content": {
3067
+ "application/json": {
3068
+ "schema": {
3069
+ "type": "object",
3070
+ "properties": {
3071
+ "data": {
3072
+ "type": "array",
3073
+ "items": {
3074
+ "type": "object",
3075
+ "properties": {
3076
+ "id": {
3077
+ "type": "string"
3078
+ },
3079
+ "productId": {
3080
+ "type": "string"
3081
+ },
3082
+ "itineraryId": {
3083
+ "type": "string"
3084
+ },
3085
+ "optionId": {
3086
+ "type": [
3087
+ "string",
3088
+ "null"
3089
+ ]
3090
+ },
3091
+ "dateLocal": {
3092
+ "type": [
3093
+ "string",
3094
+ "null"
3095
+ ]
3096
+ },
3097
+ "startAt": {
3098
+ "type": [
3099
+ "string",
3100
+ "null"
3101
+ ]
3102
+ },
3103
+ "endAt": {
3104
+ "type": [
3105
+ "string",
3106
+ "null"
3107
+ ]
3108
+ },
3109
+ "timezone": {
3110
+ "type": "string"
3111
+ },
3112
+ "startTime": {
3113
+ "type": [
3114
+ "object",
3115
+ "null"
3116
+ ],
3117
+ "properties": {
3118
+ "id": {
3119
+ "type": "string"
3120
+ },
3121
+ "label": {
3122
+ "type": [
3123
+ "string",
3124
+ "null"
3125
+ ]
3126
+ },
3127
+ "startTimeLocal": {
3128
+ "type": "string"
3129
+ },
3130
+ "durationMinutes": {
3131
+ "type": [
3132
+ "integer",
3133
+ "null"
3134
+ ]
3135
+ }
3136
+ },
3137
+ "required": [
3138
+ "id",
3139
+ "label",
3140
+ "startTimeLocal",
3141
+ "durationMinutes"
3142
+ ]
3143
+ },
3144
+ "meetingPoint": {
3145
+ "type": [
3146
+ "string",
3147
+ "null"
3148
+ ]
3149
+ },
3150
+ "capacity": {
3151
+ "type": [
3152
+ "integer",
3153
+ "null"
3154
+ ]
3155
+ },
3156
+ "remaining": {
3157
+ "type": [
3158
+ "integer",
3159
+ "null"
3160
+ ]
3161
+ },
3162
+ "departureStatus": {
3163
+ "type": "string",
3164
+ "enum": [
3165
+ "open",
3166
+ "closed",
3167
+ "sold_out",
3168
+ "cancelled",
3169
+ "on_request"
3170
+ ]
3171
+ },
3172
+ "nights": {
3173
+ "type": [
3174
+ "integer",
3175
+ "null"
3176
+ ]
3177
+ },
3178
+ "days": {
3179
+ "type": [
3180
+ "integer",
3181
+ "null"
3182
+ ]
3183
+ },
3184
+ "ratePlans": {
3185
+ "type": "array",
3186
+ "items": {
3187
+ "type": "object",
3188
+ "properties": {
3189
+ "id": {
3190
+ "type": "string"
3191
+ },
3192
+ "active": {
3193
+ "type": "boolean"
3194
+ },
3195
+ "name": {
3196
+ "type": "string"
3197
+ },
3198
+ "pricingModel": {
3199
+ "type": "string"
3200
+ },
3201
+ "basePrices": {
3202
+ "type": "array",
3203
+ "items": {
3204
+ "type": "object",
3205
+ "properties": {
3206
+ "amount": {
3207
+ "type": "number"
3208
+ },
3209
+ "currencyCode": {
3210
+ "type": "string"
3211
+ }
3212
+ },
3213
+ "required": [
3214
+ "amount",
3215
+ "currencyCode"
3216
+ ]
3217
+ }
3218
+ },
3219
+ "roomPrices": {
3220
+ "type": "array",
3221
+ "items": {
3222
+ "type": "object",
3223
+ "properties": {
3224
+ "amount": {
3225
+ "type": "number"
3226
+ },
3227
+ "currencyCode": {
3228
+ "type": "string"
3229
+ },
3230
+ "roomType": {
3231
+ "type": "object",
3232
+ "properties": {
3233
+ "id": {
3234
+ "type": "string"
3235
+ },
3236
+ "name": {
3237
+ "type": "string"
3238
+ },
3239
+ "occupancy": {
3240
+ "type": "object",
3241
+ "properties": {
3242
+ "adultsMin": {
3243
+ "type": "integer",
3244
+ "minimum": 0
3245
+ },
3246
+ "adultsMax": {
3247
+ "type": "integer",
3248
+ "minimum": 0
3249
+ },
3250
+ "childrenMax": {
3251
+ "type": "integer",
3252
+ "minimum": 0
3253
+ }
3254
+ },
3255
+ "required": [
3256
+ "adultsMin",
3257
+ "adultsMax",
3258
+ "childrenMax"
3259
+ ]
3260
+ }
3261
+ },
3262
+ "required": [
3263
+ "id",
3264
+ "name",
3265
+ "occupancy"
3266
+ ]
3267
+ }
3268
+ },
3269
+ "required": [
3270
+ "amount",
3271
+ "currencyCode",
3272
+ "roomType"
3273
+ ]
3274
+ }
3275
+ }
3276
+ },
3277
+ "required": [
3278
+ "id",
3279
+ "active",
3280
+ "name",
3281
+ "pricingModel",
3282
+ "basePrices",
3283
+ "roomPrices"
3284
+ ]
3285
+ }
3286
+ },
3287
+ "resourceManifest": {
3288
+ "type": [
3289
+ "object",
3290
+ "null"
3291
+ ],
3292
+ "properties": {
3293
+ "kinds": {
3294
+ "type": "array",
3295
+ "items": {
3296
+ "type": "object",
3297
+ "properties": {
3298
+ "kind": {
3299
+ "type": "string"
3300
+ },
3301
+ "capacity": {
3302
+ "type": "number"
3303
+ },
3304
+ "assigned": {
3305
+ "type": "number"
3306
+ },
3307
+ "available": {
3308
+ "type": "number"
3309
+ }
3310
+ },
3311
+ "required": [
3312
+ "kind",
3313
+ "capacity",
3314
+ "assigned",
3315
+ "available"
3316
+ ]
3317
+ }
3318
+ },
3319
+ "resources": {
3320
+ "type": "array",
3321
+ "items": {
3322
+ "type": "object",
3323
+ "properties": {
3324
+ "id": {
3325
+ "type": "string"
3326
+ },
3327
+ "kind": {
3328
+ "type": "string"
3329
+ },
3330
+ "label": {
3331
+ "type": [
3332
+ "string",
3333
+ "null"
3334
+ ]
3335
+ },
3336
+ "refType": {
3337
+ "type": [
3338
+ "string",
3339
+ "null"
3340
+ ]
3341
+ },
3342
+ "refId": {
3343
+ "type": [
3344
+ "string",
3345
+ "null"
3346
+ ]
3347
+ },
3348
+ "capacity": {
3349
+ "type": "number"
3350
+ },
3351
+ "assigned": {
3352
+ "type": "number"
3353
+ },
3354
+ "available": {
3355
+ "type": "number"
3356
+ },
3357
+ "parentId": {
3358
+ "type": [
3359
+ "string",
3360
+ "null"
3361
+ ]
3362
+ },
3363
+ "flags": {
3364
+ "type": "object",
3365
+ "additionalProperties": {}
3366
+ }
3367
+ },
3368
+ "required": [
3369
+ "id",
3370
+ "kind",
3371
+ "label",
3372
+ "refType",
3373
+ "refId",
3374
+ "capacity",
3375
+ "assigned",
3376
+ "available",
3377
+ "parentId",
3378
+ "flags"
3379
+ ]
3380
+ }
3381
+ }
3382
+ },
3383
+ "required": [
3384
+ "kinds",
3385
+ "resources"
3386
+ ]
3387
+ }
3388
+ },
3389
+ "required": [
3390
+ "id",
3391
+ "productId",
3392
+ "itineraryId",
3393
+ "optionId",
3394
+ "dateLocal",
3395
+ "startAt",
3396
+ "endAt",
3397
+ "timezone",
3398
+ "startTime",
3399
+ "meetingPoint",
3400
+ "capacity",
3401
+ "remaining",
3402
+ "departureStatus",
3403
+ "nights",
3404
+ "days",
3405
+ "ratePlans",
3406
+ "resourceManifest"
3407
+ ]
3408
+ }
3409
+ },
3410
+ "total": {
3411
+ "type": "integer"
3412
+ },
3413
+ "limit": {
3414
+ "type": "integer"
3415
+ },
3416
+ "offset": {
3417
+ "type": "integer"
3418
+ }
3419
+ },
3420
+ "required": [
3421
+ "data",
3422
+ "total",
3423
+ "limit",
3424
+ "offset"
3425
+ ]
3426
+ }
3427
+ }
3428
+ }
3429
+ }
3430
+ },
3431
+ "operationId": "getPublicProductsByProductIdDepartures",
3432
+ "summary": "GET /v1/public/products/{productId}/departures",
3433
+ "tags": [
3434
+ "storefront"
3435
+ ],
3436
+ "x-voyant-module": "storefront",
3437
+ "x-voyant-surface": "storefront"
3438
+ }
3439
+ },
3440
+ "/v1/public/products/{productId}/availability": {
3441
+ "get": {
3442
+ "parameters": [
3443
+ {
3444
+ "schema": {
3445
+ "type": "string"
3446
+ },
3447
+ "required": true,
3448
+ "name": "productId",
3449
+ "in": "path"
3450
+ },
3451
+ {
3452
+ "schema": {
3453
+ "type": "string"
3454
+ },
3455
+ "required": false,
3456
+ "name": "optionId",
3457
+ "in": "query"
3458
+ },
3459
+ {
3460
+ "schema": {
3461
+ "type": "string",
3462
+ "enum": [
3463
+ "open",
3464
+ "closed",
3465
+ "sold_out",
3466
+ "cancelled",
3467
+ "on_request"
3468
+ ]
3469
+ },
3470
+ "required": false,
3471
+ "name": "status",
3472
+ "in": "query"
3473
+ },
3474
+ {
3475
+ "schema": {
3476
+ "type": "string",
3477
+ "format": "date"
3478
+ },
3479
+ "required": false,
3480
+ "name": "dateFrom",
3481
+ "in": "query"
3482
+ },
3483
+ {
3484
+ "schema": {
3485
+ "type": "string",
3486
+ "format": "date"
3487
+ },
3488
+ "required": false,
3489
+ "name": "dateTo",
3490
+ "in": "query"
3491
+ },
3492
+ {
3493
+ "schema": {
3494
+ "type": "string",
3495
+ "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
3496
+ },
3497
+ "required": false,
3498
+ "name": "locale",
3499
+ "in": "query"
3500
+ },
3501
+ {
3502
+ "schema": {
3503
+ "type": "integer",
3504
+ "example": 100
3505
+ },
3506
+ "required": false,
3507
+ "name": "limit",
3508
+ "in": "query"
3509
+ },
3510
+ {
3511
+ "schema": {
3512
+ "type": "integer",
3513
+ "example": 0
3514
+ },
3515
+ "required": false,
3516
+ "name": "offset",
3517
+ "in": "query"
3518
+ }
3519
+ ],
3520
+ "responses": {
3521
+ "200": {
3522
+ "description": "Availability summary (counts + per-slot states) for a product",
3523
+ "content": {
3524
+ "application/json": {
3525
+ "schema": {
3526
+ "type": "object",
3527
+ "properties": {
3528
+ "data": {
3529
+ "type": "object",
3530
+ "properties": {
3531
+ "productId": {
3532
+ "type": "string"
3533
+ },
3534
+ "availabilityState": {
3535
+ "type": "string",
3536
+ "enum": [
3537
+ "available",
3538
+ "sold_out",
3539
+ "closed",
3540
+ "cancelled",
3541
+ "on_request",
3542
+ "past_cutoff",
3543
+ "too_early",
3544
+ "unavailable"
3545
+ ]
3546
+ },
3547
+ "counts": {
3548
+ "type": "object",
3549
+ "properties": {
3550
+ "total": {
3551
+ "type": "integer"
3552
+ },
3553
+ "open": {
3554
+ "type": "integer"
3555
+ },
3556
+ "closed": {
3557
+ "type": "integer"
3558
+ },
3559
+ "soldOut": {
3560
+ "type": "integer"
3561
+ },
3562
+ "cancelled": {
3563
+ "type": "integer"
3564
+ },
3565
+ "onRequest": {
3566
+ "type": "integer"
3567
+ },
3568
+ "pastCutoff": {
3569
+ "type": "integer"
3570
+ },
3571
+ "tooEarly": {
3572
+ "type": "integer"
3573
+ },
3574
+ "available": {
3575
+ "type": "integer"
3576
+ }
3577
+ },
3578
+ "required": [
3579
+ "total",
3580
+ "open",
3581
+ "closed",
3582
+ "soldOut",
3583
+ "cancelled",
3584
+ "onRequest",
3585
+ "pastCutoff",
3586
+ "tooEarly",
3587
+ "available"
3588
+ ]
3589
+ },
3590
+ "departures": {
3591
+ "type": "array",
3592
+ "items": {
3593
+ "type": "object",
3594
+ "properties": {
3595
+ "id": {
3596
+ "type": "string"
3597
+ },
3598
+ "productId": {
3599
+ "type": "string"
3600
+ },
3601
+ "optionId": {
3602
+ "type": [
3603
+ "string",
3604
+ "null"
3605
+ ]
3606
+ },
3607
+ "dateLocal": {
3608
+ "type": [
3609
+ "string",
3610
+ "null"
3611
+ ]
3612
+ },
3613
+ "startAt": {
3614
+ "type": [
3615
+ "string",
3616
+ "null"
3617
+ ]
3618
+ },
3619
+ "endAt": {
3620
+ "type": [
3621
+ "string",
3622
+ "null"
3623
+ ]
3624
+ },
3625
+ "timezone": {
3626
+ "type": "string"
3627
+ },
3628
+ "status": {
3629
+ "type": "string",
3630
+ "enum": [
3631
+ "open",
3632
+ "closed",
3633
+ "sold_out",
3634
+ "cancelled",
3635
+ "on_request"
3636
+ ]
3637
+ },
3638
+ "availabilityState": {
3639
+ "type": "string",
3640
+ "enum": [
3641
+ "available",
3642
+ "sold_out",
3643
+ "closed",
3644
+ "cancelled",
3645
+ "on_request",
3646
+ "past_cutoff",
3647
+ "too_early",
3648
+ "unavailable"
3649
+ ]
3650
+ },
3651
+ "capacity": {
3652
+ "type": [
3653
+ "integer",
3654
+ "null"
3655
+ ]
3656
+ },
3657
+ "remaining": {
3658
+ "type": [
3659
+ "integer",
3660
+ "null"
3661
+ ]
3662
+ },
3663
+ "pastCutoff": {
3664
+ "type": "boolean"
3665
+ },
3666
+ "tooEarly": {
3667
+ "type": "boolean"
3668
+ }
3669
+ },
3670
+ "required": [
3671
+ "id",
3672
+ "productId",
3673
+ "optionId",
3674
+ "dateLocal",
3675
+ "startAt",
3676
+ "endAt",
3677
+ "timezone",
3678
+ "status",
3679
+ "availabilityState",
3680
+ "capacity",
3681
+ "remaining",
3682
+ "pastCutoff",
3683
+ "tooEarly"
3684
+ ]
3685
+ }
3686
+ },
3687
+ "total": {
3688
+ "type": "integer"
3689
+ },
3690
+ "limit": {
3691
+ "type": "integer"
3692
+ },
3693
+ "offset": {
3694
+ "type": "integer"
3695
+ }
3696
+ },
3697
+ "required": [
3698
+ "productId",
3699
+ "availabilityState",
3700
+ "counts",
3701
+ "departures",
3702
+ "total",
3703
+ "limit",
3704
+ "offset"
3705
+ ]
3706
+ }
3707
+ },
3708
+ "required": [
3709
+ "data"
3710
+ ]
3711
+ }
3712
+ }
3713
+ }
3714
+ }
3715
+ },
3716
+ "operationId": "getPublicProductsByProductIdAvailability",
3717
+ "summary": "GET /v1/public/products/{productId}/availability",
3718
+ "tags": [
3719
+ "storefront"
3720
+ ],
3721
+ "x-voyant-module": "storefront",
3722
+ "x-voyant-surface": "storefront"
3723
+ }
3724
+ },
3725
+ "/v1/public/products/{productId}/departures/{departureId}/itinerary": {
3726
+ "get": {
3727
+ "parameters": [
3728
+ {
3729
+ "schema": {
3730
+ "type": "string"
3731
+ },
3732
+ "required": true,
3733
+ "name": "productId",
3734
+ "in": "path"
3735
+ },
3736
+ {
3737
+ "schema": {
3738
+ "type": "string"
3739
+ },
3740
+ "required": true,
3741
+ "name": "departureId",
3742
+ "in": "path"
3743
+ }
3744
+ ],
3745
+ "responses": {
3746
+ "200": {
3747
+ "description": "Day-by-day itinerary for a product departure",
3748
+ "content": {
3749
+ "application/json": {
3750
+ "schema": {
3751
+ "type": "object",
3752
+ "properties": {
3753
+ "data": {
3754
+ "type": "object",
3755
+ "properties": {
3756
+ "id": {
3757
+ "type": "string"
3758
+ },
3759
+ "itineraryId": {
3760
+ "type": "string"
3761
+ },
3762
+ "days": {
3763
+ "type": "array",
3764
+ "items": {
3765
+ "type": "object",
3766
+ "properties": {
3767
+ "id": {
3768
+ "type": "string"
3769
+ },
3770
+ "title": {
3771
+ "type": "string"
3772
+ },
3773
+ "description": {
3774
+ "type": [
3775
+ "string",
3776
+ "null"
3777
+ ]
3778
+ },
3779
+ "thumbnail": {
3780
+ "type": [
3781
+ "object",
3782
+ "null"
3783
+ ],
3784
+ "properties": {
3785
+ "url": {
3786
+ "type": "string",
3787
+ "minLength": 1
3788
+ }
3789
+ },
3790
+ "required": [
3791
+ "url"
3792
+ ]
3793
+ },
3794
+ "segments": {
3795
+ "type": "array",
3796
+ "items": {
3797
+ "type": "object",
3798
+ "properties": {
3799
+ "id": {
3800
+ "type": "string"
3801
+ },
3802
+ "title": {
3803
+ "type": "string"
3804
+ },
3805
+ "description": {
3806
+ "type": [
3807
+ "string",
3808
+ "null"
3809
+ ]
3810
+ }
3811
+ },
3812
+ "required": [
3813
+ "id",
3814
+ "title",
3815
+ "description"
3816
+ ]
3817
+ }
3818
+ }
3819
+ },
3820
+ "required": [
3821
+ "id",
3822
+ "title",
3823
+ "description",
3824
+ "thumbnail",
3825
+ "segments"
3826
+ ]
3827
+ }
3828
+ }
3829
+ },
3830
+ "required": [
3831
+ "id",
3832
+ "itineraryId",
3833
+ "days"
3834
+ ]
3835
+ }
3836
+ },
3837
+ "required": [
3838
+ "data"
3839
+ ]
3840
+ }
3841
+ }
3842
+ }
3843
+ },
3844
+ "404": {
3845
+ "description": "Storefront itinerary not found",
3846
+ "content": {
3847
+ "application/json": {
3848
+ "schema": {
3849
+ "type": "object",
3850
+ "properties": {
3851
+ "error": {
3852
+ "type": "string"
3853
+ }
3854
+ },
3855
+ "required": [
3856
+ "error"
3857
+ ]
3858
+ }
3859
+ }
3860
+ }
3861
+ }
3862
+ },
3863
+ "operationId": "getPublicProductsByProductIdDeparturesByDepartureIdItinerary",
3864
+ "summary": "GET /v1/public/products/{productId}/departures/{departureId}/itinerary",
3865
+ "tags": [
3866
+ "storefront"
3867
+ ],
3868
+ "x-voyant-module": "storefront",
3869
+ "x-voyant-surface": "storefront"
3870
+ }
3871
+ },
3872
+ "/v1/public/products/{productId}/extensions": {
3873
+ "get": {
3874
+ "parameters": [
3875
+ {
3876
+ "schema": {
3877
+ "type": "string"
3878
+ },
3879
+ "required": true,
3880
+ "name": "productId",
3881
+ "in": "path"
3882
+ },
3883
+ {
3884
+ "schema": {
3885
+ "type": "string"
3886
+ },
3887
+ "required": false,
3888
+ "name": "optionId",
3889
+ "in": "query"
3890
+ }
3891
+ ],
3892
+ "responses": {
3893
+ "200": {
3894
+ "description": "Bookable extensions (extras/add-ons) for a product",
3895
+ "content": {
3896
+ "application/json": {
3897
+ "schema": {
3898
+ "type": "object",
3899
+ "properties": {
3900
+ "data": {
3901
+ "type": "object",
3902
+ "properties": {
3903
+ "extensions": {
3904
+ "type": "array",
3905
+ "items": {
3906
+ "type": "object",
3907
+ "properties": {
3908
+ "id": {
3909
+ "type": "string"
3910
+ },
3911
+ "name": {
3912
+ "type": "string"
3913
+ },
3914
+ "label": {
3915
+ "type": "string"
3916
+ },
3917
+ "required": {
3918
+ "type": "boolean"
3919
+ },
3920
+ "selectable": {
3921
+ "type": "boolean"
3922
+ },
3923
+ "hasOptions": {
3924
+ "type": "boolean"
3925
+ },
3926
+ "refProductId": {
3927
+ "type": [
3928
+ "string",
3929
+ "null"
3930
+ ]
3931
+ },
3932
+ "thumb": {
3933
+ "type": [
3934
+ "string",
3935
+ "null"
3936
+ ]
3937
+ },
3938
+ "pricePerPerson": {
3939
+ "type": [
3940
+ "number",
3941
+ "null"
3942
+ ]
3943
+ },
3944
+ "currencyCode": {
3945
+ "type": "string"
3946
+ },
3947
+ "pricingMode": {
3948
+ "type": "string",
3949
+ "enum": [
3950
+ "included",
3951
+ "per_person",
3952
+ "per_booking",
3953
+ "on_request",
3954
+ "unavailable"
3955
+ ]
3956
+ },
3957
+ "defaultQuantity": {
3958
+ "type": [
3959
+ "integer",
3960
+ "null"
3961
+ ]
3962
+ },
3963
+ "minQuantity": {
3964
+ "type": [
3965
+ "integer",
3966
+ "null"
3967
+ ]
3968
+ },
3969
+ "maxQuantity": {
3970
+ "type": [
3971
+ "integer",
3972
+ "null"
3973
+ ]
3974
+ }
3975
+ },
3976
+ "required": [
3977
+ "id",
3978
+ "name",
3979
+ "label",
3980
+ "required",
3981
+ "selectable",
3982
+ "hasOptions",
3983
+ "refProductId",
3984
+ "thumb",
3985
+ "pricePerPerson",
3986
+ "currencyCode",
3987
+ "pricingMode",
3988
+ "defaultQuantity",
3989
+ "minQuantity",
3990
+ "maxQuantity"
3991
+ ]
3992
+ }
3993
+ },
3994
+ "items": {
3995
+ "type": "array",
3996
+ "items": {
3997
+ "type": "object",
3998
+ "properties": {
3999
+ "id": {
4000
+ "type": "string"
4001
+ },
4002
+ "name": {
4003
+ "type": "string"
4004
+ },
4005
+ "label": {
4006
+ "type": "string"
4007
+ },
4008
+ "required": {
4009
+ "type": "boolean"
4010
+ },
4011
+ "selectable": {
4012
+ "type": "boolean"
4013
+ },
4014
+ "hasOptions": {
4015
+ "type": "boolean"
4016
+ },
4017
+ "refProductId": {
4018
+ "type": [
4019
+ "string",
4020
+ "null"
4021
+ ]
4022
+ },
4023
+ "thumb": {
4024
+ "type": [
4025
+ "string",
4026
+ "null"
4027
+ ]
4028
+ },
4029
+ "pricePerPerson": {
4030
+ "type": [
4031
+ "number",
4032
+ "null"
4033
+ ]
4034
+ },
4035
+ "currencyCode": {
4036
+ "type": "string"
4037
+ },
4038
+ "pricingMode": {
4039
+ "type": "string",
4040
+ "enum": [
4041
+ "included",
4042
+ "per_person",
4043
+ "per_booking",
4044
+ "on_request",
4045
+ "unavailable"
4046
+ ]
4047
+ },
4048
+ "defaultQuantity": {
4049
+ "type": [
4050
+ "integer",
4051
+ "null"
4052
+ ]
4053
+ },
4054
+ "minQuantity": {
4055
+ "type": [
4056
+ "integer",
4057
+ "null"
4058
+ ]
4059
+ },
4060
+ "maxQuantity": {
4061
+ "type": [
4062
+ "integer",
4063
+ "null"
4064
+ ]
4065
+ }
4066
+ },
4067
+ "required": [
4068
+ "id",
4069
+ "name",
4070
+ "label",
4071
+ "required",
4072
+ "selectable",
4073
+ "hasOptions",
4074
+ "refProductId",
4075
+ "thumb",
4076
+ "pricePerPerson",
4077
+ "currencyCode",
4078
+ "pricingMode",
4079
+ "defaultQuantity",
4080
+ "minQuantity",
4081
+ "maxQuantity"
4082
+ ]
4083
+ }
4084
+ },
4085
+ "details": {
4086
+ "type": "object",
4087
+ "additionalProperties": {
4088
+ "type": "object",
4089
+ "properties": {
4090
+ "description": {
4091
+ "type": [
4092
+ "string",
4093
+ "null"
4094
+ ]
4095
+ },
4096
+ "media": {
4097
+ "type": "array",
4098
+ "items": {
4099
+ "type": "object",
4100
+ "properties": {
4101
+ "url": {
4102
+ "type": "string",
4103
+ "minLength": 1
4104
+ },
4105
+ "alt": {
4106
+ "type": [
4107
+ "string",
4108
+ "null"
4109
+ ],
4110
+ "minLength": 1
4111
+ }
4112
+ },
4113
+ "required": [
4114
+ "url",
4115
+ "alt"
4116
+ ]
4117
+ }
4118
+ }
4119
+ },
4120
+ "required": [
4121
+ "description",
4122
+ "media"
4123
+ ]
4124
+ }
4125
+ },
4126
+ "currencyCode": {
4127
+ "type": "string"
4128
+ }
4129
+ },
4130
+ "required": [
4131
+ "extensions",
4132
+ "items",
4133
+ "details",
4134
+ "currencyCode"
4135
+ ]
4136
+ }
4137
+ },
4138
+ "required": [
4139
+ "data"
4140
+ ]
4141
+ }
4142
+ }
4143
+ }
4144
+ }
4145
+ },
4146
+ "operationId": "getPublicProductsByProductIdExtensions",
4147
+ "summary": "GET /v1/public/products/{productId}/extensions",
4148
+ "tags": [
4149
+ "storefront"
4150
+ ],
4151
+ "x-voyant-module": "storefront",
4152
+ "x-voyant-surface": "storefront"
4153
+ }
4154
+ }
4155
+ },
4156
+ "webhooks": {}
4157
+ }