Server-side APIEndpointsPublic profiles

Read a public profile

The one call that returns a profile in full — slug, gallery, FAQs and SEO metadata.

GET /v1/public-profiles/:profileId

A 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

NameTypeRequiredDescription
profileIdnumberYesFor profileType=USER, the doctor's user id — the same doctors[].id from workspace detail. For WORKSPACE, the workspace id.

Query parameters

NameTypeRequiredDescription
profileTypestringYesUSER for a practitioner, WORKSPACE for the clinic. Omitting it is a 400.

Try it

GET/v1/public-profiles/:profileId

The only route that goes through medos's enrich(), so the only source of slug, gallery, faqs and seo.

Path

Query

Request
GET /v1/public-profiles/?profileType=USER
to https://api.medos.one
Use 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"
}
FieldMeaning
idThe profile row's own id — not the doctor. Do not use it as profileId.
profileIdThe doctor's user id (or the workspace id), and the value this route takes in its path.
publishedfalse means a draft the clinic has not made public. Respect it on a patient-facing page.
slug, gallery, faqs, socialLinks, workHistory, seoThe enriched fields. Populated here and nowhere else.
descriptionRich-text HTML as stored. Sanitise before rendering.

Common failures

StatusCause
400profileType missing.
404No 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.

On this page