Content Library & Medical Services
When to reach for the three lookup families — Content Library, Medical Services, and Specializations — with one worked request and the practical rules for each.
Alongside the check flow, the Symptom & Illness Check API exposes three lookup families that work without an ongoing check — no check-id header, just authentication. Use them to build search screens, "find a doctor" features, and the bridge between a report and local care.
Content Library
Content Library is the medical knowledge base the checks themselves run on: every symptom and illness with descriptions, categories, ICD-10/UMLS codes, and the medical sources behind them. Reach for it when you build a symptom/illness search or autocomplete (for example to obtain a mainSymptomId for initialization), an illness detail page, or when you need to show the publications an illness's content is based on. Endpoints: universal search, illness list, illness details, illness sources, and symptom details.
Example: search by term
GET /v1/contentLibrary?top=5&searchTerm=tension%20headache
language: en{
"count": 73,
"items": [
{
"id": "3416dc71-b330-4b85-bc21-ef33ba0b3369",
"name": "Headache",
"type": "SYMPTOM",
"description": "Deep pain sensation in the head",
"isFrequent": true,
"code": { "coding": [{ "code": "C0018681" }] }
},
{
"id": "c1b6e0d4-2f3a-4e8b-9a71-5d2c8e4f6a10",
"name": "Tension-type headache",
"type": "ILLNESS",
"description": "Tension-type headache is the most common form of headache...",
"isFrequent": true,
"code": { "coding": [{ "code": "G44.2" }] }
}
]
}The type field tells symptoms and illnesses apart in the mixed result list; the code carries the UMLS code for symptoms and the ICD-10 code for illnesses. Search matching can be medical rather than alphabetical, so result names do not always contain the search term literally. See GET /v1/contentLibrary for all parameters.
Notes
- Content Library paging:
countis the total number of items matching the filters, ignoringtopandskip— that is what makes it usable for paging. Page withtop/skipand keep showingcountas the overall total.
Medical Services
Medical Services finds real-world care providers — doctors, pharmacies, hospitals — by location and filters (name, gender, specialization, insurers, opening hours), plus location-independent virtual services. Reach for it when a report should end with "here is who can help nearby". The intended flow is: check what is supported in the country (features), fetch the available filters (filters), let the user pick values and apply them (filters/apply), then show a detail page (service details). If the user's map position can cross a border, run the selection through filters/borderChange; for telemedicine-style offers use virtual services.
Example: apply filters
POST /v1/services/filters/apply
language: en{
"genders": ["80e5d6f2-d486-45c7-8e3e-7e73e3dd0519"],
"location": { "latitude": 48.218323, "longitude": 16.32402 }
}{
"count": 1,
"items": [
{
"id": "e6d452f3-32c3-4738-a820-b3812b75583e",
"name": "Dr. Anna Beispiel",
"type": "DOCTOR",
"gender": "FEMALE",
"phone": "011234567",
"location": {
"country": "AT",
"zip": "1170",
"city": "Wien",
"address": "Musterstraße 1",
"latitude": 48.219104,
"longitude": 16.326217
},
"specializations": [
{ "id": "a7c31b02-88d4-4f2e-9c65-3d1e0b7a54c9", "name": "Dentist", "type": "DOCTOR" }
],
"openingHours": { "...": "..." },
"monogram": "AB"
}
],
"serviceDetailState": { "isAllFeaturesAvailable": true }
}The filter values (genders here) are not free text — they are the option ids returned by GET /v1/services/filters for that location. See POST /v1/services/filters/apply for the full parameter set, including selector for trimming the response.
Notes
- Medical Services counts differ: on filters/apply the
countis the number of items in the returned page, while on virtual services it is the total withouttop/skip. Don't assume the Content Library semantics carry over. - Filter keys come and go: on GET /v1/services/filters, any filter key except
namecan be absent — filters differ per country and per selected specialization type (for example, theHOSPITALtype has no gender filter, sogendersis omitted). Build the search form from the response instead of hardcoding filter keys. Exactly one ofcountryCodeorlocationmust be provided. - The 250-result cap and the radius rule: on filters/apply, the maximal result count is 250 — except when limiting by radius (
limit: { radius, unit }), where the cap does not apply but the radius itself is capped at 10 KM or MI, and the unit is required.locationis mandatory on this endpoint;gendersaccepts at most 2 values andspecializationsat most 15. - Virtual services are location-free: POST /v1/services/virtual has no
location/countryCodefiltering at all;typesis the only required body field.
Specializations
Specializations deals with medical specializations as filterable entities: list all specializations to build a specialization picker for the Medical Services filter, as the reference app does, and get localized details for XUND specialization ids. Reach for the details lookup when a report's illnesses carry specialization references (localSpecializations) and you want to turn those ids into named, localized specializations — for example to pre-fill the Medical Services specialization filter and route the patient to the right kind of doctor.
Example: localized details for XUND ids
GET /v1/specializations/convertFromXundSpecializationsAndGetDetails?xundSpecializationIds[]=84ed952b-cadf-42ad-a70d-71fdc6d5894d&xundSpecializationIds[]=85d0eae0-4123-4350-9c90-a5981f89363a
language: en{
"84ed952b-cadf-42ad-a70d-71fdc6d5894d": [
{
"id": "84ed952b-cadf-42ad-a70d-71fdc6d5894d",
"name": "Gastroenterology and Hepatology",
"type": "DOCTOR"
}
],
"85d0eae0-4123-4350-9c90-a5981f89363a": [
{
"id": "85d0eae0-4123-4350-9c90-a5981f89363a",
"name": "Visceral Surgery",
"type": "DOCTOR"
}
]
}The response maps each requested id to its own localized details, so the ids in the response equal the requested ones — the one-element array shape is kept for compatibility; ids that do not match a known specialization are silently omitted rather than rejected. See the reference page for language-fallback behavior.
Notes
- The specialization list is not country-specific: the
countryCodepath parameter of GET /v1/specializations/{countryCode} is required but ignored — the returned list is the same for every country.
Last updated on
Displaying the report
How XUND's own reference integration renders each report field — score, urgency, treatment advice, warning signs, quick solutions, factor scores — and why following it is the safe default.
Webhooks
Receive a notification on your server when a check finishes, and verify that each request is authentic.