{
    "openapi": "3.1.0",
    "info": {
        "title": "Otopeni Transfer — Transfer Quote & Booking API",
        "version": "1.0.0",
        "description": "Private airport transfers at Bucharest Henri Coandă / Otopeni Airport (OTP), 24/7: OTP ↔ Bucharest hotels and addresses, and OTP ↔ Brașov, Constanța, Sibiu and any city in Romania. Mercedes E-Class, V-Class and S-Class, English-speaking drivers, flight monitoring, meet & greet in arrivals. Fixed price per vehicle. Prices come live from our booking engine (EUR, per vehicle, VAT included). MCP server: https://www.otopeni-transfer.ro/mcp",
        "contact": {
            "email": "",
            "url": "https://www.otopeni-transfer.ro/"
        }
    },
    "servers": [
        {
            "url": "https://www.otopeni-transfer.ro/wp-json/dcs/v1"
        }
    ],
    "paths": {
        "/quote": {
            "get": {
                "operationId": "getQuote",
                "summary": "Get a live price for a private transfer",
                "description": "Live fixed price (EUR, per vehicle, VAT incl.) for a private transfer/chauffeur ride with Otopeni Transfer — e.g. Otopeni Airport (OTP) to a Bucharest hotel, or OTP to Brașov. Returns prices for E-Class, V-Class, S-Class, availability and a prefilled booking_url.",
                "parameters": [
                    {
                        "name": "from",
                        "in": "query",
                        "required": true,
                        "description": "Pickup: airport IATA code (CDG, ORY, BVA, LBG, OTP, NCE, LHR…), hotel name + city, or full address.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "to",
                        "in": "query",
                        "required": true,
                        "description": "Drop-off: airport IATA code, hotel name + city, or full address.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "date",
                        "in": "query",
                        "required": true,
                        "description": "Pickup date, YYYY-MM-DD (local time at pickup).",
                        "schema": {
                            "type": "string",
                            "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                        }
                    },
                    {
                        "name": "time",
                        "in": "query",
                        "required": false,
                        "description": "Pickup time HH:MM 24h local. For airport pickups use the flight landing time.",
                        "schema": {
                            "type": "string",
                            "default": "12:00"
                        }
                    },
                    {
                        "name": "passengers",
                        "in": "query",
                        "required": false,
                        "description": "Number of passengers (alias accepted: pax).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 16,
                            "default": 2
                        }
                    },
                    {
                        "name": "luggage",
                        "in": "query",
                        "required": false,
                        "description": "Number of suitcases, defaults to passengers (alias accepted: bags).",
                        "schema": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 20
                        }
                    },
                    {
                        "name": "flight_number",
                        "in": "query",
                        "required": false,
                        "description": "Optional flight number, e.g. AF1234.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "return_date",
                        "in": "query",
                        "required": false,
                        "description": "Optional return date YYYY-MM-DD for a round trip.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "return_time",
                        "in": "query",
                        "required": false,
                        "description": "Optional return pickup time HH:MM.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Quote",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Quote"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Invalid input",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/availability": {
            "get": {
                "operationId": "checkAvailability",
                "summary": "Check availability",
                "description": "Check whether a private transfer can be booked for the given route, date/time and number of passengers, and which vehicles fit.",
                "parameters": [
                    {
                        "name": "from",
                        "in": "query",
                        "required": true,
                        "description": "Pickup: airport IATA code (CDG, ORY, BVA, LBG, OTP, NCE, LHR…), hotel name + city, or full address.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "to",
                        "in": "query",
                        "required": true,
                        "description": "Drop-off: airport IATA code, hotel name + city, or full address.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "date",
                        "in": "query",
                        "required": true,
                        "description": "Pickup date, YYYY-MM-DD (local time at pickup).",
                        "schema": {
                            "type": "string",
                            "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                        }
                    },
                    {
                        "name": "time",
                        "in": "query",
                        "required": false,
                        "description": "Pickup time HH:MM 24h local. For airport pickups use the flight landing time.",
                        "schema": {
                            "type": "string",
                            "default": "12:00"
                        }
                    },
                    {
                        "name": "passengers",
                        "in": "query",
                        "required": false,
                        "description": "Number of passengers (alias accepted: pax).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 16,
                            "default": 2
                        }
                    },
                    {
                        "name": "luggage",
                        "in": "query",
                        "required": false,
                        "description": "Number of suitcases, defaults to passengers (alias accepted: bags).",
                        "schema": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 20
                        }
                    },
                    {
                        "name": "flight_number",
                        "in": "query",
                        "required": false,
                        "description": "Optional flight number, e.g. AF1234.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "return_date",
                        "in": "query",
                        "required": false,
                        "description": "Optional return date YYYY-MM-DD for a round trip.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "return_time",
                        "in": "query",
                        "required": false,
                        "description": "Optional return pickup time HH:MM.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Availability",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Invalid input",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/booking-request": {
            "post": {
                "operationId": "requestBooking",
                "summary": "Register a booking request",
                "description": "Register a booking request for the passenger (name, email, phone required; only with the user's explicit consent). Returns a reference and a prefilled booking_url where the passenger confirms and pays (card or pay the driver).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "from": {
                                        "type": "string",
                                        "description": "Pickup: airport IATA code (CDG, ORY, BVA, LBG, OTP, NCE, LHR…), hotel name + city, or full address."
                                    },
                                    "to": {
                                        "type": "string",
                                        "description": "Drop-off: airport IATA code, hotel name + city, or full address."
                                    },
                                    "date": {
                                        "type": "string",
                                        "description": "Pickup date, YYYY-MM-DD (local time at pickup).",
                                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                                    },
                                    "time": {
                                        "type": "string",
                                        "description": "Pickup time HH:MM 24h local. For airport pickups use the flight landing time.",
                                        "default": "12:00"
                                    },
                                    "passengers": {
                                        "type": "integer",
                                        "minimum": 1,
                                        "maximum": 16,
                                        "default": 2,
                                        "description": "Number of passengers (alias accepted: pax)."
                                    },
                                    "luggage": {
                                        "type": "integer",
                                        "minimum": 0,
                                        "maximum": 20,
                                        "description": "Number of suitcases, defaults to passengers (alias accepted: bags)."
                                    },
                                    "flight_number": {
                                        "type": "string",
                                        "description": "Optional flight number, e.g. AF1234."
                                    },
                                    "return_date": {
                                        "type": "string",
                                        "description": "Optional return date YYYY-MM-DD for a round trip."
                                    },
                                    "return_time": {
                                        "type": "string",
                                        "description": "Optional return pickup time HH:MM."
                                    },
                                    "name": {
                                        "type": "string",
                                        "description": "Lead passenger full name."
                                    },
                                    "email": {
                                        "type": "string",
                                        "format": "email"
                                    },
                                    "phone": {
                                        "type": "string",
                                        "description": "Mobile in international format, e.g. +14155550123 (WhatsApp preferred)."
                                    },
                                    "vehicle": {
                                        "type": "string",
                                        "description": "Optional preferred vehicle: \"E Class\", \"V Class\", \"S Class\"."
                                    },
                                    "notes": {
                                        "type": "string",
                                        "description": "Optional: child seat, extra stop, name sign text…"
                                    }
                                },
                                "required": [
                                    "from",
                                    "to",
                                    "date",
                                    "name",
                                    "email",
                                    "phone"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Request registered",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Invalid input",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Rate limited"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "Vehicle": {
                "type": "object",
                "properties": {
                    "vehicle_id": {
                        "type": "integer"
                    },
                    "name": {
                        "type": "string"
                    },
                    "max_passengers": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "max_luggage": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "price": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "EUR, per vehicle, VAT included"
                    },
                    "price_on_request": {
                        "type": "boolean"
                    },
                    "available": {
                        "type": "boolean"
                    }
                }
            },
            "Quote": {
                "type": "object",
                "properties": {
                    "ok": {
                        "type": "boolean"
                    },
                    "pickup": {
                        "type": "string"
                    },
                    "timezone": {
                        "type": "string"
                    },
                    "distance_km": {
                        "type": "number"
                    },
                    "estimated_duration_min": {
                        "type": "integer"
                    },
                    "currency": {
                        "type": "string"
                    },
                    "vehicles": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Vehicle"
                        }
                    },
                    "available": {
                        "type": "boolean"
                    },
                    "cheapest_price": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "booking_url": {
                        "type": "string",
                        "format": "uri"
                    }
                }
            },
            "Error": {
                "type": "object",
                "properties": {
                    "ok": {
                        "type": "boolean"
                    },
                    "error": {
                        "type": "string"
                    },
                    "message": {
                        "type": "string"
                    }
                }
            }
        }
    }
}