{"openapi":"3.1.0","info":{"title":"Ask Intake.Dental","version":"1.0.0","summary":"Public Q&A about the Intake.Dental platform for dental practices.","description":"Ask a plain-language question about Intake.Dental — what the platform does for dental practices (AI receptionist, insurance verification, AI clinical notes, patient forms in 25+ languages, payments, virtual consultations), what it costs, how it connects to practice management systems, how it handles HIPAA, and how the public dentist directory works.\n\nAnswers are generated from Intake.Dental's published product information only and each one links to the page it came from. Frequently asked questions are reviewed by a person and published as permanent pages at https://intake.dental/ask/{slug}.\n\nScope: public product information only. The endpoint has no access to any practice, patient or customer data and will decline questions about individual practices, patients, suppliers, security incidents, legal matters or unpublished pricing. It does not give dental or medical advice.\n\nNo authentication. Rate limited per IP; a daily budget may pause live answers, in which case published answers remain available via /api/ask/published.","contact":{"name":"Intake.Dental","url":"https://intake.dental/contact","email":"support@intake.dental"},"termsOfService":"https://intake.dental/terms-and-conditions"},"servers":[{"url":"https://api2.intake.dental"}],"paths":{"/api/ask":{"post":{"operationId":"askQuestion","summary":"Ask a question and get a grounded answer with source links.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskRequest"},"example":{"question":"How does the AI receptionist handle Spanish-speaking callers?"}}}},"responses":{"200":{"description":"An answer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskResponse"}}}},"400":{"description":"The question was missing, too short, too long, or not text.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Published answers are still available.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Live answers are paused for the day (budget). Use /api/ask/published.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/ask/stream":{"post":{"operationId":"askQuestionStream","summary":"Same as POST /api/ask, streamed as server-sent events (meta, delta, done, error).","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskRequest"}}}},"responses":{"200":{"description":"text/event-stream. Each event is `data: {json}`; `done` carries the final answer."}}}},"/api/ask/published":{"get":{"operationId":"listPublishedAnswers","summary":"Every reviewed and published question/answer pair.","parameters":[{"name":"since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Only pairs updated after this time."},{"name":"limit","in":"query","schema":{"type":"integer","maximum":1000,"default":500}}],"responses":{"200":{"description":"Published pairs.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"items":{"type":"array","items":{"$ref":"#/components/schemas/PublishedAnswer"}}}}}}}}}},"/api/ask/published/{slug}":{"get":{"operationId":"getPublishedAnswer","summary":"One published pair by slug.","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The pair.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishedAnswer"}}}},"404":{"description":"Not published."}}}},"/api/ask/status":{"get":{"operationId":"askStatus","summary":"Whether live answers are currently available, and the limits.","responses":{"200":{"description":"Status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}}}}}}},"components":{"schemas":{"AskRequest":{"type":"object","required":["question"],"properties":{"question":{"type":"string","minLength":3,"maxLength":500,"description":"A single question in plain language. English works best."},"session_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{8,64}$","description":"Optional opaque id so follow-up questions from one conversation share a quota."}}},"Source":{"type":"object","properties":{"title":{"type":"string"},"route":{"type":"string"},"url":{"type":"string","format":"uri"}}},"AskResponse":{"type":"object","properties":{"ok":{"type":"boolean"},"question":{"type":"string"},"answer":{"type":"string"},"sources":{"type":"array","items":{"$ref":"#/components/schemas/Source"}},"served_from":{"type":"string","enum":["cache","llm","refused","out_of_scope"],"description":"`cache` means a previously reviewed answer; `refused` means the question was outside what this endpoint discusses."},"refuse_class":{"type":"string","nullable":true},"slug":{"type":"string","nullable":true,"description":"Set when this answer has been published as a page."},"canonical_url":{"type":"string","format":"uri","nullable":true,"description":"https://intake.dental/ask/{slug} when published."},"disclaimer":{"type":"string"}}},"PublishedAnswer":{"type":"object","properties":{"slug":{"type":"string"},"question":{"type":"string"},"answer":{"type":"string"},"sources":{"type":"array","items":{"$ref":"#/components/schemas/Source"}},"scope":{"type":"string"},"published_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"canonical_url":{"type":"string","format":"uri"}}},"Status":{"type":"object","properties":{"ok":{"type":"boolean"},"paused":{"type":"boolean"},"reason":{"type":"string","nullable":true},"limits":{"type":"object","properties":{"per_ip_per_hour":{"type":"integer"},"per_ip_model_calls_per_hour":{"type":"integer"},"per_session_per_day":{"type":"integer"},"max_question_chars":{"type":"integer"}}}}},"Error":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"paused":{"type":"boolean"},"retry_after":{"type":"integer"}}}}}}