@gojinko/api-client 1.3.0 → 2.1.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.
@@ -0,0 +1,2455 @@
1
+ openapi: 3.0.0
2
+ info:
3
+ title: Jinko Public API
4
+ version: 0.1.0
5
+ description: Curated public REST surface for Jinko. Authenticated with jnk_ API
6
+ keys. See https://docs.gojinko.com for guides.
7
+ components:
8
+ securitySchemes:
9
+ ApiKeyAuth:
10
+ type: apiKey
11
+ in: header
12
+ name: X-API-Key
13
+ BearerAuth:
14
+ type: http
15
+ scheme: bearer
16
+ schemas:
17
+ HealthResponse:
18
+ type: object
19
+ properties:
20
+ status:
21
+ type: string
22
+ enum:
23
+ - ok
24
+ service:
25
+ type: string
26
+ enum:
27
+ - jinko-api
28
+ version:
29
+ type: string
30
+ example: 0.1.0
31
+ required:
32
+ - status
33
+ - service
34
+ - version
35
+ Amount:
36
+ type: object
37
+ properties:
38
+ value:
39
+ type: number
40
+ currency:
41
+ type: string
42
+ decimal_places:
43
+ type: integer
44
+ required:
45
+ - value
46
+ - currency
47
+ Itinerary:
48
+ type: object
49
+ properties:
50
+ id:
51
+ type: string
52
+ origin:
53
+ type: object
54
+ properties:
55
+ code:
56
+ type: string
57
+ name:
58
+ type: string
59
+ required:
60
+ - code
61
+ destination:
62
+ type: object
63
+ properties:
64
+ code:
65
+ type: string
66
+ name:
67
+ type: string
68
+ required:
69
+ - code
70
+ total:
71
+ $ref: "#/components/schemas/Amount"
72
+ cabin_class:
73
+ type: string
74
+ deep_link:
75
+ type: string
76
+ required:
77
+ - id
78
+ - origin
79
+ - destination
80
+ DestinationSuggestion:
81
+ type: object
82
+ properties:
83
+ city_name:
84
+ type: string
85
+ iata_code:
86
+ type: string
87
+ image_url:
88
+ type: string
89
+ location:
90
+ type: object
91
+ properties:
92
+ latitude:
93
+ type: number
94
+ longitude:
95
+ type: number
96
+ required:
97
+ - latitude
98
+ - longitude
99
+ lowest_fare:
100
+ $ref: "#/components/schemas/Itinerary"
101
+ flights:
102
+ type: array
103
+ items:
104
+ $ref: "#/components/schemas/Itinerary"
105
+ required:
106
+ - flights
107
+ FindDestinationResponse:
108
+ type: object
109
+ properties:
110
+ destinations:
111
+ type: array
112
+ items:
113
+ $ref: "#/components/schemas/DestinationSuggestion"
114
+ total:
115
+ type: number
116
+ next_page_token:
117
+ type: string
118
+ required:
119
+ - destinations
120
+ ErrorResponse:
121
+ type: object
122
+ properties:
123
+ error:
124
+ type: object
125
+ properties:
126
+ code:
127
+ type: string
128
+ message:
129
+ type: string
130
+ doc_url:
131
+ type: string
132
+ required:
133
+ - code
134
+ - message
135
+ required:
136
+ - error
137
+ DateRange:
138
+ type: object
139
+ properties:
140
+ start:
141
+ type: string
142
+ pattern: ^\d{4}-\d{2}-\d{2}$
143
+ end:
144
+ type: string
145
+ pattern: ^\d{4}-\d{2}-\d{2}$
146
+ required:
147
+ - start
148
+ - end
149
+ example:
150
+ start: 2026-06-01
151
+ end: 2026-06-30
152
+ FlightDiscoveryRequest:
153
+ type: object
154
+ properties:
155
+ origins:
156
+ type: array
157
+ items:
158
+ type: string
159
+ example:
160
+ - JFK
161
+ - EWR
162
+ destinations:
163
+ type: array
164
+ items:
165
+ type: string
166
+ origin_type:
167
+ type: string
168
+ enum: &a1
169
+ - city
170
+ - airport
171
+ default: city
172
+ destination_type:
173
+ type: string
174
+ enum: *a1
175
+ default: city
176
+ departure_dates:
177
+ type: array
178
+ items:
179
+ type: string
180
+ pattern: ^\d{4}-\d{2}-\d{2}$
181
+ departure_date_ranges:
182
+ type: array
183
+ items:
184
+ $ref: "#/components/schemas/DateRange"
185
+ return_dates:
186
+ type: array
187
+ items:
188
+ type: string
189
+ pattern: ^\d{4}-\d{2}-\d{2}$
190
+ return_date_ranges:
191
+ type: array
192
+ items:
193
+ $ref: "#/components/schemas/DateRange"
194
+ stay_days:
195
+ type: integer
196
+ minimum: 0
197
+ exclusiveMinimum: true
198
+ stay_days_range:
199
+ type: object
200
+ properties:
201
+ min:
202
+ type: integer
203
+ max:
204
+ type: integer
205
+ required:
206
+ - min
207
+ - max
208
+ trip_type:
209
+ type: string
210
+ enum: &a2
211
+ - oneway
212
+ - roundtrip
213
+ cabin_class:
214
+ type: string
215
+ enum: &a3
216
+ - economy
217
+ - premium_economy
218
+ - business
219
+ - first
220
+ direct_only:
221
+ type: boolean
222
+ adults:
223
+ type: integer
224
+ minimum: 0
225
+ children:
226
+ type: integer
227
+ minimum: 0
228
+ infants_in_lap:
229
+ type: integer
230
+ minimum: 0
231
+ infants_in_seat:
232
+ type: integer
233
+ minimum: 0
234
+ youth:
235
+ type: integer
236
+ minimum: 0
237
+ student:
238
+ type: integer
239
+ minimum: 0
240
+ ages:
241
+ type: array
242
+ items:
243
+ type: integer
244
+ minimum: 0
245
+ residency_country:
246
+ type: string
247
+ minLength: 2
248
+ maxLength: 2
249
+ max_total:
250
+ type: number
251
+ minimum: 0
252
+ exclusiveMinimum: true
253
+ currency:
254
+ type: string
255
+ example: USD
256
+ locale:
257
+ type: string
258
+ example: en-US
259
+ limit:
260
+ type: integer
261
+ minimum: 1
262
+ maximum: 100
263
+ default: 20
264
+ offset:
265
+ type: integer
266
+ minimum: 0
267
+ default: 0
268
+ sort_by:
269
+ type: string
270
+ enum:
271
+ - lowest
272
+ - recommendation
273
+ default: lowest
274
+ FindDestinationRequest:
275
+ allOf:
276
+ - $ref: "#/components/schemas/FlightDiscoveryRequest"
277
+ - type: object
278
+ properties:
279
+ flights_per_destination:
280
+ type: integer
281
+ minimum: 1
282
+ maximum: 10
283
+ default: 1
284
+ FlightCalendarResponse:
285
+ type: object
286
+ properties:
287
+ itineraries:
288
+ type: array
289
+ items:
290
+ $ref: "#/components/schemas/Itinerary"
291
+ next_page_token:
292
+ type: string
293
+ required:
294
+ - itineraries
295
+ FlightLeg:
296
+ type: object
297
+ properties:
298
+ origin:
299
+ type: string
300
+ destination:
301
+ type: string
302
+ departure_datetime:
303
+ type: string
304
+ arrival_datetime:
305
+ type: string
306
+ duration_minutes:
307
+ type: number
308
+ airline:
309
+ type: string
310
+ airline_name:
311
+ type: string
312
+ stops:
313
+ type: number
314
+ Money:
315
+ type: object
316
+ properties:
317
+ amount:
318
+ type: number
319
+ value:
320
+ type: number
321
+ currency:
322
+ type: string
323
+ decimal_places:
324
+ type: integer
325
+ Fare:
326
+ type: object
327
+ properties:
328
+ trip_item_token:
329
+ type: string
330
+ cabin_class:
331
+ type: string
332
+ brand_name:
333
+ type: string
334
+ total_price:
335
+ $ref: "#/components/schemas/Money"
336
+ price_per_person:
337
+ $ref: "#/components/schemas/Money"
338
+ included_baggage:
339
+ type: string
340
+ carry_on_baggage:
341
+ type: string
342
+ is_changeable:
343
+ type: boolean
344
+ FlightOffer:
345
+ type: object
346
+ properties:
347
+ offer_id:
348
+ type: string
349
+ provider:
350
+ type: string
351
+ provider_name:
352
+ type: string
353
+ origin:
354
+ type: object
355
+ properties:
356
+ code:
357
+ type: string
358
+ name:
359
+ type: string
360
+ destination:
361
+ type: object
362
+ properties:
363
+ code:
364
+ type: string
365
+ name:
366
+ type: string
367
+ is_round_trip:
368
+ type: boolean
369
+ total_duration_minutes:
370
+ type: number
371
+ outbound:
372
+ $ref: "#/components/schemas/FlightLeg"
373
+ inbound:
374
+ $ref: "#/components/schemas/FlightLeg"
375
+ fares:
376
+ type: array
377
+ items:
378
+ $ref: "#/components/schemas/Fare"
379
+ required:
380
+ - offer_id
381
+ - origin
382
+ - destination
383
+ - fares
384
+ FlightSearchResponse:
385
+ type: object
386
+ properties:
387
+ offers:
388
+ type: array
389
+ items:
390
+ $ref: "#/components/schemas/FlightOffer"
391
+ exact_match_found:
392
+ type: boolean
393
+ required:
394
+ - offers
395
+ FlightSearchRequest:
396
+ type: object
397
+ properties:
398
+ origin:
399
+ type: string
400
+ example: JFK
401
+ destination:
402
+ type: string
403
+ example: LAX
404
+ departure_date:
405
+ type: string
406
+ pattern: ^\d{4}-\d{2}-\d{2}$
407
+ return_date:
408
+ type: string
409
+ pattern: ^\d{4}-\d{2}-\d{2}$
410
+ trip_type:
411
+ type: string
412
+ enum: *a2
413
+ cabin_class:
414
+ type: string
415
+ enum: *a3
416
+ direct_only:
417
+ type: boolean
418
+ max_price:
419
+ type: number
420
+ minimum: 0
421
+ exclusiveMinimum: true
422
+ include_carriers:
423
+ type: array
424
+ items:
425
+ type: string
426
+ exclude_carriers:
427
+ type: array
428
+ items:
429
+ type: string
430
+ adults:
431
+ type: integer
432
+ minimum: 1
433
+ default: 1
434
+ children:
435
+ type: integer
436
+ minimum: 0
437
+ infants:
438
+ type: integer
439
+ minimum: 0
440
+ currency:
441
+ type: string
442
+ locale:
443
+ type: string
444
+ offer_token:
445
+ type: string
446
+ required:
447
+ - origin
448
+ - destination
449
+ - departure_date
450
+ MonitoredMoney:
451
+ type: object
452
+ properties:
453
+ amount:
454
+ type: number
455
+ value:
456
+ type: number
457
+ currency:
458
+ type: string
459
+ decimal_places:
460
+ type: integer
461
+ MonitoredCarrier:
462
+ type: object
463
+ properties:
464
+ code:
465
+ type: string
466
+ name:
467
+ type: string
468
+ flight_number:
469
+ type: string
470
+ MonitoredFlight:
471
+ type: object
472
+ properties:
473
+ offer_token:
474
+ type: string
475
+ total_price:
476
+ $ref: "#/components/schemas/MonitoredMoney"
477
+ outbound_carrier:
478
+ $ref: "#/components/schemas/MonitoredCarrier"
479
+ inbound_carrier:
480
+ $ref: "#/components/schemas/MonitoredCarrier"
481
+ outbound_stops:
482
+ type: number
483
+ inbound_stops:
484
+ type: number
485
+ outbound_duration_minutes:
486
+ type: number
487
+ inbound_duration_minutes:
488
+ type: number
489
+ outbound_departure_local:
490
+ type: string
491
+ outbound_arrival_local:
492
+ type: string
493
+ inbound_departure_local:
494
+ type: string
495
+ inbound_arrival_local:
496
+ type: string
497
+ cabin_class:
498
+ type: string
499
+ fare_brand:
500
+ type: string
501
+ PriceMonitoringResponse:
502
+ type: object
503
+ properties:
504
+ status:
505
+ type: string
506
+ monitored_at:
507
+ type: string
508
+ flight:
509
+ $ref: "#/components/schemas/MonitoredFlight"
510
+ request_echo:
511
+ nullable: true
512
+ required:
513
+ - status
514
+ PriceMonitoringRequest:
515
+ type: object
516
+ properties:
517
+ origin:
518
+ type: string
519
+ example: PAR
520
+ destination:
521
+ type: string
522
+ example: NYC
523
+ departure_date:
524
+ type: string
525
+ pattern: ^\d{4}-\d{2}-\d{2}$
526
+ return_date:
527
+ type: string
528
+ pattern: ^\d{4}-\d{2}-\d{2}$
529
+ origin_type:
530
+ type: string
531
+ enum: &a4
532
+ - city
533
+ - airport
534
+ destination_type:
535
+ type: string
536
+ enum: *a4
537
+ cabin_class:
538
+ type: string
539
+ enum: *a3
540
+ direct_only:
541
+ type: boolean
542
+ max_price:
543
+ type: number
544
+ minimum: 0
545
+ exclusiveMinimum: true
546
+ include_carriers:
547
+ type: array
548
+ items:
549
+ type: string
550
+ exclude_carriers:
551
+ type: array
552
+ items:
553
+ type: string
554
+ adults:
555
+ type: integer
556
+ minimum: 1
557
+ default: 1
558
+ children:
559
+ type: integer
560
+ minimum: 0
561
+ infants:
562
+ type: integer
563
+ minimum: 0
564
+ currency:
565
+ type: string
566
+ locale:
567
+ type: string
568
+ required:
569
+ - origin
570
+ - destination
571
+ - departure_date
572
+ TripResponse:
573
+ type: object
574
+ properties:
575
+ trip_id:
576
+ type: string
577
+ status:
578
+ type: string
579
+ actions_performed:
580
+ type: array
581
+ items:
582
+ type: string
583
+ items:
584
+ type: array
585
+ items:
586
+ type: object
587
+ properties:
588
+ item_id:
589
+ type: string
590
+ kind:
591
+ type: string
592
+ price:
593
+ type: object
594
+ properties:
595
+ amount:
596
+ type: number
597
+ value:
598
+ type: number
599
+ currency:
600
+ type: string
601
+ decimal_places:
602
+ type: integer
603
+ pax_count:
604
+ type: number
605
+ available_ancillaries:
606
+ type: array
607
+ items:
608
+ nullable: true
609
+ selected_ancillaries:
610
+ type: array
611
+ items:
612
+ nullable: true
613
+ travelers:
614
+ type: array
615
+ items:
616
+ nullable: true
617
+ contact:
618
+ type: object
619
+ properties:
620
+ email:
621
+ type: string
622
+ phone:
623
+ type: string
624
+ totals:
625
+ type: object
626
+ properties:
627
+ currency:
628
+ type: string
629
+ total:
630
+ type: number
631
+ required:
632
+ - trip_id
633
+ Traveler:
634
+ type: object
635
+ properties:
636
+ first_name:
637
+ type: string
638
+ last_name:
639
+ type: string
640
+ date_of_birth:
641
+ type: string
642
+ pattern: ^\d{4}-\d{2}-\d{2}$
643
+ gender:
644
+ type: string
645
+ enum:
646
+ - MALE
647
+ - FEMALE
648
+ passenger_type:
649
+ type: string
650
+ enum:
651
+ - ADULT
652
+ - CHILD
653
+ - INFANT
654
+ nationality:
655
+ type: string
656
+ passport_number:
657
+ type: string
658
+ passport_expiry:
659
+ type: string
660
+ pattern: ^\d{4}-\d{2}-\d{2}$
661
+ passport_country:
662
+ type: string
663
+ required:
664
+ - first_name
665
+ - last_name
666
+ - date_of_birth
667
+ - gender
668
+ - passenger_type
669
+ TripRequest:
670
+ type: object
671
+ properties:
672
+ trip_id:
673
+ type: string
674
+ add_item:
675
+ type: object
676
+ properties:
677
+ trip_item_token:
678
+ type: string
679
+ required:
680
+ - trip_item_token
681
+ remove_item:
682
+ type: object
683
+ properties:
684
+ item_id:
685
+ type: string
686
+ required:
687
+ - item_id
688
+ upsert_travelers:
689
+ type: object
690
+ properties:
691
+ travelers:
692
+ type: array
693
+ items:
694
+ $ref: "#/components/schemas/Traveler"
695
+ contact:
696
+ type: object
697
+ properties:
698
+ email:
699
+ type: string
700
+ format: email
701
+ phone:
702
+ type: string
703
+ required:
704
+ - email
705
+ required:
706
+ - travelers
707
+ GetTripResponse:
708
+ type: object
709
+ properties:
710
+ trip_id:
711
+ type: string
712
+ status:
713
+ type: string
714
+ travelers:
715
+ type: array
716
+ items:
717
+ nullable: true
718
+ contact:
719
+ type: object
720
+ properties:
721
+ email:
722
+ type: string
723
+ phone:
724
+ type: string
725
+ items:
726
+ type: array
727
+ items:
728
+ nullable: true
729
+ total_amount:
730
+ type: object
731
+ properties:
732
+ amount:
733
+ type: number
734
+ value:
735
+ type: number
736
+ currency:
737
+ type: string
738
+ decimal_places:
739
+ type: integer
740
+ quote:
741
+ type: object
742
+ properties:
743
+ quoted_cart_id:
744
+ type: number
745
+ status:
746
+ type: string
747
+ expires_at:
748
+ type: string
749
+ fulfillment:
750
+ type: object
751
+ properties:
752
+ fulfillment_cart_id:
753
+ type: number
754
+ status:
755
+ type: string
756
+ phase:
757
+ type: string
758
+ bookings:
759
+ type: array
760
+ items:
761
+ nullable: true
762
+ created_at:
763
+ type: string
764
+ updated_at:
765
+ type: string
766
+ required:
767
+ - trip_id
768
+ AncillaryResponse:
769
+ type: object
770
+ properties:
771
+ trip_id:
772
+ type: string
773
+ quoted_item_id:
774
+ type: number
775
+ selected_ancillaries:
776
+ type: array
777
+ items:
778
+ nullable: true
779
+ total_with_ancillaries:
780
+ type: object
781
+ properties:
782
+ amount:
783
+ type: number
784
+ value:
785
+ type: number
786
+ currency:
787
+ type: string
788
+ decimal_places:
789
+ type: integer
790
+ AncillaryRequest:
791
+ type: object
792
+ properties:
793
+ trip_id:
794
+ type: string
795
+ item_id:
796
+ type: string
797
+ selections:
798
+ type: array
799
+ items:
800
+ type: object
801
+ properties:
802
+ offer_id:
803
+ type: string
804
+ category:
805
+ type: string
806
+ pax_ref_id:
807
+ type: string
808
+ segment_ref_ids:
809
+ type: array
810
+ items:
811
+ type: string
812
+ journey_ref_id:
813
+ type: string
814
+ quantity:
815
+ type: number
816
+ provider_metadata:
817
+ type: object
818
+ additionalProperties:
819
+ type: string
820
+ required:
821
+ - offer_id
822
+ required:
823
+ - trip_id
824
+ - item_id
825
+ - selections
826
+ BookResponse:
827
+ type: object
828
+ properties:
829
+ session_id:
830
+ type: string
831
+ checkout_url:
832
+ type: string
833
+ status:
834
+ type: string
835
+ expires_at:
836
+ type: string
837
+ total_amount:
838
+ type: object
839
+ properties:
840
+ amount:
841
+ type: number
842
+ value:
843
+ type: number
844
+ currency:
845
+ type: string
846
+ decimal_places:
847
+ type: integer
848
+ items:
849
+ type: array
850
+ items:
851
+ nullable: true
852
+ BookRequest:
853
+ type: object
854
+ properties:
855
+ trip_id:
856
+ type: string
857
+ required:
858
+ - trip_id
859
+ HotelSearchResponse:
860
+ type: object
861
+ properties:
862
+ hotels:
863
+ type: array
864
+ items:
865
+ type: object
866
+ properties:
867
+ hotel_id:
868
+ type: string
869
+ name:
870
+ type: string
871
+ address:
872
+ type: string
873
+ city:
874
+ type: string
875
+ country_code:
876
+ type: string
877
+ star_rating:
878
+ type: number
879
+ rating:
880
+ type: number
881
+ review_count:
882
+ type: number
883
+ images:
884
+ type: array
885
+ items:
886
+ type: string
887
+ thumbnail_url:
888
+ type: string
889
+ rooms:
890
+ type: array
891
+ items:
892
+ nullable: true
893
+ total:
894
+ type: number
895
+ Occupancy:
896
+ type: object
897
+ properties:
898
+ adults:
899
+ type: integer
900
+ minimum: 1
901
+ children_ages:
902
+ type: array
903
+ items:
904
+ type: integer
905
+ required:
906
+ - adults
907
+ HotelSearchRequest:
908
+ type: object
909
+ properties:
910
+ query:
911
+ type: string
912
+ example: Paris
913
+ city_name:
914
+ type: string
915
+ country_code:
916
+ type: string
917
+ minLength: 2
918
+ maxLength: 2
919
+ latitude:
920
+ type: number
921
+ longitude:
922
+ type: number
923
+ radius_km:
924
+ type: number
925
+ minimum: 0
926
+ exclusiveMinimum: true
927
+ maximum: 50
928
+ place_id:
929
+ type: string
930
+ hotel_ids:
931
+ type: array
932
+ items:
933
+ type: string
934
+ checkin:
935
+ type: string
936
+ pattern: ^\d{4}-\d{2}-\d{2}$
937
+ checkout:
938
+ type: string
939
+ pattern: ^\d{4}-\d{2}-\d{2}$
940
+ occupancies:
941
+ type: array
942
+ items:
943
+ $ref: "#/components/schemas/Occupancy"
944
+ adults:
945
+ type: integer
946
+ minimum: 1
947
+ children:
948
+ type: array
949
+ items:
950
+ type: integer
951
+ rooms:
952
+ type: integer
953
+ minimum: 1
954
+ currency:
955
+ type: string
956
+ guest_nationality:
957
+ type: string
958
+ minLength: 2
959
+ maxLength: 2
960
+ min_rating:
961
+ type: number
962
+ min_star_rating:
963
+ type: integer
964
+ minimum: 1
965
+ maximum: 5
966
+ star_rating:
967
+ type: integer
968
+ minimum: 1
969
+ maximum: 5
970
+ max_star_rating:
971
+ type: integer
972
+ minimum: 1
973
+ maximum: 5
974
+ min_reviews:
975
+ type: integer
976
+ max_results:
977
+ type: integer
978
+ hotel_type_ids:
979
+ type: array
980
+ items:
981
+ type: string
982
+ chain_ids:
983
+ type: array
984
+ items:
985
+ type: string
986
+ facility_ids:
987
+ type: array
988
+ items:
989
+ type: string
990
+ required:
991
+ - checkin
992
+ - checkout
993
+ HotelDetailsResponse:
994
+ type: object
995
+ properties:
996
+ hotel:
997
+ type: object
998
+ properties:
999
+ id:
1000
+ type: string
1001
+ name:
1002
+ type: string
1003
+ description:
1004
+ type: string
1005
+ star_rating:
1006
+ type: number
1007
+ address:
1008
+ type: string
1009
+ city:
1010
+ type: string
1011
+ country_code:
1012
+ type: string
1013
+ coordinates:
1014
+ type: object
1015
+ properties:
1016
+ latitude:
1017
+ type: number
1018
+ longitude:
1019
+ type: number
1020
+ images:
1021
+ type: array
1022
+ items:
1023
+ type: string
1024
+ facilities:
1025
+ type: array
1026
+ items:
1027
+ type: string
1028
+ policies:
1029
+ type: array
1030
+ items:
1031
+ nullable: true
1032
+ checkin_time:
1033
+ type: string
1034
+ checkout_time:
1035
+ type: string
1036
+ rooms:
1037
+ type: array
1038
+ items:
1039
+ nullable: true
1040
+ GetBookingResponse:
1041
+ type: object
1042
+ properties:
1043
+ booking:
1044
+ nullable: true
1045
+ GetBookingRequest:
1046
+ type: object
1047
+ properties:
1048
+ booking_ref:
1049
+ type: string
1050
+ last_name:
1051
+ type: string
1052
+ required:
1053
+ - booking_ref
1054
+ - last_name
1055
+ RefundCheckResponse:
1056
+ type: object
1057
+ properties:
1058
+ is_refundable:
1059
+ type: boolean
1060
+ is_automatable:
1061
+ type: boolean
1062
+ support_level:
1063
+ type: string
1064
+ refund_amount:
1065
+ type: object
1066
+ properties:
1067
+ value:
1068
+ type: number
1069
+ amount:
1070
+ type: number
1071
+ currency:
1072
+ type: string
1073
+ decimal_places:
1074
+ type: integer
1075
+ penalty_amount:
1076
+ type: object
1077
+ properties:
1078
+ value:
1079
+ type: number
1080
+ amount:
1081
+ type: number
1082
+ currency:
1083
+ type: string
1084
+ decimal_places:
1085
+ type: integer
1086
+ total_paid:
1087
+ type: object
1088
+ properties:
1089
+ value:
1090
+ type: number
1091
+ amount:
1092
+ type: number
1093
+ currency:
1094
+ type: string
1095
+ decimal_places:
1096
+ type: integer
1097
+ expires_at:
1098
+ type: string
1099
+ warnings:
1100
+ type: array
1101
+ items:
1102
+ type: string
1103
+ RefundCheckRequest:
1104
+ type: object
1105
+ properties:
1106
+ order_id:
1107
+ type: string
1108
+ booking_ref:
1109
+ type: string
1110
+ last_name:
1111
+ type: string
1112
+ ticket_numbers:
1113
+ type: array
1114
+ items:
1115
+ type: string
1116
+ provider:
1117
+ type: string
1118
+ RefundCommitResponse:
1119
+ type: object
1120
+ properties:
1121
+ refund_status:
1122
+ type: string
1123
+ confirmed_refund_amount:
1124
+ type: object
1125
+ properties:
1126
+ value:
1127
+ type: number
1128
+ amount:
1129
+ type: number
1130
+ currency:
1131
+ type: string
1132
+ decimal_places:
1133
+ type: integer
1134
+ refund_reference:
1135
+ type: string
1136
+ warnings:
1137
+ type: array
1138
+ items:
1139
+ type: string
1140
+ RefundCommitRequest:
1141
+ type: object
1142
+ properties:
1143
+ order_id:
1144
+ type: string
1145
+ booking_ref:
1146
+ type: string
1147
+ last_name:
1148
+ type: string
1149
+ ticket_numbers:
1150
+ type: array
1151
+ items:
1152
+ type: string
1153
+ provider:
1154
+ type: string
1155
+ RefundStatusResponse:
1156
+ type: object
1157
+ properties:
1158
+ refund_status:
1159
+ type: string
1160
+ provider_status:
1161
+ type: string
1162
+ refund_amount:
1163
+ type: object
1164
+ properties:
1165
+ value:
1166
+ type: number
1167
+ amount:
1168
+ type: number
1169
+ currency:
1170
+ type: string
1171
+ decimal_places:
1172
+ type: integer
1173
+ refund_reference:
1174
+ type: string
1175
+ warnings:
1176
+ type: array
1177
+ items:
1178
+ type: string
1179
+ RefundStatusRequest:
1180
+ type: object
1181
+ properties:
1182
+ order_id:
1183
+ type: string
1184
+ booking_ref:
1185
+ type: string
1186
+ last_name:
1187
+ type: string
1188
+ ticket_numbers:
1189
+ type: array
1190
+ items:
1191
+ type: string
1192
+ provider:
1193
+ type: string
1194
+ refund_reference:
1195
+ type: string
1196
+ ExchangeShopResponse:
1197
+ type: object
1198
+ properties:
1199
+ support_level:
1200
+ type: string
1201
+ offers:
1202
+ type: array
1203
+ items:
1204
+ nullable: true
1205
+ warnings:
1206
+ type: array
1207
+ items:
1208
+ type: string
1209
+ ExchangeShopRequest:
1210
+ type: object
1211
+ properties:
1212
+ order_id:
1213
+ type: string
1214
+ booking_ref:
1215
+ type: string
1216
+ last_name:
1217
+ type: string
1218
+ ticket_numbers:
1219
+ type: array
1220
+ items:
1221
+ type: string
1222
+ provider:
1223
+ type: string
1224
+ segments_to_exchange:
1225
+ type: array
1226
+ items:
1227
+ nullable: true
1228
+ preferred_departure_date:
1229
+ type: string
1230
+ ExchangePriceResponse:
1231
+ type: object
1232
+ properties:
1233
+ payment_outcome:
1234
+ type: string
1235
+ fare_difference:
1236
+ type: object
1237
+ properties:
1238
+ value:
1239
+ type: number
1240
+ amount:
1241
+ type: number
1242
+ currency:
1243
+ type: string
1244
+ decimal_places:
1245
+ type: integer
1246
+ penalty_amount:
1247
+ type: object
1248
+ properties:
1249
+ value:
1250
+ type: number
1251
+ amount:
1252
+ type: number
1253
+ currency:
1254
+ type: string
1255
+ decimal_places:
1256
+ type: integer
1257
+ total_due:
1258
+ type: object
1259
+ properties:
1260
+ value:
1261
+ type: number
1262
+ amount:
1263
+ type: number
1264
+ currency:
1265
+ type: string
1266
+ decimal_places:
1267
+ type: integer
1268
+ total_refund:
1269
+ type: object
1270
+ properties:
1271
+ value:
1272
+ type: number
1273
+ amount:
1274
+ type: number
1275
+ currency:
1276
+ type: string
1277
+ decimal_places:
1278
+ type: integer
1279
+ session_reference:
1280
+ type: string
1281
+ expires_at:
1282
+ type: string
1283
+ warnings:
1284
+ type: array
1285
+ items:
1286
+ type: string
1287
+ ExchangePriceRequest:
1288
+ type: object
1289
+ properties:
1290
+ order_id:
1291
+ type: string
1292
+ booking_ref:
1293
+ type: string
1294
+ last_name:
1295
+ type: string
1296
+ ticket_numbers:
1297
+ type: array
1298
+ items:
1299
+ type: string
1300
+ provider:
1301
+ type: string
1302
+ offer_id:
1303
+ type: string
1304
+ required:
1305
+ - offer_id
1306
+ ExchangeCommitResponse:
1307
+ type: object
1308
+ properties:
1309
+ exchange_reference:
1310
+ type: string
1311
+ new_order_id:
1312
+ type: string
1313
+ new_ticket_numbers:
1314
+ type: array
1315
+ items:
1316
+ type: string
1317
+ status:
1318
+ type: string
1319
+ payment_outcome:
1320
+ type: string
1321
+ warnings:
1322
+ type: array
1323
+ items:
1324
+ type: string
1325
+ ExchangeCommitRequest:
1326
+ type: object
1327
+ properties:
1328
+ order_id:
1329
+ type: string
1330
+ booking_ref:
1331
+ type: string
1332
+ last_name:
1333
+ type: string
1334
+ ticket_numbers:
1335
+ type: array
1336
+ items:
1337
+ type: string
1338
+ provider:
1339
+ type: string
1340
+ offer_id:
1341
+ type: string
1342
+ session_reference:
1343
+ type: string
1344
+ required:
1345
+ - offer_id
1346
+ - session_reference
1347
+ ExchangeStatusResponse:
1348
+ type: object
1349
+ properties:
1350
+ status:
1351
+ type: string
1352
+ new_ticket_numbers:
1353
+ type: array
1354
+ items:
1355
+ type: string
1356
+ confirmed_payment_outcome:
1357
+ type: string
1358
+ warnings:
1359
+ type: array
1360
+ items:
1361
+ type: string
1362
+ ExchangeStatusRequest:
1363
+ type: object
1364
+ properties:
1365
+ order_id:
1366
+ type: string
1367
+ booking_ref:
1368
+ type: string
1369
+ last_name:
1370
+ type: string
1371
+ ticket_numbers:
1372
+ type: array
1373
+ items:
1374
+ type: string
1375
+ provider:
1376
+ type: string
1377
+ HotelCancelResponse:
1378
+ type: object
1379
+ properties:
1380
+ provider_booking_id:
1381
+ type: string
1382
+ provider:
1383
+ type: string
1384
+ status:
1385
+ type: string
1386
+ refund_amount:
1387
+ type: object
1388
+ properties:
1389
+ value:
1390
+ type: number
1391
+ amount:
1392
+ type: number
1393
+ currency:
1394
+ type: string
1395
+ decimal_places:
1396
+ type: integer
1397
+ penalty_amount:
1398
+ type: object
1399
+ properties:
1400
+ value:
1401
+ type: number
1402
+ amount:
1403
+ type: number
1404
+ currency:
1405
+ type: string
1406
+ decimal_places:
1407
+ type: integer
1408
+ connector_reference:
1409
+ type: string
1410
+ cancelled_at:
1411
+ type: string
1412
+ idempotent:
1413
+ type: boolean
1414
+ HotelCancelRequest:
1415
+ type: object
1416
+ properties:
1417
+ provider_booking_id:
1418
+ type: string
1419
+ provider:
1420
+ type: string
1421
+ booking_ref:
1422
+ type: string
1423
+ last_name:
1424
+ type: string
1425
+ parameters: {}
1426
+ paths:
1427
+ /health:
1428
+ get:
1429
+ tags:
1430
+ - system
1431
+ summary: Service health
1432
+ responses:
1433
+ "200":
1434
+ description: Service is up
1435
+ content:
1436
+ application/json:
1437
+ schema:
1438
+ $ref: "#/components/schemas/HealthResponse"
1439
+ /v1/find_destination:
1440
+ post:
1441
+ tags:
1442
+ - flights
1443
+ summary: Discover destinations reachable from an origin (cache-backed)
1444
+ security:
1445
+ - ApiKeyAuth: []
1446
+ - BearerAuth: []
1447
+ requestBody:
1448
+ content:
1449
+ application/json:
1450
+ schema:
1451
+ $ref: "#/components/schemas/FindDestinationRequest"
1452
+ responses:
1453
+ "200":
1454
+ description: Matching destinations
1455
+ content:
1456
+ application/json:
1457
+ schema:
1458
+ $ref: "#/components/schemas/FindDestinationResponse"
1459
+ "400":
1460
+ description: Bad request
1461
+ content:
1462
+ application/json:
1463
+ schema:
1464
+ $ref: "#/components/schemas/ErrorResponse"
1465
+ "401":
1466
+ description: Authentication required
1467
+ content:
1468
+ application/json:
1469
+ schema:
1470
+ $ref: "#/components/schemas/ErrorResponse"
1471
+ "422":
1472
+ description: Validation error
1473
+ content:
1474
+ application/json:
1475
+ schema:
1476
+ $ref: "#/components/schemas/ErrorResponse"
1477
+ "429":
1478
+ description: Rate limit or quota exceeded
1479
+ content:
1480
+ application/json:
1481
+ schema:
1482
+ $ref: "#/components/schemas/ErrorResponse"
1483
+ "502":
1484
+ description: Upstream service error
1485
+ content:
1486
+ application/json:
1487
+ schema:
1488
+ $ref: "#/components/schemas/ErrorResponse"
1489
+ /v1/flight_calendar:
1490
+ post:
1491
+ tags:
1492
+ - flights
1493
+ summary: Discover flights for a route + flexible dates (cache-backed)
1494
+ security:
1495
+ - ApiKeyAuth: []
1496
+ - BearerAuth: []
1497
+ requestBody:
1498
+ content:
1499
+ application/json:
1500
+ schema:
1501
+ $ref: "#/components/schemas/FlightDiscoveryRequest"
1502
+ responses:
1503
+ "200":
1504
+ description: Matching itineraries
1505
+ content:
1506
+ application/json:
1507
+ schema:
1508
+ $ref: "#/components/schemas/FlightCalendarResponse"
1509
+ "400":
1510
+ description: Bad request
1511
+ content:
1512
+ application/json:
1513
+ schema:
1514
+ $ref: "#/components/schemas/ErrorResponse"
1515
+ "401":
1516
+ description: Authentication required
1517
+ content:
1518
+ application/json:
1519
+ schema:
1520
+ $ref: "#/components/schemas/ErrorResponse"
1521
+ "422":
1522
+ description: Validation error
1523
+ content:
1524
+ application/json:
1525
+ schema:
1526
+ $ref: "#/components/schemas/ErrorResponse"
1527
+ "429":
1528
+ description: Rate limit or quota exceeded
1529
+ content:
1530
+ application/json:
1531
+ schema:
1532
+ $ref: "#/components/schemas/ErrorResponse"
1533
+ "502":
1534
+ description: Upstream service error
1535
+ content:
1536
+ application/json:
1537
+ schema:
1538
+ $ref: "#/components/schemas/ErrorResponse"
1539
+ /v1/find_dates:
1540
+ post:
1541
+ tags:
1542
+ - flights
1543
+ summary: Best date options for a route (cache-backed)
1544
+ description: Takes the same request as flight_calendar and returns up to ten
1545
+ cheapest itineraries — one per (departure, return) date-pair — spread
1546
+ across the requested departure window, so you see a diverse set of date
1547
+ options rather than ten near-adjacent cheapest days. Cache-backed; never
1548
+ live-prices.
1549
+ security:
1550
+ - ApiKeyAuth: []
1551
+ - BearerAuth: []
1552
+ requestBody:
1553
+ content:
1554
+ application/json:
1555
+ schema:
1556
+ $ref: "#/components/schemas/FlightDiscoveryRequest"
1557
+ responses:
1558
+ "200":
1559
+ description: Best date options (one itinerary per date-pair)
1560
+ content:
1561
+ application/json:
1562
+ schema:
1563
+ $ref: "#/components/schemas/FlightCalendarResponse"
1564
+ "400":
1565
+ description: Bad request
1566
+ content:
1567
+ application/json:
1568
+ schema:
1569
+ $ref: "#/components/schemas/ErrorResponse"
1570
+ "401":
1571
+ description: Authentication required
1572
+ content:
1573
+ application/json:
1574
+ schema:
1575
+ $ref: "#/components/schemas/ErrorResponse"
1576
+ "422":
1577
+ description: Validation error
1578
+ content:
1579
+ application/json:
1580
+ schema:
1581
+ $ref: "#/components/schemas/ErrorResponse"
1582
+ "429":
1583
+ description: Rate limit or quota exceeded
1584
+ content:
1585
+ application/json:
1586
+ schema:
1587
+ $ref: "#/components/schemas/ErrorResponse"
1588
+ "502":
1589
+ description: Upstream service error
1590
+ content:
1591
+ application/json:
1592
+ schema:
1593
+ $ref: "#/components/schemas/ErrorResponse"
1594
+ /v1/flight_search:
1595
+ post:
1596
+ tags:
1597
+ - flights
1598
+ summary: Live-price a route (or re-price an offer_token)
1599
+ security:
1600
+ - ApiKeyAuth: []
1601
+ - BearerAuth: []
1602
+ requestBody:
1603
+ content:
1604
+ application/json:
1605
+ schema:
1606
+ $ref: "#/components/schemas/FlightSearchRequest"
1607
+ responses:
1608
+ "200":
1609
+ description: Priced offers
1610
+ content:
1611
+ application/json:
1612
+ schema:
1613
+ $ref: "#/components/schemas/FlightSearchResponse"
1614
+ "400":
1615
+ description: Bad request
1616
+ content:
1617
+ application/json:
1618
+ schema:
1619
+ $ref: "#/components/schemas/ErrorResponse"
1620
+ "401":
1621
+ description: Authentication required
1622
+ content:
1623
+ application/json:
1624
+ schema:
1625
+ $ref: "#/components/schemas/ErrorResponse"
1626
+ "422":
1627
+ description: Validation error
1628
+ content:
1629
+ application/json:
1630
+ schema:
1631
+ $ref: "#/components/schemas/ErrorResponse"
1632
+ "429":
1633
+ description: Rate limit or quota exceeded
1634
+ content:
1635
+ application/json:
1636
+ schema:
1637
+ $ref: "#/components/schemas/ErrorResponse"
1638
+ "502":
1639
+ description: Upstream service error
1640
+ content:
1641
+ application/json:
1642
+ schema:
1643
+ $ref: "#/components/schemas/ErrorResponse"
1644
+ /v1/price_monitoring:
1645
+ post:
1646
+ tags:
1647
+ - flights
1648
+ summary: Poll the cheapest cached price for a fixed route + dates (cache-only)
1649
+ security:
1650
+ - ApiKeyAuth: []
1651
+ - BearerAuth: []
1652
+ requestBody:
1653
+ content:
1654
+ application/json:
1655
+ schema:
1656
+ $ref: "#/components/schemas/PriceMonitoringRequest"
1657
+ responses:
1658
+ "200":
1659
+ description: Cheapest cached itinerary, or stale on a cache miss
1660
+ content:
1661
+ application/json:
1662
+ schema:
1663
+ $ref: "#/components/schemas/PriceMonitoringResponse"
1664
+ "400":
1665
+ description: Bad request
1666
+ content:
1667
+ application/json:
1668
+ schema:
1669
+ $ref: "#/components/schemas/ErrorResponse"
1670
+ "401":
1671
+ description: Authentication required
1672
+ content:
1673
+ application/json:
1674
+ schema:
1675
+ $ref: "#/components/schemas/ErrorResponse"
1676
+ "422":
1677
+ description: Validation error
1678
+ content:
1679
+ application/json:
1680
+ schema:
1681
+ $ref: "#/components/schemas/ErrorResponse"
1682
+ "429":
1683
+ description: Rate limit or quota exceeded
1684
+ content:
1685
+ application/json:
1686
+ schema:
1687
+ $ref: "#/components/schemas/ErrorResponse"
1688
+ "502":
1689
+ description: Upstream service error
1690
+ content:
1691
+ application/json:
1692
+ schema:
1693
+ $ref: "#/components/schemas/ErrorResponse"
1694
+ /v1/trip:
1695
+ post:
1696
+ tags:
1697
+ - cart
1698
+ summary: Create or update a trip (add/remove item, set travelers)
1699
+ security:
1700
+ - ApiKeyAuth: []
1701
+ - BearerAuth: []
1702
+ requestBody:
1703
+ content:
1704
+ application/json:
1705
+ schema:
1706
+ $ref: "#/components/schemas/TripRequest"
1707
+ responses:
1708
+ "200":
1709
+ description: The trip
1710
+ content:
1711
+ application/json:
1712
+ schema:
1713
+ $ref: "#/components/schemas/TripResponse"
1714
+ "400":
1715
+ description: Bad request
1716
+ content:
1717
+ application/json:
1718
+ schema:
1719
+ $ref: "#/components/schemas/ErrorResponse"
1720
+ "401":
1721
+ description: Authentication required
1722
+ content:
1723
+ application/json:
1724
+ schema:
1725
+ $ref: "#/components/schemas/ErrorResponse"
1726
+ "422":
1727
+ description: Validation error
1728
+ content:
1729
+ application/json:
1730
+ schema:
1731
+ $ref: "#/components/schemas/ErrorResponse"
1732
+ "429":
1733
+ description: Rate limit or quota exceeded
1734
+ content:
1735
+ application/json:
1736
+ schema:
1737
+ $ref: "#/components/schemas/ErrorResponse"
1738
+ "502":
1739
+ description: Upstream service error
1740
+ content:
1741
+ application/json:
1742
+ schema:
1743
+ $ref: "#/components/schemas/ErrorResponse"
1744
+ /v1/trip/{trip_id}:
1745
+ get:
1746
+ tags:
1747
+ - cart
1748
+ summary: Get a trip by id
1749
+ security:
1750
+ - ApiKeyAuth: []
1751
+ - BearerAuth: []
1752
+ parameters:
1753
+ - schema:
1754
+ type: string
1755
+ required: true
1756
+ name: trip_id
1757
+ in: path
1758
+ responses:
1759
+ "200":
1760
+ description: The trip
1761
+ content:
1762
+ application/json:
1763
+ schema:
1764
+ $ref: "#/components/schemas/GetTripResponse"
1765
+ "400":
1766
+ description: Bad request
1767
+ content:
1768
+ application/json:
1769
+ schema:
1770
+ $ref: "#/components/schemas/ErrorResponse"
1771
+ "401":
1772
+ description: Authentication required
1773
+ content:
1774
+ application/json:
1775
+ schema:
1776
+ $ref: "#/components/schemas/ErrorResponse"
1777
+ "422":
1778
+ description: Validation error
1779
+ content:
1780
+ application/json:
1781
+ schema:
1782
+ $ref: "#/components/schemas/ErrorResponse"
1783
+ "429":
1784
+ description: Rate limit or quota exceeded
1785
+ content:
1786
+ application/json:
1787
+ schema:
1788
+ $ref: "#/components/schemas/ErrorResponse"
1789
+ "502":
1790
+ description: Upstream service error
1791
+ content:
1792
+ application/json:
1793
+ schema:
1794
+ $ref: "#/components/schemas/ErrorResponse"
1795
+ /v1/select_ancillaries:
1796
+ post:
1797
+ tags:
1798
+ - cart
1799
+ summary: Select ancillaries for a trip item
1800
+ security:
1801
+ - ApiKeyAuth: []
1802
+ - BearerAuth: []
1803
+ requestBody:
1804
+ content:
1805
+ application/json:
1806
+ schema:
1807
+ $ref: "#/components/schemas/AncillaryRequest"
1808
+ responses:
1809
+ "200":
1810
+ description: Updated ancillary selection
1811
+ content:
1812
+ application/json:
1813
+ schema:
1814
+ $ref: "#/components/schemas/AncillaryResponse"
1815
+ "400":
1816
+ description: Bad request
1817
+ content:
1818
+ application/json:
1819
+ schema:
1820
+ $ref: "#/components/schemas/ErrorResponse"
1821
+ "401":
1822
+ description: Authentication required
1823
+ content:
1824
+ application/json:
1825
+ schema:
1826
+ $ref: "#/components/schemas/ErrorResponse"
1827
+ "422":
1828
+ description: Validation error
1829
+ content:
1830
+ application/json:
1831
+ schema:
1832
+ $ref: "#/components/schemas/ErrorResponse"
1833
+ "429":
1834
+ description: Rate limit or quota exceeded
1835
+ content:
1836
+ application/json:
1837
+ schema:
1838
+ $ref: "#/components/schemas/ErrorResponse"
1839
+ "502":
1840
+ description: Upstream service error
1841
+ content:
1842
+ application/json:
1843
+ schema:
1844
+ $ref: "#/components/schemas/ErrorResponse"
1845
+ /v1/book:
1846
+ post:
1847
+ tags:
1848
+ - cart
1849
+ summary: Checkout a trip (returns a payment/checkout URL)
1850
+ security:
1851
+ - ApiKeyAuth: []
1852
+ - BearerAuth: []
1853
+ requestBody:
1854
+ content:
1855
+ application/json:
1856
+ schema:
1857
+ $ref: "#/components/schemas/BookRequest"
1858
+ responses:
1859
+ "200":
1860
+ description: Checkout session
1861
+ content:
1862
+ application/json:
1863
+ schema:
1864
+ $ref: "#/components/schemas/BookResponse"
1865
+ "400":
1866
+ description: Bad request
1867
+ content:
1868
+ application/json:
1869
+ schema:
1870
+ $ref: "#/components/schemas/ErrorResponse"
1871
+ "401":
1872
+ description: Authentication required
1873
+ content:
1874
+ application/json:
1875
+ schema:
1876
+ $ref: "#/components/schemas/ErrorResponse"
1877
+ "422":
1878
+ description: Validation error
1879
+ content:
1880
+ application/json:
1881
+ schema:
1882
+ $ref: "#/components/schemas/ErrorResponse"
1883
+ "429":
1884
+ description: Rate limit or quota exceeded
1885
+ content:
1886
+ application/json:
1887
+ schema:
1888
+ $ref: "#/components/schemas/ErrorResponse"
1889
+ "502":
1890
+ description: Upstream service error
1891
+ content:
1892
+ application/json:
1893
+ schema:
1894
+ $ref: "#/components/schemas/ErrorResponse"
1895
+ /v1/hotel_search:
1896
+ post:
1897
+ tags:
1898
+ - hotels
1899
+ summary: Search hotels by destination, dates, and occupancy
1900
+ security:
1901
+ - ApiKeyAuth: []
1902
+ - BearerAuth: []
1903
+ requestBody:
1904
+ content:
1905
+ application/json:
1906
+ schema:
1907
+ $ref: "#/components/schemas/HotelSearchRequest"
1908
+ responses:
1909
+ "200":
1910
+ description: Matching hotels
1911
+ content:
1912
+ application/json:
1913
+ schema:
1914
+ $ref: "#/components/schemas/HotelSearchResponse"
1915
+ "400":
1916
+ description: Bad request
1917
+ content:
1918
+ application/json:
1919
+ schema:
1920
+ $ref: "#/components/schemas/ErrorResponse"
1921
+ "401":
1922
+ description: Authentication required
1923
+ content:
1924
+ application/json:
1925
+ schema:
1926
+ $ref: "#/components/schemas/ErrorResponse"
1927
+ "422":
1928
+ description: Validation error
1929
+ content:
1930
+ application/json:
1931
+ schema:
1932
+ $ref: "#/components/schemas/ErrorResponse"
1933
+ "429":
1934
+ description: Rate limit or quota exceeded
1935
+ content:
1936
+ application/json:
1937
+ schema:
1938
+ $ref: "#/components/schemas/ErrorResponse"
1939
+ "502":
1940
+ description: Upstream service error
1941
+ content:
1942
+ application/json:
1943
+ schema:
1944
+ $ref: "#/components/schemas/ErrorResponse"
1945
+ /v1/hotel_details/{hotel_id}:
1946
+ get:
1947
+ tags:
1948
+ - hotels
1949
+ summary: Rich metadata for a single hotel
1950
+ security:
1951
+ - ApiKeyAuth: []
1952
+ - BearerAuth: []
1953
+ parameters:
1954
+ - schema:
1955
+ type: string
1956
+ required: true
1957
+ name: hotel_id
1958
+ in: path
1959
+ - schema:
1960
+ type: string
1961
+ required: false
1962
+ name: checkin
1963
+ in: query
1964
+ - schema:
1965
+ type: string
1966
+ required: false
1967
+ name: checkout
1968
+ in: query
1969
+ responses:
1970
+ "200":
1971
+ description: Hotel detail
1972
+ content:
1973
+ application/json:
1974
+ schema:
1975
+ $ref: "#/components/schemas/HotelDetailsResponse"
1976
+ "400":
1977
+ description: Bad request
1978
+ content:
1979
+ application/json:
1980
+ schema:
1981
+ $ref: "#/components/schemas/ErrorResponse"
1982
+ "401":
1983
+ description: Authentication required
1984
+ content:
1985
+ application/json:
1986
+ schema:
1987
+ $ref: "#/components/schemas/ErrorResponse"
1988
+ "422":
1989
+ description: Validation error
1990
+ content:
1991
+ application/json:
1992
+ schema:
1993
+ $ref: "#/components/schemas/ErrorResponse"
1994
+ "429":
1995
+ description: Rate limit or quota exceeded
1996
+ content:
1997
+ application/json:
1998
+ schema:
1999
+ $ref: "#/components/schemas/ErrorResponse"
2000
+ "502":
2001
+ description: Upstream service error
2002
+ content:
2003
+ application/json:
2004
+ schema:
2005
+ $ref: "#/components/schemas/ErrorResponse"
2006
+ /v1/get_booking:
2007
+ post:
2008
+ tags:
2009
+ - post-booking
2010
+ summary: Retrieve a booking (flight + hotel) by reference + last name
2011
+ security:
2012
+ - ApiKeyAuth: []
2013
+ - BearerAuth: []
2014
+ requestBody:
2015
+ content:
2016
+ application/json:
2017
+ schema:
2018
+ $ref: "#/components/schemas/GetBookingRequest"
2019
+ responses:
2020
+ "200":
2021
+ description: Retrieve a booking (flight + hotel) by reference + last name
2022
+ content:
2023
+ application/json:
2024
+ schema:
2025
+ $ref: "#/components/schemas/GetBookingResponse"
2026
+ "400":
2027
+ description: Bad request
2028
+ content:
2029
+ application/json:
2030
+ schema:
2031
+ $ref: "#/components/schemas/ErrorResponse"
2032
+ "401":
2033
+ description: Authentication required
2034
+ content:
2035
+ application/json:
2036
+ schema:
2037
+ $ref: "#/components/schemas/ErrorResponse"
2038
+ "422":
2039
+ description: Validation error
2040
+ content:
2041
+ application/json:
2042
+ schema:
2043
+ $ref: "#/components/schemas/ErrorResponse"
2044
+ "429":
2045
+ description: Rate limit or quota exceeded
2046
+ content:
2047
+ application/json:
2048
+ schema:
2049
+ $ref: "#/components/schemas/ErrorResponse"
2050
+ "502":
2051
+ description: Upstream service error
2052
+ content:
2053
+ application/json:
2054
+ schema:
2055
+ $ref: "#/components/schemas/ErrorResponse"
2056
+ /v1/refund_check:
2057
+ post:
2058
+ tags:
2059
+ - post-booking
2060
+ summary: Check flight refund eligibility
2061
+ security:
2062
+ - ApiKeyAuth: []
2063
+ - BearerAuth: []
2064
+ requestBody:
2065
+ content:
2066
+ application/json:
2067
+ schema:
2068
+ $ref: "#/components/schemas/RefundCheckRequest"
2069
+ responses:
2070
+ "200":
2071
+ description: Check flight refund eligibility
2072
+ content:
2073
+ application/json:
2074
+ schema:
2075
+ $ref: "#/components/schemas/RefundCheckResponse"
2076
+ "400":
2077
+ description: Bad request
2078
+ content:
2079
+ application/json:
2080
+ schema:
2081
+ $ref: "#/components/schemas/ErrorResponse"
2082
+ "401":
2083
+ description: Authentication required
2084
+ content:
2085
+ application/json:
2086
+ schema:
2087
+ $ref: "#/components/schemas/ErrorResponse"
2088
+ "422":
2089
+ description: Validation error
2090
+ content:
2091
+ application/json:
2092
+ schema:
2093
+ $ref: "#/components/schemas/ErrorResponse"
2094
+ "429":
2095
+ description: Rate limit or quota exceeded
2096
+ content:
2097
+ application/json:
2098
+ schema:
2099
+ $ref: "#/components/schemas/ErrorResponse"
2100
+ "502":
2101
+ description: Upstream service error
2102
+ content:
2103
+ application/json:
2104
+ schema:
2105
+ $ref: "#/components/schemas/ErrorResponse"
2106
+ /v1/refund_commit:
2107
+ post:
2108
+ tags:
2109
+ - post-booking
2110
+ summary: Initiate a flight refund
2111
+ security:
2112
+ - ApiKeyAuth: []
2113
+ - BearerAuth: []
2114
+ requestBody:
2115
+ content:
2116
+ application/json:
2117
+ schema:
2118
+ $ref: "#/components/schemas/RefundCommitRequest"
2119
+ responses:
2120
+ "200":
2121
+ description: Initiate a flight refund
2122
+ content:
2123
+ application/json:
2124
+ schema:
2125
+ $ref: "#/components/schemas/RefundCommitResponse"
2126
+ "400":
2127
+ description: Bad request
2128
+ content:
2129
+ application/json:
2130
+ schema:
2131
+ $ref: "#/components/schemas/ErrorResponse"
2132
+ "401":
2133
+ description: Authentication required
2134
+ content:
2135
+ application/json:
2136
+ schema:
2137
+ $ref: "#/components/schemas/ErrorResponse"
2138
+ "422":
2139
+ description: Validation error
2140
+ content:
2141
+ application/json:
2142
+ schema:
2143
+ $ref: "#/components/schemas/ErrorResponse"
2144
+ "429":
2145
+ description: Rate limit or quota exceeded
2146
+ content:
2147
+ application/json:
2148
+ schema:
2149
+ $ref: "#/components/schemas/ErrorResponse"
2150
+ "502":
2151
+ description: Upstream service error
2152
+ content:
2153
+ application/json:
2154
+ schema:
2155
+ $ref: "#/components/schemas/ErrorResponse"
2156
+ /v1/refund_status:
2157
+ post:
2158
+ tags:
2159
+ - post-booking
2160
+ summary: Poll a flight refund
2161
+ security:
2162
+ - ApiKeyAuth: []
2163
+ - BearerAuth: []
2164
+ requestBody:
2165
+ content:
2166
+ application/json:
2167
+ schema:
2168
+ $ref: "#/components/schemas/RefundStatusRequest"
2169
+ responses:
2170
+ "200":
2171
+ description: Poll a flight refund
2172
+ content:
2173
+ application/json:
2174
+ schema:
2175
+ $ref: "#/components/schemas/RefundStatusResponse"
2176
+ "400":
2177
+ description: Bad request
2178
+ content:
2179
+ application/json:
2180
+ schema:
2181
+ $ref: "#/components/schemas/ErrorResponse"
2182
+ "401":
2183
+ description: Authentication required
2184
+ content:
2185
+ application/json:
2186
+ schema:
2187
+ $ref: "#/components/schemas/ErrorResponse"
2188
+ "422":
2189
+ description: Validation error
2190
+ content:
2191
+ application/json:
2192
+ schema:
2193
+ $ref: "#/components/schemas/ErrorResponse"
2194
+ "429":
2195
+ description: Rate limit or quota exceeded
2196
+ content:
2197
+ application/json:
2198
+ schema:
2199
+ $ref: "#/components/schemas/ErrorResponse"
2200
+ "502":
2201
+ description: Upstream service error
2202
+ content:
2203
+ application/json:
2204
+ schema:
2205
+ $ref: "#/components/schemas/ErrorResponse"
2206
+ /v1/exchange_shop:
2207
+ post:
2208
+ tags:
2209
+ - post-booking
2210
+ summary: Shop flight exchange alternatives
2211
+ security:
2212
+ - ApiKeyAuth: []
2213
+ - BearerAuth: []
2214
+ requestBody:
2215
+ content:
2216
+ application/json:
2217
+ schema:
2218
+ $ref: "#/components/schemas/ExchangeShopRequest"
2219
+ responses:
2220
+ "200":
2221
+ description: Shop flight exchange alternatives
2222
+ content:
2223
+ application/json:
2224
+ schema:
2225
+ $ref: "#/components/schemas/ExchangeShopResponse"
2226
+ "400":
2227
+ description: Bad request
2228
+ content:
2229
+ application/json:
2230
+ schema:
2231
+ $ref: "#/components/schemas/ErrorResponse"
2232
+ "401":
2233
+ description: Authentication required
2234
+ content:
2235
+ application/json:
2236
+ schema:
2237
+ $ref: "#/components/schemas/ErrorResponse"
2238
+ "422":
2239
+ description: Validation error
2240
+ content:
2241
+ application/json:
2242
+ schema:
2243
+ $ref: "#/components/schemas/ErrorResponse"
2244
+ "429":
2245
+ description: Rate limit or quota exceeded
2246
+ content:
2247
+ application/json:
2248
+ schema:
2249
+ $ref: "#/components/schemas/ErrorResponse"
2250
+ "502":
2251
+ description: Upstream service error
2252
+ content:
2253
+ application/json:
2254
+ schema:
2255
+ $ref: "#/components/schemas/ErrorResponse"
2256
+ /v1/exchange_price:
2257
+ post:
2258
+ tags:
2259
+ - post-booking
2260
+ summary: Price a flight exchange offer
2261
+ security:
2262
+ - ApiKeyAuth: []
2263
+ - BearerAuth: []
2264
+ requestBody:
2265
+ content:
2266
+ application/json:
2267
+ schema:
2268
+ $ref: "#/components/schemas/ExchangePriceRequest"
2269
+ responses:
2270
+ "200":
2271
+ description: Price a flight exchange offer
2272
+ content:
2273
+ application/json:
2274
+ schema:
2275
+ $ref: "#/components/schemas/ExchangePriceResponse"
2276
+ "400":
2277
+ description: Bad request
2278
+ content:
2279
+ application/json:
2280
+ schema:
2281
+ $ref: "#/components/schemas/ErrorResponse"
2282
+ "401":
2283
+ description: Authentication required
2284
+ content:
2285
+ application/json:
2286
+ schema:
2287
+ $ref: "#/components/schemas/ErrorResponse"
2288
+ "422":
2289
+ description: Validation error
2290
+ content:
2291
+ application/json:
2292
+ schema:
2293
+ $ref: "#/components/schemas/ErrorResponse"
2294
+ "429":
2295
+ description: Rate limit or quota exceeded
2296
+ content:
2297
+ application/json:
2298
+ schema:
2299
+ $ref: "#/components/schemas/ErrorResponse"
2300
+ "502":
2301
+ description: Upstream service error
2302
+ content:
2303
+ application/json:
2304
+ schema:
2305
+ $ref: "#/components/schemas/ErrorResponse"
2306
+ /v1/exchange_commit:
2307
+ post:
2308
+ tags:
2309
+ - post-booking
2310
+ summary: Execute a flight exchange
2311
+ security:
2312
+ - ApiKeyAuth: []
2313
+ - BearerAuth: []
2314
+ requestBody:
2315
+ content:
2316
+ application/json:
2317
+ schema:
2318
+ $ref: "#/components/schemas/ExchangeCommitRequest"
2319
+ responses:
2320
+ "200":
2321
+ description: Execute a flight exchange
2322
+ content:
2323
+ application/json:
2324
+ schema:
2325
+ $ref: "#/components/schemas/ExchangeCommitResponse"
2326
+ "400":
2327
+ description: Bad request
2328
+ content:
2329
+ application/json:
2330
+ schema:
2331
+ $ref: "#/components/schemas/ErrorResponse"
2332
+ "401":
2333
+ description: Authentication required
2334
+ content:
2335
+ application/json:
2336
+ schema:
2337
+ $ref: "#/components/schemas/ErrorResponse"
2338
+ "422":
2339
+ description: Validation error
2340
+ content:
2341
+ application/json:
2342
+ schema:
2343
+ $ref: "#/components/schemas/ErrorResponse"
2344
+ "429":
2345
+ description: Rate limit or quota exceeded
2346
+ content:
2347
+ application/json:
2348
+ schema:
2349
+ $ref: "#/components/schemas/ErrorResponse"
2350
+ "502":
2351
+ description: Upstream service error
2352
+ content:
2353
+ application/json:
2354
+ schema:
2355
+ $ref: "#/components/schemas/ErrorResponse"
2356
+ /v1/exchange_status:
2357
+ post:
2358
+ tags:
2359
+ - post-booking
2360
+ summary: Poll a flight exchange
2361
+ security:
2362
+ - ApiKeyAuth: []
2363
+ - BearerAuth: []
2364
+ requestBody:
2365
+ content:
2366
+ application/json:
2367
+ schema:
2368
+ $ref: "#/components/schemas/ExchangeStatusRequest"
2369
+ responses:
2370
+ "200":
2371
+ description: Poll a flight exchange
2372
+ content:
2373
+ application/json:
2374
+ schema:
2375
+ $ref: "#/components/schemas/ExchangeStatusResponse"
2376
+ "400":
2377
+ description: Bad request
2378
+ content:
2379
+ application/json:
2380
+ schema:
2381
+ $ref: "#/components/schemas/ErrorResponse"
2382
+ "401":
2383
+ description: Authentication required
2384
+ content:
2385
+ application/json:
2386
+ schema:
2387
+ $ref: "#/components/schemas/ErrorResponse"
2388
+ "422":
2389
+ description: Validation error
2390
+ content:
2391
+ application/json:
2392
+ schema:
2393
+ $ref: "#/components/schemas/ErrorResponse"
2394
+ "429":
2395
+ description: Rate limit or quota exceeded
2396
+ content:
2397
+ application/json:
2398
+ schema:
2399
+ $ref: "#/components/schemas/ErrorResponse"
2400
+ "502":
2401
+ description: Upstream service error
2402
+ content:
2403
+ application/json:
2404
+ schema:
2405
+ $ref: "#/components/schemas/ErrorResponse"
2406
+ /v1/hotel_cancel:
2407
+ post:
2408
+ tags:
2409
+ - post-booking
2410
+ summary: Cancel a hotel booking
2411
+ security:
2412
+ - ApiKeyAuth: []
2413
+ - BearerAuth: []
2414
+ requestBody:
2415
+ content:
2416
+ application/json:
2417
+ schema:
2418
+ $ref: "#/components/schemas/HotelCancelRequest"
2419
+ responses:
2420
+ "200":
2421
+ description: Cancel a hotel booking
2422
+ content:
2423
+ application/json:
2424
+ schema:
2425
+ $ref: "#/components/schemas/HotelCancelResponse"
2426
+ "400":
2427
+ description: Bad request
2428
+ content:
2429
+ application/json:
2430
+ schema:
2431
+ $ref: "#/components/schemas/ErrorResponse"
2432
+ "401":
2433
+ description: Authentication required
2434
+ content:
2435
+ application/json:
2436
+ schema:
2437
+ $ref: "#/components/schemas/ErrorResponse"
2438
+ "422":
2439
+ description: Validation error
2440
+ content:
2441
+ application/json:
2442
+ schema:
2443
+ $ref: "#/components/schemas/ErrorResponse"
2444
+ "429":
2445
+ description: Rate limit or quota exceeded
2446
+ content:
2447
+ application/json:
2448
+ schema:
2449
+ $ref: "#/components/schemas/ErrorResponse"
2450
+ "502":
2451
+ description: Upstream service error
2452
+ content:
2453
+ application/json:
2454
+ schema:
2455
+ $ref: "#/components/schemas/ErrorResponse"