{"components":{"schemas":{"Action":{"additionalProperties":true,"type":"object"},"Error":{"additionalProperties":false,"properties":{"error":{"type":"string"},"retry_after_seconds":{"description":"Present on 429: seconds until the client's pacing window resets.","minimum":1,"type":"integer"}},"required":["error"],"type":"object"},"JSONRPCError":{"additionalProperties":false,"properties":{"error":{"additionalProperties":true,"properties":{"code":{"type":"integer"},"message":{"type":"string"}},"required":["code","message"],"type":"object"},"id":{},"jsonrpc":{"const":"2.0","type":"string"}},"required":["jsonrpc","error"],"type":"object"},"Practice":{"additionalProperties":true,"type":"object"},"PracticeRow":{"additionalProperties":false,"properties":{"actions":{"items":{"type":"string"},"type":"array"},"canonical_profile_url":{"format":"uri","type":"string"},"id":{"type":"string"},"locality":{"type":"string"},"match":{"description":"Present when the search carried constraints: the published facts that satisfied them.","properties":{"booking":{"description":"the matching action kind","type":"string"},"language":{"type":"string"},"new_patients":{"description":"always \"not yet verified\"","type":"string"},"open":{"additionalProperties":{"type":"string"},"description":"day → published hours text","type":"object"},"services":{"items":{"type":"string"},"type":"array"},"source_checked_at":{"description":"day of the oldest fact the match rests on, so every matched fact is at least this fresh; absent when only a live booking route matched","format":"date","type":"string"}},"type":"object"},"name":{"type":"string"},"province":{"type":"string"},"slug":{"type":"string"}},"required":["id","slug","name","canonical_profile_url","actions"],"type":"object"}}},"info":{"description":"No-login evidence-backed Canadian dental discovery and clinic-published public actions. No Xona customer or PMS data.","title":"Xona Dental Gateway Public API","version":"0.1.0"},"openapi":"3.1.0","paths":{"/.well-known/mcp/server-card.json":{"get":{"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"MCP server card"}},"security":[],"summary":"Public MCP server card"}},"/api/public/dental-network/actions":{"post":{"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"capability":{"enum":["public_provider_booking","public_booking_handoff","xona_email_appointment_request","external_request_form","call_clinic","visit_clinic_website"],"type":"string"},"practice_slug":{"maxLength":140,"minLength":1,"type":"string"},"surface":{"enum":["ai_agent","referral"],"type":"string"}},"required":["practice_slug","capability","surface"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Action"}}},"description":"Prepared action"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request or action state"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Dental resource not found"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Request body too large"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Gateway temporarily unavailable"}},"security":[],"summary":"Prepare an expiring attributed public action"}},"/api/public/dental-network/actions/{token}/services":{"get":{"parameters":[{"description":"Opaque expiring action token","in":"path","name":"token","required":true,"schema":{"maxLength":140,"minLength":1,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"services":{"items":{"additionalProperties":true,"type":"object"},"type":"array"}},"required":["services"],"type":"object"}}},"description":"Public widget services"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request or action state"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Dental resource not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Public provider read is unavailable for this action"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Dental action expired"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded"},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Clinic booking provider is unavailable"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Gateway temporarily unavailable"},"504":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Clinic booking provider timed out"}},"security":[],"summary":"List services from a supported clinic public booking widget"}},"/api/public/dental-network/actions/{token}/slots":{"get":{"parameters":[{"description":"Opaque expiring action token","in":"path","name":"token","required":true,"schema":{"maxLength":140,"minLength":1,"type":"string"}},{"description":"Provider-published service ID returned by the services endpoint","in":"query","name":"service_id","required":true,"schema":{"maxLength":160,"minLength":1,"type":"string"}},{"description":"UTC window start","in":"query","name":"start","required":true,"schema":{"format":"date-time","type":"string"}},{"description":"UTC window end, no more than 14 days after start","in":"query","name":"end","required":true,"schema":{"format":"date-time","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"slots":{"items":{"additionalProperties":true,"type":"object"},"type":"array"}},"required":["slots"],"type":"object"}}},"description":"Public widget slots"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request or action state"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Dental resource not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Public provider read is unavailable for this action"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Dental action expired"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded"},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Clinic booking provider is unavailable"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Gateway temporarily unavailable"},"504":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Clinic booking provider timed out"}},"security":[],"summary":"List public widget availability for one service and at most 14 days within the next 180 days"}},"/api/public/dental-network/answers":{"post":{"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"practice_slugs":{"items":{"maxLength":140,"minLength":1,"type":"string"},"maxItems":10,"minItems":1,"type":"array"},"topic":{"enum":["identity","location","hours","services","languages","new_patients","coverage","accessibility","emergency","booking"],"type":"string"}},"required":["practice_slugs","topic"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"answers":{"items":{"additionalProperties":true,"type":"object"},"type":"array"}},"required":["answers"],"type":"object"}}},"description":"Evidence-grounded answers"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request or action state"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Dental resource not found"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Request body too large"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Gateway temporarily unavailable"}},"security":[],"summary":"Answer a bounded question from practice evidence"}},"/api/public/dental-network/practices/{slug}":{"get":{"parameters":[{"description":"Canonical Xona practice slug","in":"path","name":"slug","required":true,"schema":{"maxLength":140,"minLength":1,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"actions":{"items":{"$ref":"#/components/schemas/Action"},"type":"array"},"practice":{"$ref":"#/components/schemas/Practice"}},"required":["practice","actions"],"type":"object"}}},"description":"Practice profile"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Dental resource not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Gateway temporarily unavailable"}},"security":[],"summary":"Get an evidence-backed public practice profile"}},"/api/public/dental-network/practices/{slug}/counts":{"get":{"description":"Requires the practice sign-in cookie of a member of the claiming account on book.xonark.com; every other caller gets 401 or 403.","parameters":[{"description":"Canonical Xona practice slug","in":"path","name":"slug","required":true,"schema":{"maxLength":140,"minLength":1,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"days":{"type":"string"},"events":{"additionalProperties":{"type":"integer"},"type":"object"},"practice_id":{"type":"string"},"reads":{"additionalProperties":{"type":"integer"},"type":"object"},"slug":{"type":"string"}},"required":["practice_id","slug","reads","events"],"type":"object"}}},"description":"Counts, UTC days, last 30"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Practice sign-in required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Public write is disabled, or not a member of the claiming account"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Dental resource not found"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Gateway temporarily unavailable"}},"security":[],"summary":"Reads and funnel events for a claimed practice (members only)"}},"/api/public/dental-network/requests/{token}/status":{"get":{"parameters":[{"description":"Opaque expiring action token","in":"path","name":"token","required":true,"schema":{"maxLength":140,"minLength":1,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Action"}}},"description":"Exact action state"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Dental resource not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded"}},"security":[],"summary":"Get exact action status"}},"/api/public/dental-network/search":{"get":{"parameters":[{"description":"Name, service, language, or other supported public fact","in":"query","name":"q","required":false,"schema":{"maxLength":160,"type":"string"}},{"description":"Province filter","in":"query","name":"province","required":false,"schema":{"maxLength":40,"type":"string"}},{"description":"City or locality filter","in":"query","name":"locality","required":false,"schema":{"maxLength":100,"type":"string"}},{"description":"Postal-code filter","in":"query","name":"postal_code","required":false,"schema":{"maxLength":12,"type":"string"}},{"description":"Maximum results","in":"query","name":"limit","required":false,"schema":{"maximum":50,"minimum":1,"type":"integer"}},{"description":"A service the clinic's own site lists (cleaning, implants, invisalign, emergency, kids …)","in":"query","name":"service","required":false,"schema":{"maxLength":60,"type":"string"}},{"description":"A language the clinic's own site lists","in":"query","name":"language","required":false,"schema":{"maxLength":40,"type":"string"}},{"description":"Published hours: open that day, or closing at/after 18:00 on some day","in":"query","name":"open","required":false,"schema":{"enum":["saturday","sunday","weekend","evening"],"type":"string"}},{"description":"A route usable now: online booking page, clinic request form, a request Xona delivers, a phone number, or any","in":"query","name":"booking","required":false,"schema":{"enum":["online","form","xona_request","call","any"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"count":{"minimum":0,"type":"integer"},"projection":{"description":"Present when results are PracticeRow objects.","enum":["row"],"type":"string"},"results":{"items":{"oneOf":[{"$ref":"#/components/schemas/Practice"},{"$ref":"#/components/schemas/PracticeRow"}]},"type":"array"}},"required":["results","count"],"type":"object"}}},"description":"Matching practices. A verified crawler receives full Practice objects; every other client receives PracticeRow objects (projection \"row\") and reads a practice's facts from the paced profile endpoint."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request or action state"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Gateway temporarily unavailable"}},"security":[],"summary":"Search Canadian dental practices"}},"/auth.md":{"get":{"responses":{"200":{"content":{"text/markdown":{"schema":{"type":"string"}}},"description":"Agent-readable authentication guide"}},"security":[],"summary":"No-login boundary and discovery guide"}},"/mcp":{"post":{"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"JSON-RPC response"},"202":{"description":"JSON-RPC notification accepted"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JSONRPCError"}}},"description":"Invalid JSON-RPC request"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JSONRPCError"}}},"description":"Request body too large"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded"}},"security":[],"summary":"Public Xona Dental Gateway Streamable HTTP MCP endpoint"}}},"servers":[{"url":"https://book.xonark.com"}]}
