{"openapi":"3.1.0","info":{"title":"Closer Public API","version":"1.1.0","description":"Machine-readable API contract for Closer chauffeur booking, pricing estimation, and agent integrations. Human travelers should use https://www.closerchauffeur.com/booking for the full UI flow."},"servers":[{"url":"https://www.closerchauffeur.com"}],"tags":[{"name":"booking","description":"Booking flow endpoints"},{"name":"pricing","description":"Distance, ETA, and price estimation"},{"name":"places","description":"Address autocomplete"},{"name":"trust","description":"Public reputation data"},{"name":"agent","description":"Agent/MCP integration endpoints"}],"paths":{"/api/calculate-distance":{"get":{"tags":["pricing"],"summary":"Calculate trip distance and ETA","description":"Returns route distance (km), duration (seconds), estimated arrival, and Zone A flag for Vienna-area trips.","parameters":[{"name":"from","in":"query","required":true,"schema":{"type":"string"}},{"name":"to","in":"query","required":true,"schema":{"type":"string"}},{"name":"fromPlaceId","in":"query","required":false,"schema":{"type":"string"}},{"name":"toPlaceId","in":"query","required":false,"schema":{"type":"string"}},{"name":"pickupDatetime","in":"query","required":false,"schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Distance and ETA","content":{"application/json":{"schema":{"type":"object","properties":{"distance":{"type":["number","null"],"description":"Distance in km"},"estimatedArrival":{"type":["string","null"],"format":"date-time"},"duration":{"type":["number","null"],"description":"Duration in seconds"},"inZoneA":{"type":["boolean","null"],"description":"True if pickup or drop-off is within 25 km of Vienna center"},"error":{"type":"string"}}}}}},"400":{"description":"Missing from/to parameters"}}}},"/api/places-autocomplete":{"get":{"tags":["places"],"summary":"Autocomplete address suggestions","parameters":[{"name":"input","in":"query","required":true,"schema":{"type":"string","minLength":2}}],"responses":{"200":{"description":"Place suggestions","content":{"application/json":{"schema":{"type":"object","properties":{"suggestions":{"type":"array","items":{"type":"object","properties":{"placePrediction":{"type":"object","properties":{"placeId":{"type":"string"},"text":{"type":"object","properties":{"text":{"type":"string"}}},"types":{"type":"array","items":{"type":"string"}}}}}}}}}}}}}}},"/api/create-checkout-session":{"post":{"tags":["booking"],"summary":"Create Stripe checkout session","description":"Creates a hosted Stripe Checkout session. Amount is in EUR cents (gross, incl. VAT).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["amount","bookingData"],"properties":{"amount":{"type":"integer","minimum":1,"description":"Amount in cents"},"bookingData":{"type":"object","required":["from","to"],"properties":{"from":{"type":"string"},"to":{"type":"string"},"pickupDatetime":{"type":"string","format":"date-time"},"estimatedArrival":{"type":"string","format":"date-time"},"distanceKm":{"type":"number"},"vehicleClass":{"type":"string","enum":["executive","first","business-van"]},"bookingType":{"type":"string","enum":["distance","hourly"]},"durationHours":{"type":"number"},"priceEur":{"type":"number"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"phone":{"type":"string"},"locale":{"type":"string","enum":["de","en"]},"notes":{"type":"string"},"flightNumber":{"type":"string"},"waterChoice":{"type":"string"},"tourName":{"type":"string"},"flightData":{"type":"object","additionalProperties":true}}}}}}}},"responses":{"200":{"description":"Checkout session details","content":{"application/json":{"schema":{"type":"object","properties":{"sessionId":{"type":"string"},"url":{"type":"string","format":"uri"}}}}}},"400":{"description":"Invalid amount or booking data"},"500":{"description":"Stripe not configured or checkout failed"}}}},"/api/create-payment-intent":{"post":{"tags":["booking"],"summary":"Create Stripe payment intent (legacy card flow)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["amount"],"properties":{"amount":{"type":"integer","minimum":1,"description":"Amount in cents"}}}}}},"responses":{"200":{"description":"Payment intent client secret","content":{"application/json":{"schema":{"type":"object","properties":{"clientSecret":{"type":"string"}}}}}}}}},"/api/get-session-data":{"get":{"tags":["booking"],"summary":"Get booking confirmation details from Stripe session","parameters":[{"name":"session_id","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Booking data","content":{"application/json":{"schema":{"type":"object","properties":{"bookingData":{"type":"object","additionalProperties":true}}}}}}}}},"/api/google-rating":{"get":{"tags":["trust"],"summary":"Get Google Business rating and recent reviews","responses":{"200":{"description":"Rating snapshot","content":{"application/json":{"schema":{"type":"object","properties":{"rating":{"type":["number","null"]},"userRatingCount":{"type":["integer","null"]},"reviews":{"type":"array","items":{"type":"object","properties":{"authorName":{"type":"string"},"rating":{"type":["number","null"]},"text":{"type":"string"},"relativeTimeDescription":{"type":"string"}}}}}}}}}}}},"/api/mcp":{"get":{"tags":["agent"],"summary":"MCP endpoint capabilities","responses":{"200":{"description":"MCP server metadata and tools","content":{"application/json":{"schema":{"type":"object","properties":{"protocol":{"type":"string"},"server":{"type":"string"},"version":{"type":"string"},"tools":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","enum":["booking.estimate_distance","booking.check_availability","booking.calculate_price","places.autocomplete","booking.create_checkout"]},"description":{"type":"string"},"inputSchema":{"type":"object"},"requiredScope":{"type":"string"}}}}}}}}}}},"post":{"tags":["agent"],"summary":"MCP JSON-RPC transport endpoint","description":"Supports `tools/list` and `tools/call`. Read tools require `booking.read`; `booking.create_checkout` requires `booking.write`.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","enum":["2.0"]},"id":{},"method":{"type":"string","enum":["tools/list","tools/call"]},"params":{"type":"object","additionalProperties":true}}}}}},"responses":{"200":{"description":"JSON-RPC result"},"400":{"description":"JSON-RPC error response"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"Token","description":"Agent token from AGENT_API_TOKENS_JSON. Scopes: booking.read (estimate, price, autocomplete), booking.write (checkout)."}}}}