{"openapi":"3.1.0","info":{"title":"OndaRx Public API","summary":"Read-only marketing catalog for OndaRx telehealth treatments.","description":"Unauthenticated REST API for listing OndaRx treatments and public pages. It does not expose intake, payments, chat, or patient data. Use this API when an agent needs programmatic treatment URLs, not clinical advice. Errors use RFC 9457 application/problem+json. Every response includes RateLimit and RateLimit-Policy (IETF draft-ietf-httpapi-ratelimit-headers-11) plus RateLimit-Limit and RateLimit-Reset. RateLimit-Remaining is sent as 0 on HTTP 429 only; success responses omit it because the Firewall SDK does not expose a live remaining count. The default policy is 120 requests per 60 seconds, enforced by the Vercel Firewall (per region); 429 responses also send Retry-After. Catalog JSON is not publicly cached. Production fails closed if the onda-catalog Firewall rule is missing.","version":"1.1.0","contact":{"name":"OndaRx","email":"help@ondarx.com","url":"https://ondarx.com/docs"}},"servers":[{"url":"https://ondarx.com","description":"OndaRx public origin"}],"tags":[{"name":"Catalog","description":"Public treatment and page listings."},{"name":"Meta","description":"Liveness and discovery."}],"paths":{"/api/v1/health":{"get":{"operationId":"getHealth","tags":["Meta"],"summary":"API liveness","description":"Returns a liveness payload so agents can confirm the public catalog API is reachable.","responses":{"200":{"description":"The API is up.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["status","name"],"properties":{"status":{"type":"string","enum":["ok"]},"name":{"type":"string","enum":["OndaRx"]}}}}}},"429":{"description":"Rate limit exceeded. Slow down and retry after Retry-After seconds.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Unexpected catalog failure.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/treatments":{"get":{"operationId":"listTreatments","tags":["Catalog"],"summary":"List treatments","description":"Lists every public OndaRx medication detail page with category, description, and Get Started intake path.","responses":{"200":{"description":"Treatment catalog.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["treatments"],"properties":{"treatments":{"type":"array","items":{"$ref":"#/components/schemas/Treatment"}}}}}}},"429":{"description":"Rate limit exceeded. Slow down and retry after Retry-After seconds.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Unexpected catalog failure.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/treatments/{slug}":{"get":{"operationId":"getTreatment","tags":["Catalog"],"summary":"Get one treatment","description":"Returns a single OndaRx medication by its product slug (for example glutathione or sildenafil).","parameters":[{"name":"slug","in":"path","required":true,"description":"Medication slug from the catalog.","schema":{"type":"string","enum":["tirzepatide-injection","semaglutide-injection","nad-plus","sermorelin-injection","glutathione","testosterone-replacement-therapy","enclomiphene","bhrt-cream","bhrt-injection","ed-plus","ed-max","female-libido-support","male-2-in-1","male-5-in-1","female"]}}],"responses":{"200":{"description":"Treatment found.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Treatment"}}}},"404":{"description":"Unknown slug.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Slow down and retry after Retry-After seconds.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Unexpected catalog failure.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/pages":{"get":{"operationId":"listPages","tags":["Catalog"],"summary":"List public pages","description":"Lists indexable OndaRx marketing, policy, contact, and developer URLs. Intake and admin routes are omitted.","responses":{"200":{"description":"Public page index.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["pages"],"properties":{"pages":{"type":"array","items":{"$ref":"#/components/schemas/CatalogPage"}}}}}}},"429":{"description":"Rate limit exceeded. Slow down and retry after Retry-After seconds.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Unexpected catalog failure.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}},"components":{"schemas":{"Treatment":{"type":"object","additionalProperties":false,"required":["slug","category","name","description","href","getStartedHref"],"properties":{"slug":{"type":"string","description":"Medication detail slug."},"category":{"type":"string","enum":["weight-loss","longevity","hormone-therapy","sexual-wellness","hair-growth"],"description":"Treatment vertical."},"name":{"type":"string"},"description":{"type":"string"},"href":{"type":"string","description":"Site-relative product page path."},"getStartedHref":{"type":"string","description":"Site-relative intake entry path."}}},"CatalogPage":{"type":"object","additionalProperties":false,"required":["path","title","description"],"properties":{"path":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"}}},"Problem":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","code"],"properties":{"type":{"type":"string","format":"uri","description":"RFC 9457 type URI pointing at the matching /docs heading."},"title":{"type":"string","description":"Short human-readable summary."},"status":{"type":"integer","description":"HTTP status code."},"detail":{"type":"string","description":"Human-readable explanation."},"code":{"type":"string","enum":["treatment_not_found","rate_limited","internal_error"],"description":"Stable machine-readable error code."}}}},"headers":{"RateLimit":{"description":"Current quota under policy \"default\" (IETF draft-ietf-httpapi-ratelimit-headers-11).","schema":{"type":"string","examples":["\"default\";t=60"]}},"RateLimitPolicy":{"description":"Advertised quota policy.","schema":{"type":"string","examples":["\"default\";q=120;w=60"]}},"RateLimitLimit":{"description":"Request quota for the current window (widely deployed header).","schema":{"type":"integer","examples":[120]}},"RateLimitRemaining":{"description":"Remaining requests. Sent as 0 on HTTP 429. Omitted on success because the Firewall SDK does not expose a live remaining count.","schema":{"type":"integer"}},"RateLimitReset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"RetryAfter":{"description":"Delta-seconds until a 429 client may retry (RFC 9110).","schema":{"type":"integer"}}}}}