{"openapi":"3.1.0","info":{"title":"Sydney Local Pest Control query API","version":"1.1.0","description":"Read-only services, approximate coverage, quotes and live arrival windows. No customer data is accepted or returned. Agents cannot create bookings. Booking links lead to customer review on the existing website; these queries do not verify whether booking submissions are enabled. Maintenance or other controls may prevent booking even when inventory windows or a price are returned. Prices are integer AUD cents including GST; no payment or reservation is made by these endpoints. Total amounts include GST and applicable mandatory fees; quote.lineItems amounts exclude GST and are explicitly labelled. Canonical /api/v1/ endpoints have trailing slashes."},"servers":[{"url":"https://sydney.lcpest.com.au"}],"paths":{"/api/v1/next-availability/":{"get":{"operationId":"get_next_availability","description":"Search one to seven consecutive Sydney calendar days using one shared inventory read. Results expire after 15 seconds. Null nextAvailable means no window in this search range only. Arrival, not treatment duration or a reservation. Errors must not be interpreted as fully booked. Supply postcode or suburb; ambiguous names require a postcode. Canonical endpoint URLs end in a slash to avoid platform redirects. Pass applicable property.* selections to obtain the GST-inclusive total for the earliest checked window in the same call. Missing selections return pricing.status=selection_required with requiredFields, never a guessed minimum. Quote calculation uses the existing pricing engine; no second inventory read or booking is made.","parameters":[{"name":"serviceId","in":"query","required":true,"schema":{"type":"string","enum":["gp","german_cockroach","bed_bug_flea","rodent","bee_wasp","termite_inspection","commercial_gp"]}},{"name":"propertyType","in":"query","required":true,"schema":{"type":"string","enum":["house","duplex","townhouse_villa","apartment_unit","commercial"]}},{"name":"postcode","in":"query","required":false,"schema":{"type":"string","maxLength":80,"description":"Four-digit NSW postcode or a recognized locality such as Ryde NSW 2112. Ryde resolves to street postcode 2112 and West-Ryde to 2114. Other ambiguous locality names require a postcode."}},{"name":"suburb","in":"query","required":false,"schema":{"type":"string","maxLength":100}},{"name":"categoryId","in":"query","required":false,"schema":{"type":"string","enum":["end_of_lease"],"description":"Only with residential gp. Omit for ordinary services."}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","maxLength":80,"description":"en, zh-Hant or ko. Other language tags fall back to English."}},{"name":"startDate","in":"query","required":false,"schema":{"type":"string","format":"date","description":"Australia/Sydney calendar date, today through 30 days ahead."}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":7,"default":7}},{"name":"src","in":"query","required":false,"schema":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9._-]{0,63}$","description":"Optional self-declared channel, e.g. chatgpt, gemini or same-day. Unauthenticated attribution only, not proof of an AI quote or referral."}},{"name":"paymentMethod","in":"query","required":false,"schema":{"type":"string","enum":["online","in_person"],"default":"online"}},{"name":"property.propertyType","in":"query","required":false,"schema":{"type":"string","enum":["house","duplex","townhouse_villa","apartment_unit","commercial"]}},{"name":"property.specializedPropertyClass","in":"query","required":false,"schema":{"type":"string","enum":["house","apartment_unit"]}},{"name":"property.landAreaBand","in":"query","required":false,"schema":{"type":"string","enum":["under_350","350_500","501_750","751_1000","1001_1250","1251_1500","1501_2000","2001_3000","over_3000"]}},{"name":"property.bedroomsBand","in":"query","required":false,"schema":{"type":"string","enum":["up_to_3","4_6","7_9","10_plus","4","5","6_plus"]}},{"name":"property.apartmentSize","in":"query","required":false,"schema":{"type":"string","enum":["studio_1_bed","2_bed","3_bed","4_bed","5_plus_bed"]}},{"name":"property.floorAreaBand","in":"query","required":false,"schema":{"type":"string","enum":["0_25","26_50","51_75","76_100","101_150","151_200","201_300","301_400","over_400"]}},{"name":"property.businessCategory","in":"query","required":false,"schema":{"type":"string","enum":["retail_office","beauty_salon","gym","non_food_warehouse","supermarket_grocery","restaurant","cafe_takeaway","food_production"]}},{"name":"property.storeys","in":"query","required":false,"schema":{"type":"string","enum":["1","2","3_plus"]}},{"name":"property.grannyFlat","in":"query","required":false,"schema":{"type":"string","enum":["none","1_bed","2_bed","3_bed"]}},{"name":"property.treatmentScope","in":"query","required":false,"schema":{"type":"string","enum":["full","indoor_only","outdoor_only"]}},{"name":"property.needsLateEvening","in":"query","required":false,"schema":{"type":"string","enum":["yes","no"]}},{"name":"property.addonGermanCockroach","in":"query","required":false,"schema":{"type":"string","enum":["yes","no"]}},{"name":"property.addonRodent","in":"query","required":false,"schema":{"type":"string","enum":["yes","no"]}},{"name":"property.addonTermite","in":"query","required":false,"schema":{"type":"string","enum":["yes","no"]}},{"name":"property.addonBedBugFlea","in":"query","required":false,"schema":{"type":"string","enum":["no"]}},{"name":"property.specializedBedrooms","in":"query","required":false,"schema":{"type":"string","pattern":"^[1-9][0-9]{0,3}$"}}],"responses":{"200":{"description":"Successful read-only result. No slot is reserved.","content":{"application/json":{"schema":{"type":"object","required":["startDate","days","dates","searchedThrough","nextAvailable","available","checkedAt","expiresAt","reserved","bookingAdmission","bookingUrl","prefill","pricing","customerSummary"],"properties":{"startDate":{"type":"string","format":"date","description":"Australia/Sydney calendar date, today through 30 days ahead."},"days":{"type":"integer","minimum":1,"maximum":7},"searchedThrough":{"type":"string","format":"date","description":"Australia/Sydney calendar date, today through 30 days ahead."},"dates":{"type":"array","maxItems":7,"items":{"type":"object","required":["date","windows"],"properties":{"date":{"type":"string","format":"date","description":"Australia/Sydney calendar date, today through 30 days ahead."},"windows":{"type":"array","items":{"$ref":"#/components/schemas/ArrivalWindow"}}}}},"nextAvailable":{"anyOf":[{"allOf":[{"$ref":"#/components/schemas/ArrivalWindow"},{"type":"object","required":["date"],"properties":{"date":{"type":"string","format":"date","description":"Australia/Sydney calendar date, today through 30 days ahead."}}}]},{"type":"null"}]},"available":{"type":"boolean"},"continueFrom":{"anyOf":[{"type":"string","format":"date","description":"Australia/Sydney calendar date, today through 30 days ahead."},{"type":"null"}],"description":"Next unchecked date when the searched range is empty and a further date remains inside 30 days."},"timezone":{"const":"Australia/Sydney"},"checkedAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"coverage":{"$ref":"#/components/schemas/Coverage"},"reserved":{"const":false},"bookingAdmission":{"$ref":"#/components/schemas/BookingAdmission"},"bookingUrl":{"type":"string","format":"uri","description":"Customer website review link. Its presence does not verify that booking submissions are currently enabled."},"prefill":{"$ref":"#/components/schemas/Prefill"},"customerSummary":{"type":"string","description":"Safe to relay for this checked result only, not a cached same-day promise. Respects lang; includes GST/applicable fees when a total can be calculated."},"pricing":{"type":"object","required":["status","quoteRequired","currency","amountUnit","gstIncluded"],"properties":{"status":{"type":"string","enum":["quoted","selection_required","manual_quote_required","no_window"]},"quoteRequired":{"type":"boolean"},"totalCents":{"type":"integer","description":"AUD cents. Divide by 100 for display only."},"quote":{"type":"object","required":["totalCents","subtotalExGstCents","gstCents","lineItems","lineItemsAmountBasis","totalAmountBasis"],"properties":{"totalCents":{"type":"integer","description":"AUD cents. Divide by 100 for display only."},"subtotalExGstCents":{"type":"integer","description":"AUD cents. Divide by 100 for display only."},"gstCents":{"type":"integer","description":"AUD cents. Divide by 100 for display only."},"lineItemsAmountBasis":{"const":"excluding_gst"},"totalAmountBasis":{"const":"including_gst_and_applicable_mandatory_fees"},"lineItems":{"type":"array","items":{"type":"object","required":["id","label","amountCents"],"properties":{"id":{"type":"string"},"label":{"type":"string"},"amountCents":{"type":"integer","description":"AUD cents. Divide by 100 for display only."}}}},"warrantyMonths":{"type":"integer","minimum":0},"warrantyLabel":{"type":"string"},"warrantyItems":{"type":"array","items":{"type":"object","additionalProperties":true}},"gpAddonCount":{"type":"integer","minimum":0},"gpAddonIds":{"type":"array","items":{"type":"string"}},"gpAddonBundlePercentage":{"type":"number"},"payOnSiteNotes":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"}},"manualQuoteRequired":{"const":false}}},"reasons":{"type":"array","items":{"type":"string"}},"requiredFields":{"type":"array","items":{"type":"string"}},"currency":{"const":"AUD"},"amountUnit":{"const":"cents"},"gstIncluded":{"const":true}}}}}}}},"400":{"description":"Invalid or unsupported selections; correct the request.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"field":{"type":"string"},"allowedValues":{"type":"array","items":{"type":["string","integer"]}},"requiredFields":{"type":"array","items":{"type":"string"}}},"required":["error"]},"example":{"error":"Choose valid selections.","code":"invalid_input"}}}},"429":{"description":"Rate limited; obey Retry-After.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"field":{"type":"string"},"allowedValues":{"type":"array","items":{"type":["string","integer"]}},"requiredFields":{"type":"array","items":{"type":"string"}}},"required":["error"]},"example":{"error":"Too many queries. Please retry shortly.","code":"rate_limited"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying; do not retry in a tight loop.","schema":{"type":"integer","example":60}}}},"503":{"description":"Verification temporarily unavailable; do not infer availability.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"field":{"type":"string"},"allowedValues":{"type":"array","items":{"type":["string","integer"]}},"requiredFields":{"type":"array","items":{"type":"string"}}},"required":["error"]},"example":{"error":"Availability could not be verified. Please try again.","code":"availability_unavailable"}}}}}}},"/api/v1/business/":{"get":{"operationId":"get_business","responses":{"200":{"description":"Successful read-only result. No slot is reserved.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"required":["supportsAgentBooking","bookingAdmission","name","legalEntity","website","currency","timezone","coverage","arrivalHours","capabilities"],"properties":{"supportsAgentBooking":{"const":false},"bookingUrl":{"type":"string","format":"uri","description":"Customer website review link. Its presence does not verify that booking submissions are currently enabled."},"bookingAdmission":{"$ref":"#/components/schemas/BookingAdmission"},"name":{"type":"string"},"legalEntity":{"type":"string"},"abn":{"type":"string"},"email":{"type":"string","format":"email"},"telephone":{"type":"string","description":"Public contact number. No staffed telephone hours are promised by this API."},"website":{"type":"string","format":"uri"},"whatsappUrl":{"type":"string","format":"uri"},"timezone":{"const":"Australia/Sydney"},"currency":{"const":"AUD"},"gstIncluded":{"const":true},"coverage":{"type":"object","required":["centreName","radiusKm","toleranceKm","method"],"properties":{"centreName":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"radiusKm":{"const":23},"toleranceKm":{"const":3},"method":{"const":"approximate_locality_coordinates"},"source":{"type":"string","format":"uri"}},"description":"Coverage centre, not an office address. Postcode/suburb coordinates are approximate."},"arrivalHours":{"type":"object","required":["standard","apartment"],"properties":{"standard":{"type":"string"},"apartment":{"type":"string"}},"description":"Possible arrival hours only; date restrictions, cutoff, evening pricing and live capacity still apply."},"arrivalPolicy":{"type":"string"},"sameDay":{"type":"string"},"policyVersion":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string","enum":["services","service_areas","quote","availability","next_availability"]}},"openapiUrl":{"type":"string","format":"uri"},"sameDayUrgentFeeCents":{"type":"integer","description":"AUD cents. Divide by 100 for display only."}}}}}}}}},"/api/v1/services/":{"get":{"operationId":"get_services","responses":{"200":{"description":"Successful read-only result. No slot is reserved.","content":{"application/json":{"schema":{"type":"object","required":["services","bookingAdmission"],"properties":{"bookingAdmission":{"$ref":"#/components/schemas/BookingAdmission"},"services":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"startingPriceCents":{"type":"integer"},"priceBasis":{"type":"string"},"bookingUrl":{"type":"string","format":"uri","description":"Customer website review link. Its presence does not verify that booking submissions are currently enabled."},"serviceKey":{"type":"string","description":"Unique catalogue key. Ordinary GP: gp; End of Lease: end_of_lease. Both retain the compatible pricing id gp."},"categoryId":{"type":"string","enum":["end_of_lease"],"description":"Only present for the End of Lease entry."},"description":{"type":"string"},"currency":{"const":"AUD"},"gstIncluded":{"const":true},"quoteUrl":{"type":"string","format":"uri"}},"required":["id","name","startingPriceCents","priceBasis","serviceKey","currency","gstIncluded","bookingUrl","quoteUrl"]}},"currency":{"const":"AUD"},"amountUnit":{"const":"cents"},"policyVersion":{"type":"string"}}}}}}}}},"/api/v1/service-areas/":{"get":{"operationId":"check_service_area","parameters":[{"name":"postcode","in":"query","required":false,"schema":{"type":"string","maxLength":80,"description":"Four-digit NSW postcode or a recognized locality such as Ryde NSW 2112. Ryde resolves to street postcode 2112 and West-Ryde to 2114. Other ambiguous locality names require a postcode."}},{"name":"suburb","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successful read-only result. No slot is reserved.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Coverage"},{"type":"object","required":["bookingAdmission"],"properties":{"bookingAdmission":{"$ref":"#/components/schemas/BookingAdmission"}}}]},"examples":{"unrecognizedSuburb":{"summary":"Uncertain locality; ask support, do not promise service","value":{"serviceable":false,"status":"suburb_not_recognized","approximate":true,"bookingAdmission":{"status":"not_verified","supportsAgentBooking":false,"notice":"Query only; website booking admission is not checked."}}}}}}},"400":{"description":"Invalid or unsupported selections; correct the request.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"field":{"type":"string"},"allowedValues":{"type":"array","items":{"type":["string","integer"]}},"requiredFields":{"type":"array","items":{"type":"string"}}},"required":["error"]},"example":{"error":"Choose valid selections.","code":"invalid_input"}}}},"429":{"description":"Rate limited; obey Retry-After.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"field":{"type":"string"},"allowedValues":{"type":"array","items":{"type":["string","integer"]}},"requiredFields":{"type":"array","items":{"type":"string"}}},"required":["error"]},"example":{"error":"Too many queries. Please retry shortly.","code":"rate_limited"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying; do not retry in a tight loop.","schema":{"type":"integer","example":60}}}},"503":{"description":"Verification temporarily unavailable; do not infer availability.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"field":{"type":"string"},"allowedValues":{"type":"array","items":{"type":["string","integer"]}},"requiredFields":{"type":"array","items":{"type":"string"}}},"required":["error"]},"example":{"error":"Availability could not be verified. Please try again.","code":"availability_unavailable"}}}}}}},"/api/v1/availability/":{"get":{"operationId":"get_availability","description":"Inventory arrival windows for the requested day, not booking admission, treatment duration or live technician tracking. Windows do not prove that customer booking submissions are enabled. Both ordinary and apartment pools count overlapping windows. Results expire after 15 seconds. A null nextAvailable means no window on this requested day, not that later dates are full. Supply postcode or suburb; ambiguous names require a postcode. Canonical endpoint URLs end in a slash to avoid platform redirects.","parameters":[{"name":"serviceId","in":"query","required":true,"schema":{"type":"string","enum":["gp","german_cockroach","bed_bug_flea","rodent","bee_wasp","termite_inspection","commercial_gp"]}},{"name":"propertyType","in":"query","required":true,"schema":{"type":"string","enum":["house","duplex","townhouse_villa","apartment_unit","commercial"]}},{"name":"postcode","in":"query","required":false,"schema":{"type":"string","maxLength":80,"description":"Four-digit NSW postcode or a recognized locality such as Ryde NSW 2112. Ryde resolves to street postcode 2112 and West-Ryde to 2114. Other ambiguous locality names require a postcode."}},{"name":"suburb","in":"query","required":false,"schema":{"type":"string","maxLength":100}},{"name":"categoryId","in":"query","required":false,"schema":{"type":"string","enum":["end_of_lease"],"description":"Only with residential gp. Omit for ordinary services."}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","maxLength":80,"description":"en, zh-Hant or ko. Other language tags fall back to English."}},{"name":"date","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Australia/Sydney calendar date, today through 30 days ahead."}},{"name":"src","in":"query","required":false,"schema":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9._-]{0,63}$","description":"Optional self-declared channel, e.g. chatgpt, gemini or same-day. Unauthenticated attribution only, not proof of an AI quote or referral."}}],"responses":{"200":{"description":"Successful read-only result. No slot is reserved.","content":{"application/json":{"schema":{"type":"object","required":["date","windows","available","checkedAt","expiresAt","reserved","bookingAdmission"],"properties":{"date":{"type":"string","format":"date","description":"Australia/Sydney calendar date, today through 30 days ahead."},"timezone":{"const":"Australia/Sydney"},"windows":{"type":"array","items":{"$ref":"#/components/schemas/ArrivalWindow"}},"nextAvailable":{"anyOf":[{"$ref":"#/components/schemas/ArrivalWindow"},{"type":"null"}]},"available":{"type":"boolean","description":"Whether this inventory result contains a window; does not verify customer booking admission."},"checkedAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"reserved":{"const":false},"bookingAdmission":{"$ref":"#/components/schemas/BookingAdmission"},"bookingUrl":{"type":"string","format":"uri","description":"Customer website review link. Its presence does not verify that booking submissions are currently enabled."},"coverage":{"$ref":"#/components/schemas/Coverage"},"prefill":{"$ref":"#/components/schemas/Prefill"}}},"examples":{"noWindows":{"summary":"Illustrative empty day only, not current inventory or later-date availability","value":{"date":"2026-10-27","timezone":"Australia/Sydney","windows":[],"nextAvailable":null,"available":false,"checkedAt":"2026-10-25T14:56:51.151Z","expiresAt":"2026-10-25T14:57:06.152Z","reserved":false,"bookingAdmission":{"status":"not_verified","supportsAgentBooking":false,"notice":"Query only; website booking admission is not checked."},"coverage":{"serviceable":true,"approximate":true,"status":"supported"}}}}}}},"400":{"description":"Invalid or unsupported selections; correct the request.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"field":{"type":"string"},"allowedValues":{"type":"array","items":{"type":["string","integer"]}},"requiredFields":{"type":"array","items":{"type":"string"}}},"required":["error"]},"example":{"error":"Choose valid selections.","code":"invalid_input"}}}},"429":{"description":"Rate limited; obey Retry-After.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"field":{"type":"string"},"allowedValues":{"type":"array","items":{"type":["string","integer"]}},"requiredFields":{"type":"array","items":{"type":"string"}}},"required":["error"]},"example":{"error":"Too many queries. Please retry shortly.","code":"rate_limited"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying; do not retry in a tight loop.","schema":{"type":"integer","example":60}}}},"503":{"description":"Verification temporarily unavailable; do not infer availability.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"field":{"type":"string"},"allowedValues":{"type":"array","items":{"type":["string","integer"]}},"requiredFields":{"type":"array","items":{"type":"string"}}},"required":["error"]},"example":{"error":"Availability could not be verified. Please try again.","code":"availability_unavailable"}}}}}}},"/api/v1/quote/":{"post":{"operationId":"get_quote","description":"Normal arrival window pricing unless a slotId is provided. Evening apartment windows double the same selections' normal GST-inclusive total. Missing required property selections return 400; manual-quote cases return quoteRequired=true without a fictional price. Availability is queried separately using the returned availabilityUrl. A calculated price or selected arrival does not verify customer booking admission. Do not send contact details. Return bookingUrl unchanged to the customer: it carries validated selections, not just service. The customer reviews price/availability and fills contact/address/notes on the website. Never infer payment or a reservation from this URL.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteInput"},"examples":{"endOfLeaseApartment":{"summary":"End of Lease: GP scope, no automatic flea treatment","value":{"serviceId":"gp","categoryId":"end_of_lease","postcode":"2113","suburb":"North Ryde","date":"2026-10-27","property":{"propertyType":"apartment_unit","apartmentSize":"2_bed"},"lang":"ko","paymentMethod":"online"}},"house":{"value":{"serviceId":"gp","postcode":"2113","date":"2026-10-27","property":{"propertyType":"house","landAreaBand":"350_500","bedroomsBand":"up_to_3","storeys":"1","grannyFlat":"none","treatmentScope":"full"}}},"eveningApartment":{"value":{"serviceId":"gp","postcode":"2113","suburb":"North Ryde","date":"2026-10-27","property":{"propertyType":"apartment_unit","apartmentSize":"2_bed"},"lang":"ko","paymentMethod":"online","slotId":"18_20"},"summary":"Two times the same selections' standard total, including GST; query availability first"},"commercialManual":{"value":{"serviceId":"commercial_gp","postcode":"2113","date":"2026-10-27","property":{"businessCategory":"restaurant","floorAreaBand":"over_400"}},"summary":"Manual quote, no fabricated fixed price"}}}}},"responses":{"200":{"description":"Successful read-only result. No slot is reserved.","content":{"application/json":{"schema":{"type":"object","properties":{"quoteRequired":{"type":"boolean"},"quote":{"type":"object","required":["totalCents","subtotalExGstCents","gstCents","lineItems","lineItemsAmountBasis","totalAmountBasis"],"properties":{"totalCents":{"type":"integer","description":"AUD cents. Divide by 100 for display only."},"subtotalExGstCents":{"type":"integer","description":"AUD cents. Divide by 100 for display only."},"gstCents":{"type":"integer","description":"AUD cents. Divide by 100 for display only."},"lineItemsAmountBasis":{"const":"excluding_gst"},"totalAmountBasis":{"const":"including_gst_and_applicable_mandatory_fees"},"lineItems":{"type":"array","items":{"type":"object","required":["id","label","amountCents"],"properties":{"id":{"type":"string"},"label":{"type":"string"},"amountCents":{"type":"integer","description":"AUD cents. Divide by 100 for display only."}}}},"warrantyMonths":{"type":"integer","minimum":0},"warrantyLabel":{"type":"string"},"warrantyItems":{"type":"array","items":{"type":"object","additionalProperties":true}},"gpAddonCount":{"type":"integer","minimum":0},"gpAddonIds":{"type":"array","items":{"type":"string"}},"gpAddonBundlePercentage":{"type":"number"},"payOnSiteNotes":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"}},"manualQuoteRequired":{"const":false}}},"reasons":{"type":"array","items":{"type":"string"}},"currency":{"const":"AUD"},"reserved":{"const":false},"availabilityChecked":{"const":false},"arrivalSelected":{"type":"boolean"},"availabilityUrl":{"type":"string","format":"uri"},"bookingAdmission":{"$ref":"#/components/schemas/BookingAdmission"},"bookingUrl":{"type":"string","format":"uri","description":"Customer website review link. Its presence does not verify that booking submissions are currently enabled."},"expiresAt":{"type":"string","format":"date-time"},"prefill":{"$ref":"#/components/schemas/Prefill"},"fixedPrice":{"type":"boolean"},"amountUnit":{"const":"cents"},"gstIncluded":{"const":true},"checkedAt":{"type":"string","format":"date-time"},"priceBasis":{"type":"string"},"policyVersion":{"type":"string"},"coverage":{"$ref":"#/components/schemas/Coverage"},"treatmentDurationMinutes":{"type":"null","description":"Not a guaranteed treatment duration."},"arrivalWindowMinutes":{"const":120}},"required":["quoteRequired","currency","reserved","availabilityChecked","bookingAdmission","fixedPrice","amountUnit","gstIncluded","bookingUrl","prefill","checkedAt","expiresAt","arrivalWindowMinutes"],"allOf":[{"if":{"properties":{"quoteRequired":{"const":true}}},"then":{"required":["reasons"],"not":{"required":["quote"]}},"else":{"required":["quote"]}}]}}}},"400":{"description":"Invalid or unsupported selections; correct the request.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"field":{"type":"string"},"allowedValues":{"type":"array","items":{"type":["string","integer"]}},"requiredFields":{"type":"array","items":{"type":"string"}}},"required":["error"]},"example":{"error":"Choose valid selections.","code":"invalid_input"}}}},"429":{"description":"Rate limited; obey Retry-After.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"field":{"type":"string"},"allowedValues":{"type":"array","items":{"type":["string","integer"]}},"requiredFields":{"type":"array","items":{"type":"string"}}},"required":["error"]},"example":{"error":"Too many queries. Please retry shortly.","code":"rate_limited"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying; do not retry in a tight loop.","schema":{"type":"integer","example":60}}}},"503":{"description":"Verification temporarily unavailable; do not infer availability.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"field":{"type":"string"},"allowedValues":{"type":"array","items":{"type":["string","integer"]}},"requiredFields":{"type":"array","items":{"type":"string"}}},"required":["error"]},"example":{"error":"Availability could not be verified. Please try again.","code":"availability_unavailable"}}}}}}}},"components":{"schemas":{"Prefill":{"type":"object","required":["status","version"],"properties":{"status":{"type":"string","enum":["ready","unavailable"]},"version":{"const":1},"code":{"type":"string"},"notice":{"type":"string"}},"description":"Versioned selection-only booking URL, maximum 2048 encoded characters. Includes service/EOL, locality, applicable property choices, optional arrival, language and payment method. Never includes contacts, notes, quoted price, payment secrets or booking tokens. Website validates again, protects existing drafts/payments and reserves nothing until the normal flow. An oversize link falls back to service and language with status=unavailable."},"BookingAdmission":{"type":"object","required":["status","supportsAgentBooking","notice"],"properties":{"status":{"const":"not_verified","description":"This query does not inspect customer-write admission controls. It is not a declaration that booking is permanently disabled."},"supportsAgentBooking":{"const":false},"notice":{"type":"string"}}},"Coverage":{"type":"object","required":["serviceable","status","approximate"],"properties":{"serviceable":{"type":"boolean"},"approximate":{"const":true},"status":{"type":"string","enum":["supported","outside_area","suburb_required","suburb_not_recognized","unknown_or_outside_area","invalid_postcode","postcode_required"]},"distanceKm":{"type":"object","required":["min","max"],"properties":{"min":{"type":"number","minimum":0},"max":{"type":"number","minimum":0}},"description":"Range of approximate distances for the selected localities, not the customer's exact street address."},"radiusKm":{"const":23},"toleranceKm":{"const":3},"postcode":{"type":"string","pattern":"^\\d{4}$"},"localities":{"type":"array","items":{"type":"string"}},"postcodes":{"type":"array","items":{"type":"string","pattern":"^\\d{4}$"}}}},"ArrivalWindow":{"type":"object","required":["id","start","end","priceMultiplier"],"properties":{"id":{"type":"string"},"start":{"type":"string","pattern":"^\\d{2}:00$"},"end":{"type":"string","pattern":"^\\d{2}:00$"},"priceMultiplier":{"type":"integer","enum":[1,2]}}},"QuoteInput":{"type":"object","additionalProperties":false,"required":["serviceId","property","date"],"properties":{"serviceId":{"type":"string","enum":["gp","german_cockroach","bed_bug_flea","rodent","bee_wasp","termite_inspection","commercial_gp"]},"categoryId":{"type":"string","description":"Use end_of_lease with residential gp only; omit otherwise."},"postcode":{"type":"string","maxLength":80,"description":"Four-digit NSW postcode or a recognized locality such as Ryde NSW 2112. Ryde resolves to street postcode 2112 and West-Ryde to 2114. Other ambiguous locality names require a postcode."},"suburb":{"type":"string"},"date":{"type":"string","format":"date","description":"Australia/Sydney calendar date, today through 30 days ahead."},"slotId":{"type":"string","description":"Use an id returned by get_availability."},"paymentMethod":{"type":"string","enum":["online","in_person"],"default":"online"},"lang":{"type":"string","maxLength":80,"description":"en, zh-Hant or ko. Other language tags fall back to English."},"property":{"type":"object","additionalProperties":false,"properties":{"propertyType":{"type":"string","enum":["house","duplex","townhouse_villa","apartment_unit","commercial"]},"specializedPropertyClass":{"type":"string","enum":["house","apartment_unit"]},"landAreaBand":{"type":"string","enum":["under_350","350_500","501_750","751_1000","1001_1250","1251_1500","1501_2000","2001_3000","over_3000"]},"bedroomsBand":{"type":"string","enum":["up_to_3","4_6","7_9","10_plus","4","5","6_plus"]},"apartmentSize":{"type":"string","enum":["studio_1_bed","2_bed","3_bed","4_bed","5_plus_bed"]},"floorAreaBand":{"type":"string","enum":["0_25","26_50","51_75","76_100","101_150","151_200","201_300","301_400","over_400"]},"businessCategory":{"type":"string","enum":["retail_office","beauty_salon","gym","non_food_warehouse","supermarket_grocery","restaurant","cafe_takeaway","food_production"]},"storeys":{"type":"string","enum":["1","2","3_plus"]},"grannyFlat":{"type":"string","enum":["none","1_bed","2_bed","3_bed"]},"treatmentScope":{"type":"string","enum":["full","indoor_only","outdoor_only"]},"needsLateEvening":{"type":"string","enum":["yes","no"]},"addonGermanCockroach":{"type":"string","enum":["yes","no"]},"addonRodent":{"type":"string","enum":["yes","no"]},"addonTermite":{"type":"string","enum":["yes","no"]},"addonBedBugFlea":{"type":"string","enum":["no"]},"specializedBedrooms":{"type":"string","pattern":"^[1-9][0-9]{0,3}$"}},"description":"Same selections as the website. GP houses need propertyType, landAreaBand, bedroomsBand, storeys, grannyFlat and treatmentScope; townhouses need propertyType, bedroomsBand and storeys; apartments need propertyType and apartmentSize. Commercial needs businessCategory and floorAreaBand. German cockroach and bed bug/flea use specializedPropertyClass; bed bug/flea also needs specializedBedrooms."},"src":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9._-]{0,63}$","description":"Optional self-declared channel, e.g. chatgpt, gemini or same-day. Unauthenticated attribution only, not proof of an AI quote or referral."}},"allOf":[{"if":{"required":["categoryId"],"properties":{"categoryId":{"const":"end_of_lease"}}},"then":{"properties":{"serviceId":{"const":"gp"}}}},{"if":{"required":["serviceId"],"properties":{"serviceId":{"const":"gp"}}},"then":{"properties":{"property":{"required":["propertyType"]}}}},{"if":{"required":["serviceId"],"properties":{"serviceId":{"const":"commercial_gp"}}},"then":{"properties":{"property":{"required":["businessCategory","floorAreaBand"]}}}},{"if":{"required":["serviceId"],"properties":{"serviceId":{"const":"german_cockroach"}}},"then":{"properties":{"property":{"required":["specializedPropertyClass"]}}}},{"if":{"required":["serviceId"],"properties":{"serviceId":{"const":"bed_bug_flea"}}},"then":{"properties":{"property":{"required":["specializedPropertyClass","specializedBedrooms"]}}}},{"if":{"required":["serviceId"],"properties":{"serviceId":{"const":"rodent"}}},"then":{"properties":{"property":{"required":["propertyType"]}}}},{"if":{"required":["serviceId"],"properties":{"serviceId":{"const":"bee_wasp"}}},"then":{"properties":{"property":{"required":["propertyType"]}}}},{"if":{"required":["serviceId"],"properties":{"serviceId":{"const":"termite_inspection"}}},"then":{"properties":{"property":{"required":["propertyType"]}}}},{"if":{"required":["serviceId","property"],"properties":{"serviceId":{"const":"gp"},"property":{"required":["propertyType"],"properties":{"propertyType":{"enum":["house","duplex"]}}}}},"then":{"properties":{"property":{"required":["landAreaBand","bedroomsBand","storeys","grannyFlat","treatmentScope"]}}}},{"if":{"required":["serviceId","property"],"properties":{"serviceId":{"const":"gp"},"property":{"required":["propertyType"],"properties":{"propertyType":{"enum":["townhouse_villa"]}}}}},"then":{"properties":{"property":{"required":["bedroomsBand","storeys"]}}}},{"if":{"required":["serviceId","property"],"properties":{"serviceId":{"const":"gp"},"property":{"required":["propertyType"],"properties":{"propertyType":{"enum":["apartment_unit"]}}}}},"then":{"properties":{"property":{"required":["apartmentSize"]}}}}],"anyOf":[{"required":["postcode"]},{"required":["suburb"]}]}}}}