Read a public profile
The one call that returns a profile in full — slug, gallery, FAQs and SEO metadata.
GET /v1/public-profiles/:profileIdA practitioner's or clinic's public-facing profile: who they are, what they
treat, their photographs, their FAQs. This is the only route that returns
the enriched record — everywhere else those fields come back null.
Reach for it when you are building a doctor page or a clinic microsite. For booking, the thin profiles already attached to workspace detail are enough.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
profileId | number | Yes | For profileType=USER, the doctor's user id — the same doctors[].id from workspace detail. For WORKSPACE, the workspace id. |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
profileType | string | Yes | USER for a practitioner, WORKSPACE for the clinic. Omitting it is a 400. |
Try it
/v1/public-profiles/:profileIdThe only route that goes through medos's enrich(), so the only source of slug, gallery, faqs and seo.
Path
Query
GET /v1/public-profiles/?profileType=USERhttps://api.medos.oneUse a dedicated test key, and put your browser's address on its allowlist
A Developer API key authenticates on its own, so it only works from the addresses registered against it — and this page calls from your browser, not your servers. Unless your own public address is on the list you get a 403 naming it, which is the allowlist doing its job. Your browser may also reach us over IPv6 even when your server does not, so the address in the error is often not the one you expected. The key here is kept in memory only and never written to storage, but create a test key for it and deactivate that key when you are done.
Request
curl -sG "https://api.medos.one/v1/public-profiles/4" \
-H "x-api-key: $MEDOS_API_KEY" \
--data-urlencode "profileType=USER"Response
{
"id": 88,
"profileType": "USER",
"profileId": 4,
"workspaceId": 1,
"name": "Dr. Meera Rao",
"prefix": "Dr.",
"specialization": "Physiotherapy",
"qualification": "MPT (Ortho)",
"experience": 11,
"designation": "Senior Consultant",
"registrationNumber": "KA-PT-4471",
"registrationAuthority": "Karnataka State Council",
"profileImageUrl": "https://…/meera.jpg",
"profileSummary": "Musculoskeletal and post-operative rehabilitation.",
"description": "<p>Full bio as rich text</p>",
"mode": ["OFFLINE"],
"services": ["Manual therapy", "Dry needling"],
"expertise": ["Lower back pain"],
"languages": ["English", "Kannada"],
"published": true,
"slug": "dr-meera-rao",
"gallery": [{ "id": 3, "category": "CLINIC", "url": "https://…/room.jpg" }],
"faqs": [{ "question": "Do I need a referral?", "answer": "No." }],
"socialLinks": {},
"workHistory": [],
"education": [],
"awards": [],
"seo": {},
"videoUrl": null,
"treatmentPhilosophy": null,
"whatToExpect": null,
"googleRating": 4.8,
"googleReviewUrl": "https://…",
"updatedAt": "2026-08-30T11:04:22"
}| Field | Meaning |
|---|---|
id | The profile row's own id — not the doctor. Do not use it as profileId. |
profileId | The doctor's user id (or the workspace id), and the value this route takes in its path. |
published | false means a draft the clinic has not made public. Respect it on a patient-facing page. |
slug, gallery, faqs, socialLinks, workHistory, seo | The enriched fields. Populated here and nowhere else. |
description | Rich-text HTML as stored. Sanitise before rendering. |
Common failures
| Status | Cause |
|---|---|
400 | profileType missing. |
404 | No profile for that id and type. A practitioner who has never had one is a normal case — fall back to their specialization from workspace detail. |
One profile per doctor per workspace
A doctor working at several locations of the same clinic has one profile, which is why workspace detail repeats it under every address they are mapped to.