{"openapi":"3.1.1","info":{"title":"Dr. Nestor Camacho Public Practice API","version":"1.0.0","description":"Read-only General Medicine practice information in Cochabamba, Bolivia. No authentication required. No patient records, diagnosis, availability or appointment booking. Limit: 60 requests/minute/IP/operation (process-local unless Upstash is configured).","contact":{"name":"Dr. Nestor Camacho","email":"dr.nestorcamacho@gmail.com"}},"servers":[{"url":"https://www.nestorcamacho.org"}],"security":[],"externalDocs":{"description":"API and MCP documentation","url":"https://www.nestorcamacho.org/docs"},"paths":{"/api/agent/practice":{"get":{"operationId":"practice.info","summary":"Read public practice and contact information","tags":["Public practice information"],"parameters":[{"name":"locale","in":"query","required":false,"schema":{"type":"string","enum":["es","en"],"default":"es"},"description":"Response language."}],"responses":{"200":{"description":"Public information only; not medical advice or appointment confirmation.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"object","properties":{"name":{"type":"string","minLength":1},"specialty":{"type":"string","minLength":1},"overview":{"type":"string","minLength":1},"canonicalUrl":{"type":"string","format":"uri"},"telephone":{"type":"string","minLength":1},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"serviceArea":{"type":"string","minLength":1},"languages":{"minItems":1,"type":"array","items":{"type":"string","minLength":1}},"appointmentMethod":{"type":"string","minLength":1},"pricingNote":{"type":"string","minLength":1},"emergencyDisclaimer":{"type":"string","minLength":1}},"required":["name","specialty","overview","canonicalUrl","telephone","email","serviceArea","languages","appointmentMethod","pricingNote","emergencyDisclaimer"],"additionalProperties":false},"metadata":{"type":"object","properties":{"locale":{"type":"string","enum":["en","es"]},"generatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["locale","generatedAt"],"additionalProperties":false}},"required":["data","metadata"],"additionalProperties":false}}}},"400":{"description":"RFC 9457 problem details. Follow resolution; on 429 wait for Retry-After.","headers":{"Retry-After":{"description":"Seconds to wait on HTTP 429.","schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"RFC 9457 problem details. Follow resolution; on 429 wait for Retry-After.","headers":{"Retry-After":{"description":"Seconds to wait on HTTP 429.","schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"RFC 9457 problem details. Follow resolution; on 429 wait for Retry-After.","headers":{"Retry-After":{"description":"Seconds to wait on HTTP 429.","schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"RFC 9457 problem details. Follow resolution; on 429 wait for Retry-After.","headers":{"Retry-After":{"description":"Seconds to wait on HTTP 429.","schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/agent/services":{"get":{"operationId":"practice.services.list","summary":"List published medical services","tags":["Public practice information"],"parameters":[{"name":"locale","in":"query","required":false,"schema":{"type":"string","enum":["es","en"],"default":"es"},"description":"Response language."}],"responses":{"200":{"description":"Public information only; not medical advice or appointment confirmation.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string","minLength":1},"description":{"type":"string","minLength":1},"serviceArea":{"type":"string","minLength":1},"appointmentMethod":{"type":"string","minLength":1},"canonicalUrl":{"type":"string","format":"uri"}},"required":["title","description","serviceArea","appointmentMethod","canonicalUrl"],"additionalProperties":false}},"metadata":{"type":"object","properties":{"locale":{"type":"string","enum":["en","es"]},"generatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["locale","generatedAt"],"additionalProperties":false}},"required":["data","metadata"],"additionalProperties":false}}}},"400":{"description":"RFC 9457 problem details. Follow resolution; on 429 wait for Retry-After.","headers":{"Retry-After":{"description":"Seconds to wait on HTTP 429.","schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"RFC 9457 problem details. Follow resolution; on 429 wait for Retry-After.","headers":{"Retry-After":{"description":"Seconds to wait on HTTP 429.","schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"RFC 9457 problem details. Follow resolution; on 429 wait for Retry-After.","headers":{"Retry-After":{"description":"Seconds to wait on HTTP 429.","schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"RFC 9457 problem details. Follow resolution; on 429 wait for Retry-After.","headers":{"Retry-After":{"description":"Seconds to wait on HTTP 429.","schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/agent/faq":{"get":{"operationId":"practice.faq.list","summary":"Read frequently asked questions","tags":["Public practice information"],"parameters":[{"name":"locale","in":"query","required":false,"schema":{"type":"string","enum":["es","en"],"default":"es"},"description":"Response language."}],"responses":{"200":{"description":"Public information only; not medical advice or appointment confirmation.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string","minLength":1},"answer":{"type":"string","minLength":1}},"required":["question","answer"],"additionalProperties":false}},"metadata":{"type":"object","properties":{"locale":{"type":"string","enum":["en","es"]},"generatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["locale","generatedAt"],"additionalProperties":false}},"required":["data","metadata"],"additionalProperties":false}}}},"400":{"description":"RFC 9457 problem details. Follow resolution; on 429 wait for Retry-After.","headers":{"Retry-After":{"description":"Seconds to wait on HTTP 429.","schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"RFC 9457 problem details. Follow resolution; on 429 wait for Retry-After.","headers":{"Retry-After":{"description":"Seconds to wait on HTTP 429.","schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"RFC 9457 problem details. Follow resolution; on 429 wait for Retry-After.","headers":{"Retry-After":{"description":"Seconds to wait on HTTP 429.","schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"RFC 9457 problem details. Follow resolution; on 429 wait for Retry-After.","headers":{"Retry-After":{"description":"Seconds to wait on HTTP 429.","schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/agent/content":{"get":{"operationId":"documents.markdown","summary":"Read the Markdown representation of a public page","parameters":[{"name":"path","in":"query","schema":{"type":"string","default":"/"},"example":"/es"}],"responses":{"200":{"description":"Public page as Markdown.","content":{"text/markdown":{"schema":{"type":"string"}}}},"404":{"description":"Markdown error with discovery links.","content":{"text/markdown":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"Problem":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"type":{"type":"string","const":"about:blank"},"title":{"type":"string","minLength":1},"status":{"type":"integer","minimum":400,"maximum":599},"detail":{"type":"string","minLength":1},"code":{"type":"string","minLength":1},"resolution":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"issues":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"array","items":{"type":"string"}}}},"required":["type","title","status","detail","code","resolution","error"],"additionalProperties":false}}}}