{"openapi":"3.1.0","info":{"title":"Bye Radon Booking API","version":"1.0.0","description":"Read Bye Radon (radon testing\/mitigation, Airdrie & Calgary AB) business\/pricing data and create a real confirmed appointment for a free radon test or an on-site mitigation quote."},"servers":[{"url":"https:\/\/byeradon.ca\/wp-json\/byeradon\/v1"}],"paths":{"\/info":{"get":{"operationId":"getBusinessInfo","summary":"Get business facts, pricing, and links","responses":{"200":{"description":"OK"}}}},"\/services":{"get":{"operationId":"listServices","summary":"List bookable services (test_short, quote) with required fields and rules","responses":{"200":{"description":"OK"}}}},"\/availability":{"get":{"operationId":"checkAvailability","summary":"Get real open appointment slots for a service and date range","parameters":[{"name":"service","in":"query","required":true,"schema":{"type":"string","enum":["test_short","quote"]}},{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid request"},"429":{"description":"Rate limited"}}}},"\/bookings":{"post":{"operationId":"createBooking","summary":"Create a real confirmed appointment. Always call checkAvailability first and use an exact returned date\/start.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["service","customer","property","slot"],"properties":{"service":{"type":"string","enum":["test_short","quote"]},"customer":{"type":"object","required":["name","email","phone"],"properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"phone":{"type":"string"}}},"property":{"type":"object","required":["address","city"],"properties":{"address":{"type":"string"},"city":{"type":"string"},"postal_code":{"type":"string"}}},"slot":{"type":"object","required":["date","start"],"description":"Must be an exact {date, start} pair returned by checkAvailability.","properties":{"date":{"type":"string","format":"date"},"start":{"type":"string"}}},"pickup":{"type":"object","description":"Required only when service=test_short; must be >=48h after slot.","properties":{"date":{"type":"string","format":"date"},"start":{"type":"string"}}},"external_ref":{"type":"string"}}}}}},"responses":{"201":{"description":"Booking created"},"400":{"description":"Invalid request"},"429":{"description":"Rate limited"}}}},"\/bookings\/{reference}":{"get":{"operationId":"getBooking","summary":"Look up a booking by reference","parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"\/bookings\/{reference}\/cancel":{"post":{"operationId":"cancelBooking","summary":"Cancel a booking. The email must match the one used to create it.","parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"}}}}}},"responses":{"200":{"description":"Cancelled"},"403":{"description":"Not authorized"}}}}}}