{"openapi":"3.1.0","info":{"title":"Seacliff Healthcare — public API","version":"1.0.0","summary":"Submit an enquiry, or ask a grounded question about this business.","description":"The public, unauthenticated API for Seacliff Healthcare.\n\nRead every fact this business publishes on its own website — opening hours, services and prices, service areas, FAQs, reviews and the page inventory — then submit an enquiry or ask the on-site assistant a question answered strictly from that same information.\n\nThere is no authentication. Every endpoint is public and rate-limited per IP, and every response carries RFC 9331 `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset` headers so a client can pace itself instead of discovering the ceiling by hitting it; a 429 adds `Retry-After`.\n\nErrors are JSON with a stable `code` field (see the Error schema) — branch on `code`, never on the human-readable message.\n\nVersioning: URL path prefix, /api/v{major}. The major number changes only for a breaking change. Current version `v1`. A version is supported for at least 12 months after its successor ships. During that window every response carries a Deprecation header (RFC 8594) with the date it was deprecated, a Sunset header with the date it stops being served, and a Link header with rel=\"successor-version\" pointing at the replacement.\n\nHuman documentation: /developers. Model Context Protocol server: /api/mcp (manifest at /.well-known/mcp). Related machine-readable files: /llms.txt (citation guidance + canonical links), /agent.json (entity card), /sitemap.xml, /robots.txt.","contact":{"name":"Seacliff Healthcare","url":"https://clinics.seacliffhealthcare.com.au/contact"}},"externalDocs":{"description":"Developer portal","url":"https://clinics.seacliffhealthcare.com.au/developers"},"x-api-lifecycle":{"current":"v1","supported":["v1"],"deprecated":[],"scheme":"URL path prefix, /api/v{major}. The major number changes only for a breaking change.","breakingChange":"Removing a field, renaming a field, changing a field type, or changing the meaning of an existing value. Adding a new field or a new resource is NOT breaking — clients must ignore fields they do not recognise.","notice":"A version is supported for at least 12 months after its successor ships. During that window every response carries a Deprecation header (RFC 8594) with the date it was deprecated, a Sunset header with the date it stops being served, and a Link header with rel=\"successor-version\" pointing at the replacement.","versionHeader":"Every response carries `API-Version`. Send `Accept: application/json`; content negotiation is not used for versioning."},"x-mcp":{"endpoint":"https://clinics.seacliffhealthcare.com.au/api/mcp","manifest":"https://clinics.seacliffhealthcare.com.au/.well-known/mcp","transport":"streamable-http"},"servers":[{"url":"https://clinics.seacliffhealthcare.com.au","description":"This business's site"}],"security":[],"tags":[{"name":"Business data","description":"Read what this business publishes about itself. No authentication."},{"name":"Leads","description":"Send an enquiry to the business."},{"name":"Assistant","description":"Grounded Q&A about this business."}],"paths":{"/api/v1":{"get":{"tags":["Business data"],"operationId":"getApiIndex","summary":"List every read resource, the rate limits and the versioning policy","description":"The live index of this API. Fetch this first: it enumerates the resources below at runtime, so a client that reads it never has to hard-code a path.","responses":{"200":{"description":"The API index.","headers":{"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in this window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"API-Version":{"description":"The API version that served this response.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"BRAND_NOT_FOUND or NOT_PUBLISHED — no published business is served on this host.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED — see RateLimit-Reset for when the window rolls over.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/business":{"get":{"tags":["Business data"],"operationId":"getBusiness","summary":"Name, category, address, contact details, ABN and identifiers — the NAP record.","description":"Name, category, address, contact details, ABN and identifiers — the NAP record. Read-only, no authentication. Everything returned here is already visible on Seacliff Healthcare's public pages.","responses":{"200":{"description":"The business resource.","headers":{"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in this window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"API-Version":{"description":"The API version that served this response.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["apiVersion","resource","data","links"],"properties":{"apiVersion":{"type":"string","const":"v1"},"resource":{"type":"string","const":"business"},"data":{"type":"object","additionalProperties":true,"description":"Name, category, address, contact details, ABN and identifiers — the NAP record."},"links":{"type":"object","additionalProperties":{"type":"string"},"description":"Where to go next — self, index, openapi, documentation, mcp, entityCard, website."},"generatedAt":{"type":"string","format":"date-time"}}}}}},"404":{"description":"BRAND_NOT_FOUND or NOT_PUBLISHED — no published business is served on this host.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"METHOD_NOT_ALLOWED — this resource is read-only. The Allow header lists the methods it accepts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED — 120 requests per IP per minute. See RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/hours":{"get":{"tags":["Business data"],"operationId":"getHours","summary":"Opening hours for each day of the week, plus the timezone they are expressed in.","description":"Opening hours for each day of the week, plus the timezone they are expressed in. Read-only, no authentication. Everything returned here is already visible on Seacliff Healthcare's public pages.","responses":{"200":{"description":"The hours resource.","headers":{"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in this window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"API-Version":{"description":"The API version that served this response.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["apiVersion","resource","data","links"],"properties":{"apiVersion":{"type":"string","const":"v1"},"resource":{"type":"string","const":"hours"},"data":{"type":"object","additionalProperties":true,"description":"Opening hours for each day of the week, plus the timezone they are expressed in."},"links":{"type":"object","additionalProperties":{"type":"string"},"description":"Where to go next — self, index, openapi, documentation, mcp, entityCard, website."},"generatedAt":{"type":"string","format":"date-time"}}}}}},"404":{"description":"BRAND_NOT_FOUND or NOT_PUBLISHED — no published business is served on this host.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"METHOD_NOT_ALLOWED — this resource is read-only. The Allow header lists the methods it accepts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED — 120 requests per IP per minute. See RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/services":{"get":{"tags":["Business data"],"operationId":"getServices","summary":"Services offered, with prices where published and the page for each.","description":"Services offered, with prices where published and the page for each. Read-only, no authentication. Everything returned here is already visible on Seacliff Healthcare's public pages.","responses":{"200":{"description":"The services resource.","headers":{"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in this window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"API-Version":{"description":"The API version that served this response.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["apiVersion","resource","data","links"],"properties":{"apiVersion":{"type":"string","const":"v1"},"resource":{"type":"string","const":"services"},"data":{"type":"object","additionalProperties":true,"description":"Services offered, with prices where published and the page for each."},"links":{"type":"object","additionalProperties":{"type":"string"},"description":"Where to go next — self, index, openapi, documentation, mcp, entityCard, website."},"generatedAt":{"type":"string","format":"date-time"}}}}}},"404":{"description":"BRAND_NOT_FOUND or NOT_PUBLISHED — no published business is served on this host.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"METHOD_NOT_ALLOWED — this resource is read-only. The Allow header lists the methods it accepts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED — 120 requests per IP per minute. See RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/service-areas":{"get":{"tags":["Business data"],"operationId":"getServiceAreas","summary":"Suburbs and localities this business serves.","description":"Suburbs and localities this business serves. Read-only, no authentication. Everything returned here is already visible on Seacliff Healthcare's public pages.","responses":{"200":{"description":"The service-areas resource.","headers":{"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in this window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"API-Version":{"description":"The API version that served this response.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["apiVersion","resource","data","links"],"properties":{"apiVersion":{"type":"string","const":"v1"},"resource":{"type":"string","const":"service-areas"},"data":{"type":"object","additionalProperties":true,"description":"Suburbs and localities this business serves."},"links":{"type":"object","additionalProperties":{"type":"string"},"description":"Where to go next — self, index, openapi, documentation, mcp, entityCard, website."},"generatedAt":{"type":"string","format":"date-time"}}}}}},"404":{"description":"BRAND_NOT_FOUND or NOT_PUBLISHED — no published business is served on this host.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"METHOD_NOT_ALLOWED — this resource is read-only. The Allow header lists the methods it accepts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED — 120 requests per IP per minute. See RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/faqs":{"get":{"tags":["Business data"],"operationId":"getFaqs","summary":"Published questions and answers, verbatim and quotable.","description":"Published questions and answers, verbatim and quotable. Read-only, no authentication. Everything returned here is already visible on Seacliff Healthcare's public pages.","responses":{"200":{"description":"The faqs resource.","headers":{"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in this window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"API-Version":{"description":"The API version that served this response.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["apiVersion","resource","data","links"],"properties":{"apiVersion":{"type":"string","const":"v1"},"resource":{"type":"string","const":"faqs"},"data":{"type":"object","additionalProperties":true,"description":"Published questions and answers, verbatim and quotable."},"links":{"type":"object","additionalProperties":{"type":"string"},"description":"Where to go next — self, index, openapi, documentation, mcp, entityCard, website."},"generatedAt":{"type":"string","format":"date-time"}}}}}},"404":{"description":"BRAND_NOT_FOUND or NOT_PUBLISHED — no published business is served on this host.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"METHOD_NOT_ALLOWED — this resource is read-only. The Allow header lists the methods it accepts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED — 120 requests per IP per minute. See RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/reviews":{"get":{"tags":["Business data"],"operationId":"getReviews","summary":"Aggregate rating and the reviews shown publicly on the site.","description":"Aggregate rating and the reviews shown publicly on the site. Read-only, no authentication. Everything returned here is already visible on Seacliff Healthcare's public pages.","responses":{"200":{"description":"The reviews resource.","headers":{"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in this window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"API-Version":{"description":"The API version that served this response.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["apiVersion","resource","data","links"],"properties":{"apiVersion":{"type":"string","const":"v1"},"resource":{"type":"string","const":"reviews"},"data":{"type":"object","additionalProperties":true,"description":"Aggregate rating and the reviews shown publicly on the site."},"links":{"type":"object","additionalProperties":{"type":"string"},"description":"Where to go next — self, index, openapi, documentation, mcp, entityCard, website."},"generatedAt":{"type":"string","format":"date-time"}}}}}},"404":{"description":"BRAND_NOT_FOUND or NOT_PUBLISHED — no published business is served on this host.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"METHOD_NOT_ALLOWED — this resource is read-only. The Allow header lists the methods it accepts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED — 120 requests per IP per minute. See RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/pages":{"get":{"tags":["Business data"],"operationId":"getPages","summary":"Every published page on this site, with its title and canonical URL.","description":"Every published page on this site, with its title and canonical URL. Read-only, no authentication. Everything returned here is already visible on Seacliff Healthcare's public pages.","responses":{"200":{"description":"The pages resource.","headers":{"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests still available in this window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"API-Version":{"description":"The API version that served this response.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["apiVersion","resource","data","links"],"properties":{"apiVersion":{"type":"string","const":"v1"},"resource":{"type":"string","const":"pages"},"data":{"type":"object","additionalProperties":true,"description":"Every published page on this site, with its title and canonical URL."},"links":{"type":"object","additionalProperties":{"type":"string"},"description":"Where to go next — self, index, openapi, documentation, mcp, entityCard, website."},"generatedAt":{"type":"string","format":"date-time"}}}}}},"404":{"description":"BRAND_NOT_FOUND or NOT_PUBLISHED — no published business is served on this host.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"METHOD_NOT_ALLOWED — this resource is read-only. The Allow header lists the methods it accepts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED — 120 requests per IP per minute. See RateLimit-Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/leads":{"post":{"tags":["Leads"],"operationId":"submitLead","summary":"Submit an enquiry to this business","description":"Creates a lead. The business is notified by email and the lead appears in their inbox.\n\nRate limited to 10 submissions per IP per 10 minutes.\n\nAccepts `application/json` (answers JSON, documented here) or form-encoded (answers a branded HTML thank-you page, used by the site's own forms).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["brand_id"],"properties":{"brand_id":{"type":"string","description":"This business. Use the value shown in this document's example.","example":"dev-seacliff-healthcare-thirroul-mrhg4lcm"},"name":{"type":"string","maxLength":200,"description":"Enquirer's full name."},"phone":{"type":"string","maxLength":60,"description":"Australian mobile or landline, e.g. 0412 345 678."},"email":{"type":"string","format":"email","maxLength":200},"message":{"type":"string","maxLength":2000,"description":"What the enquiry is about."},"service":{"type":"string","maxLength":200,"description":"Which service the enquiry concerns. Supplying it makes name, phone and email required."},"consent":{"type":"string","description":"Consent to be contacted — \"on\", \"true\", \"1\" or \"yes\"."},"require_fields":{"type":"string","description":"Comma-separated list the server must enforce as mandatory, e.g. \"name,phone,email\"."}}},"examples":{"enquiry":{"summary":"A typical enquiry","value":{"brand_id":"dev-seacliff-healthcare-thirroul-mrhg4lcm","name":"Alex Taylor","phone":"0412 345 678","email":"alex@example.com","message":"My laptop will not start.","consent":"yes"}}}}}},"responses":{"201":{"description":"Lead created.","content":{"application/json":{"schema":{"type":"object","required":["leadId","success"],"properties":{"leadId":{"type":"string"},"success":{"type":"boolean"}}}}}},"400":{"description":"Missing or invalid fields — see `code`: MISSING_FIELDS, INVALID_PHONE, INVALID_EMAIL, UNREADABLE_BODY.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"BRAND_NOT_FOUND — brand_id does not resolve to a live business.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"METHOD_NOT_ALLOWED — this endpoint accepts POST. The Allow header lists the methods it accepts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED — too many submissions from this IP. 10 per 10 minutes; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/website/assistant":{"post":{"tags":["Assistant"],"operationId":"askAssistant","summary":"Ask a grounded question about this business","description":"Answers strictly from this business's own published information (services, hours, location, FAQs). Returns the answer plus any suggested follow-up actions.\n\nRate limited per IP. No authentication.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["brandId","locationId","message"],"properties":{"brandId":{"type":"string","example":"dev-seacliff-healthcare-thirroul-mrhg4lcm"},"locationId":{"type":"string","example":"loc-thirroul-mrhg4lcu"},"message":{"type":"string","description":"The question."},"sessionId":{"type":"string","description":"Optional. Groups turns of one conversation."}}},"examples":{"question":{"summary":"Asking about opening hours","value":{"brandId":"dev-seacliff-healthcare-thirroul-mrhg4lcm","locationId":"loc-thirroul-mrhg4lcu","message":"What time do you close on Saturday?"}}}}}},"responses":{"200":{"description":"An answer grounded in this business's published information.","content":{"application/json":{"schema":{"type":"object","required":["answer"],"properties":{"answer":{"type":"string"},"actions":{"type":"array","description":"Suggested next steps, e.g. call or request a quote.","items":{"type":"object","additionalProperties":true}},"source":{"type":"string","description":"Where the answer came from."}}}}}},"400":{"description":"MISSING_FIELDS — brandId, locationId and message are all required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"NOT_FOUND — brandId/locationId do not resolve to a published business.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"METHOD_NOT_ALLOWED — this endpoint accepts POST. The Allow header lists the methods it accepts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"RATE_LIMITED. Also carries `answer` so an on-page widget can render it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","required":["error","code","hint"],"properties":{"error":{"type":"string","description":"Human-readable message. Do not machine-match on this text; it may change."},"code":{"type":"string","description":"Stable machine token. Branch on this.","enum":["RATE_LIMITED","UNREADABLE_BODY","MISSING_FIELDS","INVALID_PHONE","INVALID_EMAIL","BRAND_NOT_FOUND","NOT_FOUND","METHOD_NOT_ALLOWED","UNSUPPORTED_VERSION","NOT_PUBLISHED","SEND_FAILED","SERVER_ERROR"]},"hint":{"type":"string","description":"What the caller should do about it."}}}}}}