Care Entry Workflow
A caregiver finishes a patient visit and dictates a short voice note describing what they did during the visit. Your nursing-home information system turns it into a structured care entry with identified interventions, administered medications and consumables, ready for billing and patient records.
Technically, this recipe is identical to the Field Service Voice Intake recipe, same endpoints, same call sequence, same catalogue-reduction pattern. Only the domain wording, the catalogues and the prompt template names differ. If you've already read Field Service, this recipe will be very fast.
The workflow at a glance
┌──────────────┐ ┌────────────┐ ┌──────────┐
│ Caregiver │ │ Your CIS │ │ xander │
└──────┬───────┘ └─────┬──────┘ └─────┬────┘
│ voice note │ │
│─────────────────>│ │
│ │ 1. transcribe │
│ │────────────────>│
│ │ 2. care report │
│ │ + classify │
│ │────────────────>│
│ │ 3. SELECT FROM │
│ │ catalog WHERE│
│ │ cat IN (...) │
│ │ (your DB) │
│ │ 4a. interventions
│ │ 4b. medications │
│ │ 4c. consumables │
│ │ (parallel) │
│ │────────────────>│
│ │ 3 results │
│ │<────────────────│
│ │ persist care │
│ │ entry │
Healthcare catalogues (interventions, medications, consumables) are typically large and ambiguous, many similarly named medications, many overlapping intervention codes. Sending the entire pharmacopoeia to xander as context will both blow your bill and produce poor matches. Always pre-filter by ward, patient profile, prescribed medication list, or intervention category before passing the catalogue to step 4.
Step 1: Transcribe the voice note
Same call as Field Service step 1. Use POST /prompt/audioTranscription
for short notes (under ~20 minutes). Set the language explicitly for better
domain-specific recognition (medical vocabulary).
curl -X POST "$XANDER_BASE_URL/prompt/audioTranscription" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"AudioInput": {
"AudioFile": {
"Base64AudioFile": "<base64-encoded audio bytes>",
"FileName": "visit-2026-04-11-0930.m4a",
"AudioType": "audio/mp4"
}
},
"Options": {
"PromptIdentification": {
"ProjectId": "your-project-id",
"Promptname": "care-entry/audio_transcription"
},
"SessionMetadata": {
"UseCaseName": "care-entry-workflow",
"UseCaseSessionId": "<visit id from your CIS>"
}
},
"TranscriptionOptions": {
"AudioLanguage": { "LanguageCodeIso639": "de" },
"TargetLanguage": { "LanguageCodeIso639": "de" }
}
}'
Tip: domain dictionary
For domains with specialised vocabulary (drug names, diagnostic terms), pass a
QueryParameter named dictionary with a list of terms the
model should be aware of. This dramatically improves the transcription accuracy of
proper names.
"QueryParameter": [
{ "Name": "dictionary", "Value": "Furosemid, Pantoprazol, Metformin, Ramipril" }
]
Step 2: Generate a care report and identify coarse categories
Use POST /prompt/informationextraction with a free-form prompt to
generate a Markdown care report and a list of category hints (e.g. "vital-signs check",
"medication administration", "wound care"). You'll use these to filter your catalogues
in step 3.
curl -X POST "$XANDER_BASE_URL/prompt/informationextraction" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"UserQuery": {
"UserQueryText": "<the transcript from step 1>"
},
"QueryParameter": [],
"Options": {
"PromptIdentification": {
"ProjectId": "your-project-id",
"Promptname": "care-entry/care_report_summary"
},
"SessionMetadata": {
"UseCaseName": "care-entry-workflow",
"UseCaseSessionId": "<same visit id>"
}
}
}'
Step 3: Reduce your catalogues (in your CIS)
Filter your interventions, medications and materials catalogues by the patient's care plan, the categories from step 2, and any business rules you have. Aim for a few dozen candidates per category.
SELECT articleNumber, name, unit
FROM intervention_catalog
WHERE category IN (...) AND wardCode = $patient.ward;
SELECT sysId, name, dose, unit
FROM medication_catalog
WHERE id IN (SELECT medicationId FROM patient_prescriptions WHERE patientId = $patient.id);
SELECT articleNumber, name
FROM consumable_catalog
WHERE category IN (...);
Step 4: Identify interventions, medications and consumables (in parallel)
Three parallel POST /prompt/informationextraction-structured calls. Each
gets the transcript plus the relevant reduced catalogue and a JSON schema describing
the response shape.
Step 4a: Identify interventions
curl -X POST "$XANDER_BASE_URL/prompt/informationextraction-structured" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"UserQuery": { "UserQueryText": "" },
"QueryParameter": [
{ "Name": "Leistungskatalog", "Value": "<reduced interventions catalogue>" },
{ "Name": "Leistungsbeschrieb", "Value": "<the transcript from step 1>" }
],
"Options": {
"PromptIdentification": {
"ProjectId": "your-project-id",
"Promptname": "care-entry/identify_interventions"
},
"SessionMetadata": {
"UseCaseName": "care-entry-workflow",
"UseCaseSessionId": "<same visit id>"
}
},
"OutputStructure": {
"JsonSchemaDefinition": "{\"type\":\"object\",\"properties\":{\"interventions\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/$defs/Intervention\"}}},\"required\":[\"interventions\"],\"additionalProperties\":false,\"$defs\":{\"Intervention\":{\"type\":\"object\",\"properties\":{\"articleNumber\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"reason\":{\"type\":\"string\"},\"confidence\":{\"type\":\"number\",\"description\":\"1=low, 5=medium, 10=high\"},\"quantity\":{\"type\":\"number\"}},\"required\":[\"articleNumber\",\"name\",\"reason\",\"confidence\",\"quantity\"],\"additionalProperties\":false}}}"
}
}'
Step 4b: Identify medications
Same shape, with the medication catalogue. Note: medication identification is the most safety-critical of the three. Use confidence-score filtering aggressively in your UI and never auto-bill medications below a high confidence threshold without human review.
"QueryParameter": [
{ "Name": "Leistungsbeschrieb", "Value": "<the transcript from step 1>" },
{ "Name": "Medikamentenkatalog", "Value": "<reduced medications catalogue>" }
]
Step 4c: Identify consumables / materials
"QueryParameter": [
{ "Name": "Leistungsbeschrieb", "Value": "<the transcript from step 1>" },
{ "Name": "Materialkatalog", "Value": "<reduced consumables catalogue>" }
]
Gotchas and tips
-
Patient PII in correlation IDs. Use opaque IDs (your CIS visit ID),
not patient names or social insurance numbers, in
UseCaseSessionId. The correlation ID lands in our internal logs and we don't need PII there. - Pre-filter medications by patient prescription list. The single biggest accuracy gain in this workflow is constraining the medication catalogue to what the patient is actually prescribed. A patient on 8 medications produces much better results than the entire ward's pharmacopoeia.
- Confidence thresholds for billing. A confidence score of 9-10 is typically safe to auto-bill; 6-8 should go to a human reviewer; below 6 is a strong signal that the intervention or medication was either not actually performed or that your catalogue is missing the right entry.
-
Prompt provisioning. The
Promptnamevalues shown (care-entry/identify_interventionsetc.) are placeholders. Your xander contact will agree the actual template names with you when they provision the prompts for your tenant.
Next
For document-based workflows (delivery notes, prescriptions, lab reports, scanned forms) instead of voice, see PDF Document Extraction. For long handover or shift-change recordings, see Meeting Helper and the async transcription pattern.