{
	"info": {
		"_postman_id": "booking-service-api-v2-2026",
		"name": "Booking Service API - Complete",
		"description": "# Hotel Booking Service API\n\nComprehensive API collection for hotel bookings with Amadeus integration, guest management, and cancellations.\n\n## Quick Start Guide\n\n### 1. Setup Environment Variables\nUpdate these collection variables before testing:\n- `baseUrl`: Your API URL (default: http://localhost:3002)\n- `userId`: Valid user UUID from your database\n- `amadeusOfferId`: Get from hotel search API\n- `officeId`: Required for AVH hotel bookings\n\n### 2. Typical Workflow\n\n**Create Pending Booking:**\n1. Use \"Create Booking (Pending)\" - creates DB record only\n2. `bookingId` automatically saved to collection variables\n\n**Book with Amadeus:**\n3. Use \"Update Booking with Amadeus (AVH)\" or \"(GDS)\"\n4. AVH hotels (ID starts with AD): Requires `officeId`, uses AGENCY_ACCOUNT\n5. GDS hotels (alphanumeric ID): Requires credit card details\n\n**Manage Booking:**\n6. \"Get User Bookings\" - View all user bookings\n7. \"Get Booking Guests\" - See guest details\n8. \"Get Amadeus Order Details\" - View Amadeus confirmation\n\n**Cancel Booking:**\n9. \"Get Cancellation Details\" - Check refund calculation\n10. \"Cancel Booking\" - Process cancellation with refund\n11. \"Get Cancellation Status\" - Verify cancellation\n\n### 3. Important Notes\n\n**Guest Distribution:**\n- At least 1 adult required per room\n- Guests auto-fetched from DB for Amadeus bookings\n- Distribution: Adults first (1 per room), then round-robin\n\n**Hotel Types:**\n- AVH Hotels: ID starts with \"AD\" (e.g., AD12345678)\n- GDS Hotels: Alphanumeric ID (e.g., NYCLOND1)\n\n**Payment Methods:**\n- AVH: AGENCY_ACCOUNT (no card needed)\n- GDS: CREDIT_CARD (full card details required)",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
		"_exporter_id": "booking-service"
	},
	"item": [
		{
			"name": "Bookings Management",
			"description": "Core booking operations - create, retrieve, and update bookings",
			"item": [
				{
					"name": "Create Booking (Pending)",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"if (pm.response.code === 201) {",
									"    var jsonData = pm.response.json();",
									"    pm.collectionVariables.set('bookingId', jsonData.data.id);",
									"    pm.collectionVariables.set('bookingReference', jsonData.data.bookingReference);",
									"    console.log('Booking created with ID:', jsonData.data.id);",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"userId\": \"123e4567-e89b-12d3-a456-426614174000\",\n  \"hotelId\": 1,\n  \"hotelName\": \"Grand Plaza Hotel\",\n  \"hotelCity\": \"New York\",\n  \"checkInDate\": \"2026-03-15\",\n  \"checkOutDate\": \"2026-03-18\",\n  \"numberOfNights\": 3,\n  \"numberOfRooms\": 2,\n  \"numberOfAdults\": 3,\n  \"numberOfChildren\": 2,\n  \"roomType\": \"Deluxe Suite\",\n  \"cancellationPolicy\": \"Free cancellation up to 48 hours before check-in\",\n  \"currency\": \"USD\",\n  \"basePrice\": 450.00,\n  \"taxesAndFees\": 67.50,\n  \"totalPrice\": 517.50,\n  \"isRefundable\": true,\n  \"specialRequests\": \"High floor room preferred\",\n  \"createInAmadeus\": false,\n  \"guests\": [\n    {\n      \"tid\": 1,\n      \"title\": \"MR\",\n      \"firstName\": \"John\",\n      \"lastName\": \"Doe\",\n      \"phone\": \"+1234567890\",\n      \"email\": \"john.doe@example.com\",\n      \"isAdult\": true\n    },\n    {\n      \"tid\": 2,\n      \"title\": \"MRS\",\n      \"firstName\": \"Jane\",\n      \"lastName\": \"Doe\",\n      \"phone\": \"+1234567891\",\n      \"email\": \"jane.doe@example.com\",\n      \"isAdult\": true\n    },\n    {\n      \"tid\": 3,\n      \"title\": \"MS\",\n      \"firstName\": \"Emily\",\n      \"lastName\": \"Smith\",\n      \"phone\": \"+1234567892\",\n      \"email\": \"emily.smith@example.com\",\n      \"isAdult\": true\n    },\n    {\n      \"tid\": 4,\n      \"title\": \"MSTR\",\n      \"firstName\": \"Tom\",\n      \"lastName\": \"Doe\",\n      \"phone\": \"+1234567890\",\n      \"email\": \"john.doe@example.com\",\n      \"age\": 8,\n      \"isAdult\": false,\n      \"childAge\": 8\n    },\n    {\n      \"tid\": 5,\n      \"title\": \"MISS\",\n      \"firstName\": \"Sarah\",\n      \"lastName\": \"Doe\",\n      \"phone\": \"+1234567890\",\n      \"email\": \"john.doe@example.com\",\n      \"age\": 5,\n      \"isAdult\": false,\n      \"childAge\": 5\n    }\n  ]\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{baseUrl}}/",
							"host": ["{{baseUrl}}"],
							"path": ["/"]
						},
						"description": "**Create a new booking without Amadeus integration**\n\nThis creates a PENDING booking in the database only (no Amadeus API call).\n\n**Sample Payload Explanation:**\n- `userId`: User UUID (required)\n- `hotelId`: Internal hotel ID (optional)\n- `numberOfRooms`: 2 rooms\n- `numberOfAdults`: 3 adults total\n- `numberOfChildren`: 2 children total\n- `createInAmadeus`: false = Skip Amadeus booking\n- `guests`: 5 guests (3 adults + 2 children)\n  - Guest 1-3: Adults (isAdult=true)\n  - Guest 4-5: Children (isAdult=false, requires childAge)\n\n**Distribution:** Per room requirement, at least 1 adult per room:\n- Room 1: Adult 1, Adult 3, Child 1\n- Room 2: Adult 2, Child 2\n\n**Response:** Returns booking ID, reference, and status"
					},
					"response": []
				},
				{
					"name": "Get Booking by ID (Returns Amadeus Order)",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/{{bookingId}}",
							"host": ["{{baseUrl}}"],
							"path": ["{{bookingId}}"]
						},
						"description": "**Get booking details by ID**\n\n⚠️ **IMPORTANT:** This endpoint currently returns Amadeus order details, not basic booking info.\n\n**Returns:**\n- Amadeus hotel order details\n- Hotel information\n- Booking confirmation from Amadeus\n\n**When to use:**\n- After creating Amadeus booking\n- To view confirmation details\n- To get Amadeus order ID\n\n**Alternatives:**\n- For basic booking info: Use GET /user/:userId\n- For full order details: Use GET /:id/amadeus-order\n- For guest details: Use GET /:id/guests"
					},  
					"response": []
				},
				{
					"name": "Get User Bookings",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/user/{{userId}}?page=1&limit=10",
							"host": ["{{baseUrl}}"],
							"path": ["user", "{{userId}}"],
							"query": [
								{
									"key": "status",
									"value": "CONFIRMED",
									"disabled": true,
									"description": "Filter by: PENDING, CONFIRMED, CANCELLED, COMPLETED, FAILED, REFUNDED"
								},
								{
									"key": "page",
									"value": "1",
									"description": "Page number"
								},
								{
									"key": "limit",
									"value": "10",
									"description": "Results per page"
								},
								{
									"key": "startDate",
									"value": "2026-01-01",
									"disabled": true,
									"description": "Filter bookings from this date"
								},
								{
									"key": "endDate",
									"value": "2026-12-31",
									"disabled": true,
									"description": "Filter bookings until this date"
								}
							]
						},
						"description": "**Get all bookings for a specific user**\n\n**Query Parameters:**\n- `page`: Page number (default: 1)\n- `limit`: Results per page (default: 10)\n- `status`: Filter by booking status (optional)\n  - PENDING: Not confirmed in Amadeus\n  - CONFIRMED: Successfully booked in Amadeus\n  - CANCELLED: Booking cancelled\n  - COMPLETED: Trip completed\n  - FAILED: Amadeus booking failed\n  - REFUNDED: Cancellation refund processed\n- `startDate`: Filter from check-in date (YYYY-MM-DD)\n- `endDate`: Filter to check-in date (YYYY-MM-DD)\n\n**Returns:**\n- Array of bookings with guest details\n- Pagination metadata (total, pages)\n- Booking summary (hotel, dates, price)\n\n**Example:** Get confirmed bookings for March 2026\n```\n?status=CONFIRMED&startDate=2026-03-01&endDate=2026-03-31&page=1&limit=20\n```"
					},  
					"response": []
				},
				{
					"name": "Get Booking Guests",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/{{bookingId}}/guests",
							"host": ["{{baseUrl}}"],
							"path": ["{{bookingId}}", "guests"]
						},
						"description": "**Get all guest details for a specific booking**\n\n**Returns:**\n- Array of all guests on the booking\n- Full guest information (name, contact, age)\n- Child details (age for children)\n- Primary guest indicator\n- Room assignments (if Amadeus booking created)\n\n**Guest Fields:**\n- `id`: Guest database ID\n- `bookingId`: Associated booking ID\n- `tid`: Traveler ID\n- `title`: MR, MRS, MS, MSTR, MISS\n- `firstName`, `lastName`: Guest names\n- `phone`, `email`: Contact details\n- `isAdult`: Boolean flag\n- `age`, `childAge`: For children only\n- `isPrimary`: Main contact guest\n\n**Use Cases:**\n- Display guest list in UI\n- Verify guest information before Amadeus booking\n- Export guest manifest"
					},  
					"response": []
				},
				{
					"name": "Get Amadeus Order Details",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/{{bookingId}}/amadeus-order",
							"host": ["{{baseUrl}}"],
							"path": ["{{bookingId}}", "amadeus-order"]
						},
						"description": "**Get Amadeus hotel order details**\n\n**Requirements:**\n- Booking must be created in Amadeus (createInAmadeus=true)\n- Only works for CONFIRMED status bookings\n\n**Returns:**\n- Amadeus order ID\n- Hotel information from Amadeus\n- Booking confirmation details\n- Room details\n- Guest assignments per room\n- Pricing breakdown\n- Cancellation policies\n\n**Use Cases:**\n- Display confirmation page\n- Get Amadeus reference for support\n- Verify booking creation successful\n\n**Note:** This is the same as GET /:id endpoint (both return Amadeus order)"
					},  
					"response": []
				}
			]
		},
		{
			"name": "Booking Updates",
			"description": "Update booking details and create Amadeus bookings",
			"item": [
				{
					"name": "Update Booking (Basic)",
					"request": {
						"method": "PATCH",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"specialRequests\": \"Late check-out requested, non-smoking room\",\n  \"numberOfRooms\": 2,\n  \"numberOfAdults\": 4,\n  \"numberOfChildren\": 1\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{baseUrl}}/{{bookingId}}",
							"host": ["{{baseUrl}}"],
							"path": ["{{bookingId}}"]
						},
						"description": "**Update basic booking details - NO Amadeus integration**\n\nUse this endpoint for simple database updates only.\n\n**Sample Payload:**\n- `specialRequests`: Optional text field\n- `numberOfRooms`: Update room count\n- `numberOfAdults`: Update adult count\n- `numberOfChildren`: Update children count\n\n**Note:** This only updates the database record. Does NOT create or update Amadeus bookings."
					},  
					"response": []
				},
				{
					"name": "Update Booking with Amadeus (AVH Hotel)",
					"request": {
						"method": "PATCH",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"createInAmadeus\": true,\n  \"amadeusOfferId\": \"YOUR_AMADEUS_OFFER_ID_FROM_SEARCH\",\n  \"amadeusHotelId\": \"AD12345678\",\n  \"officeId\": \"YOUR_OFFICE_ID\",\n  \"clientRef\": \"booking-{{$timestamp}}\",\n  \"specialRequests\": \"Early check-in if possible\",\n  \"numberOfRooms\": 2,\n  \"numberOfAdults\": 3,\n  \"numberOfChildren\": 2,\n  \"payment\": {\n    \"method\": \"AGENCY_ACCOUNT\"\n  }\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{baseUrl}}/{{bookingId}}",
							"host": ["{{baseUrl}}"],
							"path": ["{{bookingId}}"]
						},
						"description": "**Update booking and CREATE in Amadeus - AVH Hotels**\n\n**AVH Hotels:** Hotel IDs starting with 'AD' (e.g., AD12345678)\n\n**Required Fields:**\n- `createInAmadeus`: true (triggers Amadeus booking)\n- `amadeusOfferId`: From hotel search API response\n- `amadeusHotelId`: Must start with 'AD' for AVH\n- `officeId`: Required for AVH hotels\n- `payment.method`: \"AGENCY_ACCOUNT\" (no card needed)\n\n**Guest Distribution:**\n- Guests fetched from database automatically\n- At least 1 adult required per room\n- Adults distributed first, then children\n\n**Example:** 2 rooms, 3 adults, 2 children\n- Room 1: Adult 1, Adult 3, Child 1\n- Room 2: Adult 2, Child 2"
					},  
					"response": []
				},
				{
					"name": "Update Booking with Amadeus (GDS Hotel)",
					"request": {
						"method": "PATCH",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"createInAmadeus\": true,\n  \"amadeusOfferId\": \"YOUR_AMADEUS_OFFER_ID_FROM_SEARCH\",\n  \"amadeusHotelId\": \"NYCLOND1\",\n  \"clientRef\": \"booking-{{$timestamp}}\",\n  \"specialRequests\": \"Connecting rooms preferred\",\n  \"numberOfRooms\": 2,\n  \"numberOfAdults\": 3,\n  \"numberOfChildren\": 2,\n  \"payment\": {\n    \"method\": \"CREDIT_CARD\",\n    \"card\": {\n      \"vendorCode\": \"VI\",\n      \"cardNumber\": \"4111111111111111\",\n      \"expiryDate\": \"2028-12\",\n      \"holderName\": \"JOHN DOE\",\n      \"securityCode\": \"123\"\n    }\n  }\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{baseUrl}}/{{bookingId}}",
							"host": ["{{baseUrl}}"],
							"path": ["{{bookingId}}"]
						},
						"description": "**Update booking and CREATE in Amadeus - GDS Hotels**\n\n**GDS Hotels:** Hotel IDs NOT starting with 'AD' (e.g., NYCLOND1, PARCDG01)\n\n**Required Fields:**\n- `createInAmadeus`: true (triggers Amadeus booking)\n- `amadeusOfferId`: From hotel search API response\n- `amadeusHotelId`: Alphanumeric code (NOT starting with AD)\n- `payment.method`: \"CREDIT_CARD\" (required for GDS)\n- `payment.card`: Full card details required\n\n**Card Details:**\n- `vendorCode`: VI (Visa), CA (Mastercard), AX (Amex)\n- `cardNumber`: Full 16-digit number\n- `expiryDate`: YYYY-MM format\n- `holderName`: Uppercase\n- `securityCode`: CVV (3-4 digits)\n\n**Guest Distribution:** Same as AVH (auto-fetched from DB)\n\n**Note:** NO officeId required for GDS hotels"
					},  
					"response": []
				},
				{
					"name": "Update Guest Details",
					"request": {
						"method": "PATCH",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"guests\": [\n    {\n      \"tid\": 1,\n      \"title\": \"MR\",\n      \"firstName\": \"John\",\n      \"lastName\": \"Smith\",\n      \"phone\": \"+1234567890\",\n      \"email\": \"john.smith@example.com\",\n      \"isAdult\": true\n    },\n    {\n      \"tid\": 2,\n      \"title\": \"MRS\",\n      \"firstName\": \"Jane\",\n      \"lastName\": \"Smith\",\n      \"phone\": \"+1234567891\",\n      \"email\": \"jane.smith@example.com\",\n      \"isAdult\": true\n    },\n    {\n      \"tid\": 3,\n      \"title\": \"MSTR\",\n      \"firstName\": \"Tommy\",\n      \"lastName\": \"Smith\",\n      \"phone\": \"+1234567890\",\n      \"email\": \"john.smith@example.com\",\n      \"age\": 10,\n      \"isAdult\": false,\n      \"childAge\": 10\n    }\n  ]\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{baseUrl}}/{{bookingId}}",
							"host": ["{{baseUrl}}"],
							"path": ["{{bookingId}}"]
						},
						"description": "**Update guest information - Database Only**\n\n⚠️ **IMPORTANT:** This ONLY updates the database. Does NOT affect Amadeus bookings.\n\n**Guest Fields:**\n- `tid`: Traveler ID (required)\n- `title`: MR, MRS, MS, MSTR (boy), MISS (girl)\n- `firstName`: Guest first name\n- `lastName`: Guest last name\n- `phone`: Contact number with country code\n- `email`: Contact email\n- `isAdult`: true for adults, false for children\n- `age` & `childAge`: Required for children (isAdult=false)\n\n**Sample:** This example has 2 adults + 1 child\n\n**Use Case:** Update guest names, contact info, or correct child ages before creating Amadeus booking"
					},  
					"response": []
				}
			]
		},
		{
			"name": "Cancellations",
			"description": "Booking cancellation workflows with refund processing",
			"item": [
				{
					"name": "Get Cancellation Details",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/{{bookingId}}/cancellation-details",
							"host": ["{{baseUrl}}"],
							"path": ["{{bookingId}}", "cancellation-details"]
						},
						"description": "**Get cancellation policy and refund calculation**\n\n**Call this BEFORE cancelling** to show customer the refund amount.\n\n**Returns:**\n- Cancellation policy details\n- Cancellation charges (amount & percentage)\n- Refundable amount\n- Full breakdown of deductions\n- Currency\n- Deadline dates (if applicable)\n\n**Example Response Structure:**\n```json\n{\n  \"cancellationCharge\": 50.00,\n  \"cancellationChargePercentage\": 10,\n  \"refundableAmount\": 467.50,\n  \"currency\": \"USD\",\n  \"breakdown\": {\n    \"totalPaid\": 517.50,\n    \"deductions\": {\n      \"cancellationCharge\": 50.00,\n      \"processingFee\": 0,\n      \"nonRefundableTaxes\": 0\n    },\n    \"finalRefund\": 467.50\n  }\n}\n```\n\n**Workflow:**\n1. Call this endpoint\n2. Show refund breakdown to customer\n3. Use response in Cancel Booking request"
					},  
					"response": []
				},
				{
					"name": "Cancel Booking",
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"cancellationReason\": \"Travel plans changed - need to reschedule\",\n  \"additionalComments\": \"Will book again for next month\",\n  \"refundCalculation\": {\n    \"cancellationCharge\": 50.00,\n    \"cancellationChargePercentage\": 10,\n    \"refundableAmount\": 467.50,\n    \"currency\": \"USD\",\n    \"breakdown\": {\n      \"totalPaid\": 517.50,\n      \"deductions\": {\n        \"cancellationCharge\": 50.00,\n        \"processingFee\": 0,\n        \"nonRefundableTaxes\": 0\n      },\n      \"finalRefund\": 467.50\n    }\n  }\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{baseUrl}}/{{bookingId}}/cancel",
							"host": ["{{baseUrl}}"],
							"path": ["{{bookingId}}", "cancel"]
						},
						"description": "**Cancel booking with Amadeus integration**\n\n**Workflow:**\n1. GET /cancellation-details first to get refund calculation\n2. Use that data in this request\n3. Cancels in Amadeus system\n4. Initiates refund process\n\n**Required Fields:**\n- `cancellationReason`: Why booking is being cancelled (required)\n- `refundCalculation`: Full breakdown from cancellation-details endpoint\n\n**Refund Calculation Fields:**\n- `cancellationCharge`: Fee amount\n- `cancellationChargePercentage`: Fee as % of total\n- `refundableAmount`: Amount to be refunded\n- `currency`: Price currency\n- `breakdown`: Detailed cost breakdown\n  - `totalPaid`: Original booking amount\n  - `deductions`: All fees and charges\n  - `finalRefund`: Net refund amount\n\n**Example:** $517.50 booking with 10% cancellation fee\n- Cancellation charge: $50.00\n- Refund amount: $467.50"
					},  
					"response": []
				},
				{
					"name": "Get Cancellation Status",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/{{bookingId}}/cancellation-status",
							"host": ["{{baseUrl}}"],
							"path": ["{{bookingId}}", "cancellation-status"]
						},
						"description": "**Get cancellation confirmation and refund status**\n\n**Call this AFTER cancelling** to verify cancellation and check refund progress.\n\n**Returns:**\n- Cancellation confirmation\n- Cancellation date/time\n- Cancellation reason (from cancel request)\n- Refund status (PENDING, PROCESSING, COMPLETED, FAILED)\n- Refund amount\n- Estimated refund completion date\n- Amadeus cancellation confirmation\n- Timeline of cancellation events\n\n**Refund Status Values:**\n- `PENDING`: Cancellation submitted, refund not started\n- `PROCESSING`: Refund in progress\n- `COMPLETED`: Refund sent to payment gateway\n- `FAILED`: Refund failed, manual intervention needed\n\n**Use Cases:**\n- Display cancellation confirmation to customer\n- Check refund progress\n- Customer service inquiries\n- Audit trail"
					},  
					"response": []
				}
			]
		}
	],
	"event": [
		{
			"listen": "prerequest",
			"script": {
				"type": "text/javascript",
				"exec": [
					"// Set dynamic timestamp",
					"pm.variables.set('timestamp', Date.now());"
				]
			}
		},
		{
			"listen": "test",
			"script": {
				"type": "text/javascript",
				"exec": [
					"// Global test to check response time",
					"pm.test('Response time is less than 5000ms', function () {",
					"    pm.expect(pm.response.responseTime).to.be.below(5000);",
					"});",
					"",
					"// Check if response is valid JSON",
					"pm.test('Response is valid JSON', function () {",
					"    pm.response.to.be.json;",
					"});"
				]
			}
		}
	],
	"variable": [
		{
			"key": "baseUrl",
			"value": "http://localhost:3002",
			"type": "string"
		},
		{
			"key": "userId",
			"value": "123e4567-e89b-12d3-a456-426614174000",
			"type": "string",
			"description": "User UUID"
		},
		{
			"key": "bookingId",
			"value": "1",
			"type": "string",
			"description": "Booking ID (auto-set after create)"
		},
		{
			"key": "bookingReference",
			"value": "BK-12345678",
			"type": "string",
			"description": "Booking reference code"
		},
		{
			"key": "amadeusOfferId",
			"value": "YOUR_AMADEUS_OFFER_ID",
			"type": "string",
			"description": "Amadeus offer ID from search results"
		},
		{
			"key": "amadeusHotelId",
			"value": "NYCLOND1",
			"type": "string",
			"description": "Amadeus hotel ID (AD* for AVH, alphanumeric for GDS)"
		},
		{
			"key": "officeId",
			"value": "YOUR_OFFICE_ID",
			"type": "string",
			"description": "Office ID for AVH hotel bookings (required for AD* hotels)"
		}
	]
}
