{"openapi":"3.1.0","info":{"title":"PremiseBay API","version":"1.0.0","description":"Which inspections a US building legally owes, when, and booking licensed pros to do them. /v1/plan is public. Everything else needs a Pro API key (Pro is $12 per building a month) sent as Authorization: Bearer pb_live_... Rate limits: 60 requests a minute per IP on /v1/plan, 30 bookings an hour per account. Errors are JSON with a sentence in \"error\" and a stable \"code\"."},"servers":[{"url":"https://www.premisebay.com/api"}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"A Pro API key from Settings, beginning pb_live_."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error"]},"Equipment":{"type":"object","required":["serviceId"],"properties":{"serviceId":{"type":"string","enum":["fire-extinguisher-inspection","fire-sprinkler-inspection","fire-alarm-inspection","kitchen-suppression-inspection","kitchen-hood-cleaning","grease-trap-cleaning","backflow-testing","boiler-inspection"]},"quantity":{"type":"integer","minimum":1},"variant":{"type":"string"},"lastDone":{"type":"string","format":"date"}}}}},"paths":{"/v1/plan":{"post":{"summary":"Obligations for a building","description":"Each legally required inspection for the place and equipment given, with interval, the rule and its sources, who may do it, how filing works and the next due date.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["state","equipment"],"properties":{"state":{"type":"string","example":"TX"},"city":{"type":"string","example":"Austin"},"equipment":{"type":"array","items":{"$ref":"#/components/schemas/Equipment"}}}},"example":{"state":"TX","city":"Houston","equipment":[{"serviceId":"backflow-testing","quantity":1,"lastDone":"2025-11-01"}]}}}},"responses":{"200":{"description":"The plan."},"400":{"description":"Invalid input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited."}}}},"/v1/sites":{"get":{"summary":"List sites with obligations","security":[{"apiKey":[]}],"responses":{"200":{"description":"Sites."},"401":{"description":"No or bad key."}}},"post":{"summary":"Add a site","security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"example":{"name":"Main St store","state":"TX","city":"Dallas","zip":"75201","businessType":"retail","equipment":[{"serviceId":"fire-extinguisher-inspection","quantity":6}]}}}},"responses":{"201":{"description":"Created."},"400":{"description":"Invalid input."},"402":{"description":"Site limit on the free plan."}}}},"/v1/sites/{id}":{"get":{"summary":"One site: obligations, records and open bookings","security":[{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The site."},"404":{"description":"Not on this account."}}}},"/v1/pros":{"get":{"summary":"Verified pros for a job","security":[{"apiKey":[]}],"parameters":[{"name":"siteId","in":"query","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"serviceId","in":"query","required":true,"schema":{"type":"string","enum":["fire-extinguisher-inspection","fire-sprinkler-inspection","fire-alarm-inspection","kitchen-suppression-inspection","kitchen-hood-cleaning","grease-trap-cleaning","backflow-testing","boiler-inspection"]}},{"name":"quantity","in":"query","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Pros, cheapest first, with the price for this job."}}}},"/v1/bookings":{"get":{"summary":"List bookings","security":[{"apiKey":[]}],"responses":{"200":{"description":"Bookings."}}},"post":{"summary":"Book a service","description":"Offer the job to one pro (vendorId) or to every matching pro. With no pro covering the site, the booking is stored with status unfilled.","security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"example":{"siteId":"uuid","serviceId":"backflow-testing","windowStart":"2026-11-02","windowEnd":"2026-11-20","quantity":1}}}},"responses":{"201":{"description":"Booked."},"400":{"description":"Invalid input."},"409":{"description":"An open booking already exists for that service."}}}},"/v1/bookings/{id}":{"get":{"summary":"One booking","security":[{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The booking."}}}},"/v1/bookings/{id}/cancel":{"post":{"summary":"Cancel a booking","security":[{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Cancelled."},"409":{"description":"Already completed."}}}}}}