{"openapi":"3.1.1","jsonSchemaDialect":"https://json-schema.org/draft/2020-12/schema","info":{"title":"Dr. Frank Lipman Public Content API","summary":"Read-only access to published Dr. Frank Lipman content.","description":"Search and retrieve public articles and podcasts from drfranklipman.com. The API is unauthenticated and read-only. It does not expose patient data, private editorial data, forms, administrative operations, or individualized medical advice.","version":"1.0.0","termsOfService":"https://www.drfranklipman.com/terms-and-conditions","license":{"name":"All rights reserved","url":"https://www.drfranklipman.com/terms-and-conditions"},"contact":{"name":"Dr. Frank Lipman website","url":"https://www.drfranklipman.com/contact-us"}},"servers":[{"url":"https://www.drfranklipman.com","description":"Production"}],"security":[],"tags":[{"name":"Discovery","description":"Machine-readable service discovery."},{"name":"Published content","description":"Unauthenticated read-only articles and podcasts."}],"externalDocs":{"description":"Dr. Frank Lipman developer and agent resources","url":"https://www.drfranklipman.com/developers"},"paths":{"/api":{"get":{"tags":["Discovery"],"summary":"Get the public API index","description":"Returns the API name, version, documentation, OpenAPI URL, MCP endpoint, and available operations.","operationId":"getPublicApiIndex","x-function-calling-compatible":true,"responses":{"200":{"description":"Public API discovery index.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiIndex"}}}},"405":{"description":"The endpoint is read-only.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/v1/content":{"get":{"tags":["Published content"],"summary":"Search and browse published content","description":"Returns a typed, paginated collection of published articles or podcasts. Search is title/body aware. Article searches default to relevance; unfiltered requests default to newest first.","operationId":"listPublishedContent","x-function-calling-compatible":true,"parameters":[{"name":"content_type","in":"query","description":"Published collection to query. Defaults to article.","required":false,"schema":{"type":"string","enum":["article","podcast"],"default":"article"}},{"name":"q","in":"query","description":"Full-text search query. Required when sort is relevance.","required":false,"schema":{"type":"string","minLength":1,"maxLength":120}},{"name":"category","in":"query","description":"Exact published category name.","required":false,"schema":{"type":"string","minLength":1,"maxLength":80}},{"name":"sort","in":"query","description":"Ordering. Relevance is available only for article searches with q; otherwise newest is the default.","required":false,"schema":{"type":"string","enum":["relevance","newest","oldest","az"]}},{"name":"author","in":"query","description":"Set to frank to return only Dr. Frank Lipman's articles.","required":false,"schema":{"type":"string","enum":["frank"]}},{"name":"page","in":"query","description":"One-based result page.","required":false,"schema":{"type":"integer","minimum":1,"maximum":250,"default":1}},{"name":"page_size","in":"query","description":"Number of results per page.","required":false,"schema":{"type":"integer","minimum":1,"maximum":48,"default":24}}],"responses":{"200":{"description":"Paginated published content.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListContentResponse"}}}},"400":{"description":"One or more query parameters are invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"405":{"description":"The endpoint is read-only.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"The content service is temporarily unavailable.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/v1/content/{contentType}/{slug}":{"get":{"tags":["Published content"],"summary":"Get one published content item","description":"Returns one published article or podcast by its collection and lowercase URL slug, including body text when available.","operationId":"getPublishedContentBySlug","x-function-calling-compatible":true,"parameters":[{"name":"contentType","in":"path","description":"Published content collection.","required":true,"schema":{"type":"string","enum":["article","podcast"]}},{"name":"slug","in":"path","description":"Published lowercase URL slug.","required":true,"schema":{"type":"string","minLength":1,"maxLength":240,"pattern":"^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"}}],"responses":{"200":{"description":"Published content record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicContentDetail"}}}},"400":{"description":"The content type or slug is invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"No published content matches the supplied type and slug.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"405":{"description":"The endpoint is read-only.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"503":{"description":"The content service is temporarily unavailable.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}}},"components":{"schemas":{"ApiIndex":{"type":"object","additionalProperties":false,"required":["name","description","version","documentation_url","openapi_url","mcp","endpoints"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"version":{"type":"string"},"documentation_url":{"type":"string","format":"uri"},"openapi_url":{"type":"string","format":"uri"},"mcp":{"type":"object","additionalProperties":false,"required":["transport","endpoint","manifest_url"],"properties":{"transport":{"type":"string","const":"streamable-http"},"endpoint":{"type":"string","format":"uri"},"manifest_url":{"type":"string","format":"uri"}}},"endpoints":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["method","path","operation_id","description"],"properties":{"method":{"type":"string","const":"GET"},"path":{"type":"string"},"operation_id":{"type":"string"},"description":{"type":"string"}}}}}},"ListContentResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"content_type":{"type":"string","enum":["article","podcast"],"description":"The published content collection to query."},"slug":{"type":"string"},"title":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"author":{"anyOf":[{"type":"string"},{"type":"null"}]},"published_on":{"anyOf":[{"type":"string"},{"type":"null"}]},"category":{"anyOf":[{"type":"string"},{"type":"null"}]},"tags":{"type":"array","items":{"type":"string"}},"platform":{"anyOf":[{"type":"string"},{"type":"null"}]},"canonical_url":{"type":"string","format":"uri"},"api_url":{"type":"string","format":"uri"},"markdown_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"external_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"image_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}},"required":["id","content_type","slug","title","description","author","published_on","category","tags","platform","canonical_url","api_url","markdown_url","external_url","image_url"],"additionalProperties":false}},"meta":{"type":"object","properties":{"page":{"type":"integer","minimum":1,"maximum":9007199254740991},"page_size":{"type":"integer","minimum":1,"maximum":9007199254740991},"page_count":{"type":"integer","minimum":0,"maximum":9007199254740991},"total":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["page","page_size","page_count","total"],"additionalProperties":false},"links":{"type":"object","properties":{"self":{"type":"string","format":"uri"},"next":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"previous":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}},"required":["self","next","previous"],"additionalProperties":false}},"required":["data","meta","links"],"additionalProperties":false},"PublicContentDetail":{"type":"object","properties":{"id":{"type":"string"},"content_type":{"type":"string","enum":["article","podcast"],"description":"The published content collection to query."},"slug":{"type":"string"},"title":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"author":{"anyOf":[{"type":"string"},{"type":"null"}]},"published_on":{"anyOf":[{"type":"string"},{"type":"null"}]},"category":{"anyOf":[{"type":"string"},{"type":"null"}]},"tags":{"type":"array","items":{"type":"string"}},"platform":{"anyOf":[{"type":"string"},{"type":"null"}]},"canonical_url":{"type":"string","format":"uri"},"api_url":{"type":"string","format":"uri"},"markdown_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"external_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"image_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}]},"body_text":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","content_type","slug","title","description","author","published_on","category","tags","platform","canonical_url","api_url","markdown_url","external_url","image_url","subtitle","body_text"],"additionalProperties":false},"ProblemDetails":{"type":"object","additionalProperties":true,"required":["type","title","status","detail","instance","code","message","resolution_hint"],"properties":{"type":{"type":"string","format":"uri","description":"Stable URI identifying the problem class."},"title":{"type":"string","description":"Short human-readable problem title."},"status":{"type":"integer","minimum":400,"maximum":599},"detail":{"type":"string","description":"Request-specific explanation."},"instance":{"type":"string","description":"Path identifying the request that produced the error."},"code":{"type":"string","enum":["INVALID_ARGUMENT","NOT_FOUND","METHOD_NOT_ALLOWED","SERVICE_UNAVAILABLE"],"description":"Stable machine-readable error code."},"message":{"type":"string","description":"Agent-readable error message."},"resolution_hint":{"type":"string","description":"Concrete guidance for recovering from the error."},"errors":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}}}}