{"openapi":"3.1.0","info":{"title":"Meridian Air booking simulator","version":"0.2.0","description":"Synthetic airline operations for Maven test-agent-20260930. All payments and refunds are simulated. Dates follow a controllable virtual clock. Authentication binds tools to the fictional Alex Morgan passenger; client-supplied identity is rejected. Mutation confirmation records consent but the agent must obtain it from the passenger."},"security":[{"AgentKey":[]}],"components":{"securitySchemes":{"AgentKey":{"type":"http","scheme":"bearer","description":"Use agentKey from local data/keys.json, never operatorKey."}}},"paths":{"/api/context":{"get":{"operationId":"getTravelContext","description":"Read the virtual current date and authorized demo passenger before interpreting relative dates.","parameters":[{"name":"X-Demo-Session","in":"header","required":true,"schema":{"type":"string"},"description":"Operator-created isolated demo session, initially boss-demo."}],"responses":{"200":{"description":"Structured simulator result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or incorrect agent key"},"404":{"description":"Session or resource not found"},"409":{"description":"Business rule or inventory conflict"},"504":{"description":"Outcome uncertain: read booking state before retrying with the same key"}}}},"/api/bookings":{"get":{"operationId":"listPassengerBookings","description":"List the authorized passenger bookings.","parameters":[{"name":"X-Demo-Session","in":"header","required":true,"schema":{"type":"string"},"description":"Operator-created isolated demo session, initially boss-demo."}],"responses":{"200":{"description":"Structured simulator result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or incorrect agent key"},"404":{"description":"Session or resource not found"},"409":{"description":"Business rule or inventory conflict"},"504":{"description":"Outcome uncertain: read booking state before retrying with the same key"}}}},"/api/bookings/{reference}":{"get":{"operationId":"getBooking","description":"Read authoritative booking state, including after a timeout.","parameters":[{"name":"X-Demo-Session","in":"header","required":true,"schema":{"type":"string"},"description":"Operator-created isolated demo session, initially boss-demo."},{"name":"reference","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":200}}],"responses":{"200":{"description":"Structured simulator result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or incorrect agent key"},"404":{"description":"Session or resource not found"},"409":{"description":"Business rule or inventory conflict"},"504":{"description":"Outcome uncertain: read booking state before retrying with the same key"}}}},"/api/flights/search":{"post":{"operationId":"searchFlights","description":"Find available direct or one-stop itineraries. Quotes do not reserve seats. arriveBy is a UTC ISO datetime.","parameters":[{"name":"X-Demo-Session","in":"header","required":true,"schema":{"type":"string"},"description":"Operator-created isolated demo session, initially boss-demo."}],"responses":{"200":{"description":"Structured simulator result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or incorrect agent key"},"404":{"description":"Session or resource not found"},"409":{"description":"Business rule or inventory conflict"},"504":{"description":"Outcome uncertain: read booking state before retrying with the same key"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"origin":{"type":"string","pattern":"^[A-Z]{3}$"},"destination":{"type":"string","pattern":"^[A-Z]{3}$"},"arriveBy":{"type":"string","format":"date-time"}},"required":["origin","destination"]}}}}}},"/api/rebooking/quote":{"post":{"operationId":"quoteDisruptionRecovery","description":"Get an expiring no-fee quote for an airline-disrupted booking. This prototype does not handle voluntary changes.","parameters":[{"name":"X-Demo-Session","in":"header","required":true,"schema":{"type":"string"},"description":"Operator-created isolated demo session, initially boss-demo."}],"responses":{"200":{"description":"Structured simulator result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or incorrect agent key"},"404":{"description":"Session or resource not found"},"409":{"description":"Business rule or inventory conflict"},"504":{"description":"Outcome uncertain: read booking state before retrying with the same key"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"reference":{"type":"string","minLength":1,"maxLength":200},"flights":{"type":"array","items":{"type":"string","minLength":1,"maxLength":200},"minItems":1,"maxItems":2}},"required":["reference","flights"]}}}}}},"/api/rebooking/commit":{"post":{"operationId":"confirmDisruptionRecovery","description":"After passenger confirmation, apply a quote with atomic inventory checks. Read the booking after success or timeout. Reuse the same key and quote on retries.","parameters":[{"name":"X-Demo-Session","in":"header","required":true,"schema":{"type":"string"},"description":"Operator-created isolated demo session, initially boss-demo."}],"responses":{"200":{"description":"Structured simulator result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or incorrect agent key"},"404":{"description":"Session or resource not found"},"409":{"description":"Business rule or inventory conflict"},"504":{"description":"Outcome uncertain: read booking state before retrying with the same key"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"quoteId":{"type":"string","minLength":1,"maxLength":200},"confirmed":{"type":"boolean","const":true},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}},"required":["quoteId","confirmed","idempotencyKey"]}}}}}},"/api/booking/quote":{"post":{"operationId":"quoteNewBooking","description":"Compare basic, standard, or flex fares. Returns a price in minor units (cents), not a reservation.","parameters":[{"name":"X-Demo-Session","in":"header","required":true,"schema":{"type":"string"},"description":"Operator-created isolated demo session, initially boss-demo."}],"responses":{"200":{"description":"Structured simulator result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or incorrect agent key"},"404":{"description":"Session or resource not found"},"409":{"description":"Business rule or inventory conflict"},"504":{"description":"Outcome uncertain: read booking state before retrying with the same key"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"origin":{"type":"string","pattern":"^[A-Z]{3}$"},"destination":{"type":"string","pattern":"^[A-Z]{3}$"},"flights":{"type":"array","items":{"type":"string","minLength":1,"maxLength":200},"minItems":1,"maxItems":2},"fare":{"type":"string","enum":["basic","standard","flex"]}},"required":["origin","destination","flights","fare"]}}}}}},"/api/booking/hold":{"post":{"operationId":"holdSeats","description":"Reserve one seat on each quoted flight for ten virtual minutes. Use a stable key per hold.","parameters":[{"name":"X-Demo-Session","in":"header","required":true,"schema":{"type":"string"},"description":"Operator-created isolated demo session, initially boss-demo."}],"responses":{"200":{"description":"Structured simulator result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or incorrect agent key"},"404":{"description":"Session or resource not found"},"409":{"description":"Business rule or inventory conflict"},"504":{"description":"Outcome uncertain: read booking state before retrying with the same key"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"quoteId":{"type":"string","minLength":1,"maxLength":200},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}},"required":["quoteId","idempotencyKey"]}}}}}},"/api/booking/confirm":{"post":{"operationId":"confirmNewBooking","description":"After explicit passenger acceptance of itinerary and price, convert a hold into a booking. Payment is simulated.","parameters":[{"name":"X-Demo-Session","in":"header","required":true,"schema":{"type":"string"},"description":"Operator-created isolated demo session, initially boss-demo."}],"responses":{"200":{"description":"Structured simulator result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or incorrect agent key"},"404":{"description":"Session or resource not found"},"409":{"description":"Business rule or inventory conflict"},"504":{"description":"Outcome uncertain: read booking state before retrying with the same key"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"holdId":{"type":"string","minLength":1,"maxLength":200},"confirmed":{"type":"boolean","const":true},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}},"required":["holdId","confirmed","idempotencyKey"]}}}}}},"/api/booking/cancel":{"post":{"operationId":"cancelBooking","description":"After explicit confirmation cancel a booking and release inventory. Disrupted and flex bookings receive a simulated refund; other fares receive none.","parameters":[{"name":"X-Demo-Session","in":"header","required":true,"schema":{"type":"string"},"description":"Operator-created isolated demo session, initially boss-demo."}],"responses":{"200":{"description":"Structured simulator result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or incorrect agent key"},"404":{"description":"Session or resource not found"},"409":{"description":"Business rule or inventory conflict"},"504":{"description":"Outcome uncertain: read booking state before retrying with the same key"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"reference":{"type":"string","minLength":1,"maxLength":200},"confirmed":{"type":"boolean","const":true},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}},"required":["reference","confirmed","idempotencyKey"]}}}}}}},"servers":[{"url":"https://maven-hoshor.blue-decibel.ts.net"}]}