Patients
The hwi-patients endpoint allows you to create and manage patient records independently of device activation. Patient records created here are shared across all HWI Devices linked to the same external_id, making this the recommended way to manage patient data at scale.
The Patient Object
| Field | Type | Required | Description |
|---|---|---|---|
external_id | string | Yes | Your unique identifier for this patient. Used as the lookup key for all GET, PUT, PATCH, and DELETE requests. |
name | string | No | Patient’s full name. |
address | string | No | Street address. Required for address verification. |
city | string | No | City. Required for address verification. |
state | string | No | State. Required for address verification. |
zip_code | string | No | ZIP code. Required for address verification. |
phone_number | string | No | Used by Tenovi support for service requests and optional SMS notifications. |
email | string | No | Not validated. Used by Tenovi support for service requests. |
physician | string | No | Forwarded to the fulfillment team for per-provider shipping customizations (charges may apply). |
clinic_name | string | No | Clinic or organization name. |
care_manager | string | No | Name of the assigned care manager. |
sms_opt_in | boolean | No | Set to false if the patient has not consented to SMS messages. Defaults to true. |
confirm_address | boolean | No | Set to true to override Tenovi’s internal address verification. |
address_status | string | Read-only | Returns Verified or Invalid after address verification. |
address_verified_by | string | Read-only | Indicates the system used to verify the address. |
Create a Patient
POST /clients/{CLIENT_DOMAIN}/hwi/hwi-patients/The external_id field is required and must be unique across your account. If you submit a POST with an external_id that already exists, the request will be rejected.
Example request:
{ "external_id": "patient-001", "name": "Patrick Smith", "address": "18023 Sky Park Cir Suite H2", "city": "Irvine", "state": "CA", "zip_code": "92614", "phone_number": "18005935468", "email": "psmith@example.com", "physician": "Dr. Ian Russell", "clinic_name": "Flint Rehab", "care_manager": "Jordan Benoit", "sms_opt_in": true}Example response:
{ "external_id": "patient-001", "name": "Patrick Smith", "address": "18023 Sky Park Cir Suite H2", "city": "Irvine", "state": "CA", "zip_code": "92614", "phone_number": "18005935468", "email": "psmith@example.com", "physician": "Dr. Ian Russell", "clinic_name": "Flint Rehab", "care_manager": "Jordan Benoit", "sms_opt_in": true, "address_status": "Verified", "address_verified_by": "internal", "confirm_address": false}Address Verification
When a full address is provided (address, city, state, zip_code), Tenovi automatically attempts to verify it immediately when creating or updating a patient record. The result is returned in the address_status field.
address_status | Meaning |
|---|---|
Verified | Address passed internal validation. |
Invalid | Address could not be verified. Fulfillment requests using this address may trigger a Client Action Required webhook. |
If you have confirmed the address is correct despite the Invalid status (e.g., a rural address that fails automated lookup), set confirm_address: true to bypass verification.
{ "external_id": "patient-001", "address": "18023 Sky Park Cir Suite H2", "city": "Irvine", "state": "CA", "zip_code": "92614", "confirm_address": true}Retrieve a Single Patient Record
Use the patient’s external_id as the lookup key. The lookup is case-insensitive.
GET /clients/{CLIENT_DOMAIN}/hwi/hwi-patients/{external_id}/List all patients (paginated):
GET /clients/{CLIENT_DOMAIN}/hwi/hwi-patients/Use page and page_size to control pagination.
Update a Patient
Use PUT for a full update or PATCH for a partial update. Both use external_id as the lookup key.
PUT /clients/{CLIENT_DOMAIN}/hwi/hwi-patients/{external_id}/{ "external_id": "patient-001", "name": "Patrick Smith", "phone_number": "7144185658", "sms_opt_in": false}If you update the address, Tenovi will re-run address verification automatically unless confirm_address: true is included.
Delete a Patient
DELETE /clients/{CLIENT_DOMAIN}/hwi/hwi-patients/{external_id}/Returns 204 No Content on success. Deleting a patient record does not deactivate linked HWI Devices, but those devices will no longer have patient data associated with them.
Relationship to HWI Devices
Patient records created via hwi-patients are the same records used in the nested patient object on hwi-devices. The external_id is the shared key.
Activating a Device
If a patient record already exists, include the external_id in the nested patient object when activating a device. Tenovi will link the device to the existing patient rather than creating a duplicate.
{ "device": { "name": "Tenovi BPM - L" }, "patient": { "external_id": "patient-001" }}Patient Data in Webhooks
The patient_id field in both measurement and fulfillment webhooks maps to the patient’s external_id. This is the stable identifier you should use to link webhook data back to patients in your system - it does not change when a gateway is replaced or unlinked.
{ "hwi_device_id": "12345678-abcd-1234-abcd-1234567890ab", "patient_id": "patient-001", "hardware_uuid": "aabbcc001122", ...}Common Issues
external_id already exists
Each external_id must be unique. If you receive a conflict error on POST, use PUT or PATCH to update the existing record instead, or use a GET request to check whether the patient already exists before creating.
address_status: Invalid blocking fulfillment
Tenovi will flag fulfillment requests with unverified addresses, which triggers a Client Action Required webhook. Resolve this before submitting fulfillment by either correcting the address or setting confirm_address: true if you have independently verified it.
Patient data not appearing on a device
If a patient was created via hwi-patients but the device was activated without a patient object, use PUT /hwi-devices/{id}/ to attach the patient by external_id.
SMS opt-in default
sms_opt_in defaults to true. If you have not collected explicit patient consent for SMS, set this to false at creation time.