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