{"openapi":"3.1.0","info":{"title":"Luna the Dental Vets booking API","version":"1.0.0","description":"Book a dental appointment for a dog or cat at Luna the Dental Vets (UK). Public, no key. Agree the details with the pet's owner before booking. The same service is available as an MCP server at /mcp.","contact":{"name":"Luna the Dental Vets","url":"https://luna.pet"}},"servers":[{"url":"https://luna.pet"}],"paths":{"/api/booking/options":{"get":{"operationId":"listClinicsAndServices","summary":"Clinics and appointment types","responses":{"200":{"description":"Clinics, appointment types, prices and booking rules","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/booking/slots":{"get":{"operationId":"findAvailableSlots","summary":"Free times at a clinic","parameters":[{"name":"clinic","in":"query","required":true,"schema":{"type":"string"},"example":"bristol"},{"name":"type","in":"query","required":true,"schema":{"type":"string"},"example":"free_check"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":28},"description":"Days from today to start looking"}],"responses":{"200":{"description":"Days with free times","content":{"application/json":{"schema":{"type":"object","properties":{"days":{"type":"array","items":{"type":"object","properties":{"iso":{"type":"string","description":"YYYY-MM-DD"},"label":{"type":"string"},"times":{"type":"array","items":{"type":"string","description":"HH:MM"}}}}},"elsewhere":{"type":"array","items":{"type":"object"}}}}}}},"400":{"description":"Clinic or type not bookable","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/api/booking/agent":{"post":{"operationId":"bookAppointment","summary":"Book an appointment","description":"Places a real booking in Luna's diary. Only after the owner has agreed the clinic, day, time and details. Use a date and time exactly as /api/booking/slots returned them.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["clinic","appointment_type","date","time","pet_name","owner_name","email","phone"],"properties":{"clinic":{"type":"string","example":"bristol"},"appointment_type":{"type":"string","example":"free_check"},"date":{"type":"string","description":"YYYY-MM-DD"},"time":{"type":"string","description":"HH:MM"},"pet_name":{"type":"string"},"species":{"type":"string","enum":["dog","cat"]},"breed":{"type":"string"},"owner_name":{"type":"string"},"email":{"type":"string"},"phone":{"type":"string"},"usual_vet":{"type":"string","description":"The pet's usual vet practice; required for anything but free_check (\"none\" if they have none)"},"notes":{"type":"string","description":"Symptoms, age, anything the clinic should know"},"booked_by":{"type":"string","description":"The assistant's name"}}}}}},"responses":{"200":{"description":"Booked (confirmed) or requested (the clinic confirms)","content":{"application/json":{"schema":{"type":"object","properties":{"reference":{"type":"string"},"status":{"type":"string","enum":["confirmed","requested"]},"appointment":{"type":"string"},"when":{"type":"string"},"clinic":{"type":"object"},"next":{"type":"string","description":"What to tell the owner"}}}}}},"400":{"description":"Missing or invalid details, or the time is not free; `message` says what to do","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Too many bookings; try again in a few minutes","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}}}}