Skip to content

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

FieldTypeRequiredDescription
external_idstringYesYour unique identifier for this patient. Used as the lookup key for all GET, PUT, PATCH, and DELETE requests.
namestringNoPatient’s full name.
addressstringNoStreet address. Required for address verification.
citystringNoCity. Required for address verification.
statestringNoState. Required for address verification.
zip_codestringNoZIP code. Required for address verification.
phone_numberstringNoUsed by Tenovi support for service requests and optional SMS notifications.
emailstringNoNot validated. Used by Tenovi support for service requests.
physicianstringNoForwarded to the fulfillment team for per-provider shipping customizations (charges may apply).
clinic_namestringNoClinic or organization name.
care_managerstringNoName of the assigned care manager.
sms_opt_inbooleanNoSet to false if the patient has not consented to SMS messages. Defaults to true.
confirm_addressbooleanNoSet to true to override Tenovi’s internal address verification.
address_statusstringRead-onlyReturns Verified or Invalid after address verification.
address_verified_bystringRead-onlyIndicates 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_statusMeaning
VerifiedAddress passed internal validation.
InvalidAddress 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.