Digital Observation Body-mapping System — REST API Reference
{
"name": "Jane Smith",
"pin": "1234"
}
{
"staff": { "id": 1, "name": "Jane Smith", "role": "admin" }
}
401 Invalid credentials.
None
{ "ok": true }
{
"staff": { "id": 1, "name": "Jane Smith", "role": "admin" }
}
401 No valid session.
Creates the default admin account if no staff members exist. Used during initial setup.
{ "ok": true, "seeded": true }
{
"currentPin": "1234",
"newPin": "5678"
}
{ "ok": true }
401 Current PIN incorrect.
{
"staff": [
{ "id": 1, "name": "Jane Smith", "role": "admin" }
]
}
{
"name": "New Staff",
"pin": "1234",
"role": "staff"
}
{ "staff": { "id": 2, "name": "New Staff", "role": "staff" } }
id (required) — Staff member ID
{
"name": "Updated Name",
"role": "admin"
}
id (required) — Staff member ID
{ "ok": true }
{
"residents": [
{ "id": 1, "firstName": "John", "lastName": "Doe", "roomNumber": "12" }
]
}
{
"firstName": "John",
"lastName": "Doe",
"roomNumber": "12",
"dateOfBirth": "1940-05-12"
}
id (required) — Resident ID
{
"firstName": "John",
"roomNumber": "14"
}
periodId (required) — Period ID to fetch entries for
{
"entries": [
{
"id": 1, "bodyView": "front",
"injuryType": "bruise", "description": "...",
"x": 120, "y": 340
}
]
}
{
"periodId": 1,
"residentId": 1,
"bodyView": "front",
"x": 120,
"y": 340,
"injuryType": "bruise",
"description": "Small bruise on left forearm",
"actionTaken": "Monitored",
"remediation": "",
"followUpDate": "2026-04-15",
"observationType": "injury",
"imageUrl": "",
"woundLength": 2.5,
"woundWidth": 1.0,
"woundDepth": 0
}
{
"entry": { ... },
"alert": null
}
{
"id": 1,
"description": "Updated description",
"actionTaken": "Applied dressing"
}
{
"residentId": 1,
"location": "Lounge",
"activity": "Watching TV",
"mood": 3,
"asleep": false,
"riskFlags": ["fall_risk"],
"notes": "",
"isIncident": false
}
{
"check": { ... },
"escalation": null
}
residentId (required) — Resident ID from (optional) — Start date ISO string to (optional) — End date ISO string
{ "checks": [ ... ] }
residentId (required) — Resident ID days (optional, default 7) — Number of days
{
"moodData": [ ... ],
"sleepData": [ ... ],
"incidentData": [ ... ],
"locationData": [ ... ],
"compliance": 85,
"summary": { "avgMood24h": 3.2, "totalChecks": 48 }
}
{
"residentId": 1,
"systolic": 120,
"diastolic": 80,
"pulse": 72,
"temperature": 36.8,
"respRate": 16,
"o2Saturation": 97,
"consciousness": "A",
"supplementalO2": false,
"notes": ""
}
{
"vitals": { ..., "news2Score": 2, "news2RiskLevel": "low" },
"escalation": null
}
{
"residentId": 1,
"entryType": "fluid",
"description": "Cup of tea",
"amountMl": 200,
"calories": 30,
"mealPeriod": "morning",
"refused": false,
"assistance": "independent",
"notes": ""
}
{
"entry": { ... },
"escalation": null
}
{
"residentId": 1,
"eyeOpening": 4,
"verbalResponse": 5,
"motorResponse": 6,
"pupilLeft": "reactive",
"pupilRight": "reactive",
"limbMovement": "normal",
"notes": ""
}
{
"neuro": { ..., "gcsTotal": 15 },
"escalation": null
}
residentId (required) — Resident ID
{
"periods": [
{ "id": 1, "residentId": 1, "label": "April 2026" }
]
}
{
"residentId": 1,
"label": "April 2026"
}
format (optional) — "csv" for CSV, omit for PDF type (optional, CSV only) — "entries" | "obs_checks" | "vitals" residentId (optional) — Filter to single resident from (optional) — Start date (ISO) to (optional) — End date (ISO) includePhotos (optional, PDF only) — "true" to include photos
PDF: Content-Type: application/pdf — Streams the report as a file download.
CSV: Content-Type: text/csv — Returns CSV with columns specific to the type.
entries: Date, Time, Staff, Resident, Room, Type, Category, Body View, Description, Action Taken, Remediation, Follow-up Date, Wound L/W/D (cm), Photo URL obs_checks: Date, Time, Staff, Resident, Room, Location, Activity, Mood, Asleep, Incident, Risk Flags, Notes vitals: Date, Time, Staff, Resident, Systolic, Diastolic, Pulse, Temp, Resp Rate, O2 Sat, Consciousness, NEWS2 Score
{
"alerts": [
{
"id": 1,
"residentId": 1,
"type": "repeat_location",
"severity": "high",
"status": "pending"
}
]
}
{
"id": 1,
"status": "reviewed",
"notes": "Investigated - no concern"
}