ECP API Developer Resources

Explore Developer Guides and Reference Docs for ECP APIs and Data Sharing

ECP gives both customers and approved third-party software partners access to a number of ways to connect ECP, including HL7, batch CSV and other file-based exports, direct secure messaging, pre-built integrations, and real-time APIs.

This page covers ECP's two API-based methods of integrating with ECP as a partnered software vendor or community. These methods can be leveraged exclusively or in tandem.

ECP's API-based integration methods:

  • ECP Webhook API: Subscribe to events to receive immediate notifications when changes are made to resident census, resident profiles, resident contacts, user profiles, and more. This API is primarily used where the developer wishes to keep a third-party system in sync with ECP.

  • ECP REST API: This API allows you to programmatically create or access user profiles, residents, resident contacts, resident vital readings, and more. This API is primarily used where the developer wishes to trigger every specific action or access to data in ECP.

Developer guides and reference docs for ECP APIs

ECP's Webhook API

The purpose of ECP's Webhook API is to provide partners with real-time updates pertaining to communities’ residents, resident contacts, and users to sync systems and reduce manual data entry.

The sections below will outline getting connected, available event types, payload contents, and some sample JSON payloads. The events shared will vary based on every partner’s needs. For example, partners are not required to receive diet-related events if they cannot be utilized in a meaningful way.

Getting Connected

First and foremost, please submit an integration request to begin the process of becoming an official ECP Dev Partner. Once approved, ECP has exposed a webhook endpoint for partners to utilize to subscribe to events. This webhook transmits byte-sized JSON payloads to a callback URL exposed by partnered companies. The exposed URL must be capable of ingesting POST requests from ECP.

 

Event Types

Event Name Entity Affected Event Trigger Includes
allergy.update
See Sample
Resident Resident's documented allergies are updated via Resident File -> General tab root JSON
allergy Object
contact.create
See Sample
Resident Contact New resident contact is created via Resident File -> Contacts tab root JSON
contact Object
contact.residents Array
contact.delete Resident Contact Resident contact is removed via Resident File -> Contacts tab. root JSON
contact Object
contact.residents Array
contact.update Resident Contact Resident contact's information is updated via Resident File -> Contacts tab root JSON
contact Object
contact.residents Array
diet.update
See Sample
Resident Resident's diet information is updated via Resident File -> Diet tab root JSON
diet Object
levelOfCare.update
See Sample
Resident Resident's required level of care is either manually updated via Care Plan tab -> Level of Care Status or by completing an assessment root JSON
levelOfCare Object
resident.create
See Sample
Resident New resident is manually created via Add New Resident window
New resident is created via third-party integration
New resident is created via ECP CRM lead profile
Resident is transferred to ECP account
Resident is reactivated via Discharged Residents window (Note: Previously-sent residentId will not change)
root JSON
resident Object
resident.delete Resident Resident is discharged via Resident File or third-party integration
Resident is transferred from ECP account
root JSON
resident Object
resident.update Resident Any info provided in the Resident object is updated via Resident File window root JSON
resident Object
user.create
See Sample
User New user is manually created via User Logins window
New user is created via third-party integration
A deactivated user is reactivated via User Logins window (Note: Previously-sent userId will not change)
root JSON
user Object
user.update User Any info provided in the User object is updated via User Logins window or third-party integration root JSON
user Object
user.delete User User is deactivated via User Logins or third-party integration root JSON
user Object


JSON Objects

With each JSON payload, the following objects will be included to provide software partners up-to-date resident, resident contact, or user information. Depending on the event type, partners can choose which parts of each payload to process. The root JSON below includes the unique message ID, company/location IDs, what event occurred, and the date/time of when the event occurred. This information is sent with every event.

 
root JSON:

Key Value Data Type Description Always Specified
companyId String (GUID) Unique company (parent) identifier Yes
dataFormat String "JSON" Yes
eventName String Set to one of the following values based on event type:
"allergy.update" | "contact.create" | "contact.delete" | "contact.update" | "diet.update" | "levelOfCare.update" | "resident.create" | "resident.delete" | "resident.update" | "user.create" | "user.update" | "user.delete"
Yes
eventTimestamp String Date/time (UTC) of event, conforming to ISO 8601

Example Provided: "2025-05-05T13:37:27+00:00"
Yes
id String (GUID) Unique message identifier Yes
locationId String (GUID) Unique location (child) identifier No
version String API version Yes
 
resident Object:

The Resident object includes all basic information for the resident ID specified. This object is included in resident.create, resident.delete, and resident.update events.

Key Value Data Type Description Always Specified
building String Resident's building name No
careType String Resident's care type:
"Adult Day Care" | "Assisted Living" | "Group Home" | "Home Health" | "Independent Living" | "Memory Care" | "Other"
No
codeStatus String Indicates resident's current code status:
"Full Code" | "DNR (Do Not Resuscitate)"
No
dateOfBirth String Resident's date of birth Yes
email String Resident's email No
externalIds Object Collection of custom resident-related key/value pairs (Strings)(configured per location)

Example Provided: A community wants to send a billing-related ID to their dietary platform, so they can generate dining-related invoices that include this unique ID. This can be manually added to residents' profiles and sent as "billingid": "1234".
No
firstName String Resident's first name Yes
gender String Resident's gender:
"Male" | "Female" | "Other"
Yes
lastName String Resident's last name No
livingWill Boolean Indicates if resident has a living will Yes
middleName String Resident's middle name No
nickname String Resident's nickname No
otherAdvancedDirectives String Resident's other advanced directives No
phone String Resident's phone number No
residentId String (GUID) Unique resident identifier Yes
room String Resident's room label No
status String Resident's current status:
"Active" | "Inactive"

Example Provided: A hospital visit is typically set up as a temporary inactive status. The resident will not be fully discharged, but this field will be set to "Inactive" with a statusDescription of "Hospital".
Yes
statusDescription String Resident's current status description Yes
suffix String Resident's suffix No
 

diet Object:

The Diet object includes the diet plan(s), special diet order(s), food texture, and fluid consistency the specified resident requires. This object is included in resident-related diet.update events.

Key Value Data Type Description Always Specified
dietPlans Array of Strings Resident's current diet plan(s):
"2-gram Sodium" | "45-gram CCHO (Consistent Carbohydrate)" | "60-gram CCHO (Consistent Carbohydrate)" | "75-gram CCHO (Consistent Carbohydrate)" | "Clear Liquid" | "Diabetic Plate Method" | "Fat-Restricted" | "Fiber-Restricted" | "Full Liquid" | "Gluten-Free" | “Heart-Healthy (Cardiac)" | "HiCal/HiPro (High Calorie/High Protein)" | "Lactose Intolerant" | "Low-Fat Low-Cholesterol 2-gram Na+ (Cardiac)" | "No Added Salt (NAS)" | "No Concentrated Sweets (NCS)" | "Nothing By Mouth (NPO)" | "Pescatarian" | "Reduced Concentrated Sweets" | "Reduced Gluten" | "Regular/General" | "Renal" | "Renal Diabetic" | "Tube Feeding" | "Vegan" | "Vegetarian (+Lacto)" | "Vegetarian (+Lacto-Ovo)" | "Vegetarian (+Ovo)"
No
foodTexture String Resident's required food texture:
"Finger Food" | "Liquidized" | "Mechanical Soft" | "Minced & Moist" | "Pureed" | "Regular/Easy to Chew" | "Soft & Bite-Sized"
No
fluidConsistency String Resident's required fluid consistency:
"Thin" | "Slightly Thick" | "Mildly Thick" | "Moderately Thick" | "Extremely Thick"
No
residentId String (GUID) Unique identifier of resident that diet information relates to Yes
specialDietOrders Array of Strings Resident's special diet order(s)(custom) No
 

allergy Object:

The Allergy object includes the resident’s allergies currently documented. This will eventually be converted to record-based storage to differentiate between drug, food, and environmental allergies. This object is included in resident-related allergies.update events.

Key Value Data Type Description Always Specified
allergies Array of Strings Resident's current allergies
Yes
residentId String (GUID) Unique identifier of resident that allergies relate to Yes
 

levelOfCare Object:

The Level of Care object includes the most up-to-date level of care information for the resident specified. LOC updates are made manually or when completing an assessment of a resident’s needs. This object is included in resident-related levelOfCare.update events.

Key Value Data Type Description Always Specified
amount Float The dollar amount (with cents) set as the recurring charge for the newly assigned level of care. If an assessment includes point overages that led to extra recurring cost, those would be reflected here. No
amountFrequency String Frequency of newly assigned level of care:
"Monthly" | "Daily"
No
effectiveTimestamp String Date/time (UTC) of when level of care change takes effect, conforming to ISO 8601

Example Provided: "2025-05-05T13:37:27+00:00"
No
name String Name of newly assigned level of care No
residentId String (GUID) Unique identifier of resident that level of care relates to Yes
 

contact Object:

The Contact object includes resident contacts’ information added to a resident’s profile. Only one contact will be sent per create/update/delete event. This object is included in contact-related contact.create, contact.delete, and contact.update events.

Key Value Data Type Description Always Specified
address String Resident contact’s address 1 + address 2 values No
city String Resident contact’s city No
contactId String (GUID) Unique contact identifier Yes
email String Resident contact’s email No
firstName String Resident contact’s first name Yes
lastName String Resident contact’s last name No
phone String Resident contact’s phone number No
phoneCell String Resident contact’s cellphone number No
phoneWork String Resident contact’s work phone number No
preferredContactMethod String Resident contact’s preferred contact method:
"Phone" | "Text" | "Email"
No
preferredContactTime String Resident contact’s preferred time to be contacted:
"Morning" | "Afternoon" | "Evening"
No
residents Array of Objects See contact.residents information below Yes
state String Resident contact’s state No
zip String Resident contact’s zip code No
 

contact.residents Array:

Since a contact can relate to multiple residents, contact.resident is sent as an array of objects. This array is included in the contact object sent with contact.create, contact.delete, and contact.update events.

Key Value Data Type Description Always Specified
billingContact Boolean Indicates whether contact is marked a billing contact Yes
healthCarePoa Boolean Indicates whether contact is marked resident’s health care power of attorney Yes
healthCarePoaActivated Boolean If contact is resident’s health care power of attorney, indicates if POA is activated No
notes String Notes attached to contact’s information No
primaryContact Boolean Indicates whether contact is marked primary Yes
providesProducts Boolean Indicates whether contact provides products and/or medications for resident Yes
relationship String Resident contact’s relation to resident No
residentId String (GUID) Unique identifier of resident that contact relates to Yes
stateAppointedGuardian Boolean Indicates whether contact is marked resident’s state-appointed guardian Yes
 

user Object:

The User object includes all basic information for the specified user/employee ID, as well as locations they’re allowed access to. This object is included in user-related user.create, user.delete, and user.update events.

Key Value Data Type Description Always Specified
chartingInitials String User’s charting initials Yes
email String User’s email No
firstName String User’s first name Yes
lastName String User’s last name Yes
locationsAllowed Array of GUIDs Unique identifiers of locations the user has access to Yes
phone String User’s phone number No
phoneCell String User’s cellphone number No
role String User’s role:
"Owner" | "Director" | "Manager" | "Nursing" | "Med Passer" | "Caregiver" | "Operations" | "Finance" | "Life Enrichment" | "Dietary" | "Maintenance" | "Housekeeping" | "Administrative" | "IT" | "Human Resources" | "Community Relations" | "Pharmacy" | "Outside Provider"
Yes
title String User’s job title No
userId String (GUID) User’s ID Yes

 

 

 

Sample Payloads

resident.create:
{
    "companyId": "93AF182E-C2E5-434E-9804-D2BBA7326630",
    "data": {
        "resident": {
            "building": "Main Building",
            "careType": null,
            "codeStatus": "Full Code",
            "dateOfBirth": "1991-01-01T00:00:00",
            "email": "testemail@email.com",
            "externalIds": {
                "billingid": "123456"
            },
            "firstName": "James",
            "gender": "Male",
            "lastName": "Tester",
            "livingWill": true,
            "middleName": "I",
            "nickname": "Jim",
            "otherAdvancedDirectives": null,
            "phone": "555-555-5555",
            "residentId": "E062E995-B6B0-4332-9B19-AAD64E5CB048",
            "room": "101",
            "status": "Active",
            "statusDescription": "Active Resident",
            "suffix": "Jr."
        }
    },
    "dataFormat": "JSON",
    "eventName": "resident.create",
    "eventTimestamp": "2025-01-01T16:43:48.473",
    "id": "E67F8529-D123-E345-9575-XO8CXO677BFJ",
    "locationId": "1F1E8529-A69C-4A8D-9575-DE8C7B661BEE",
    "version": "1.0"
}
            

 

diet.update:
{
    "companyId": "93AF182E-C2E5-434E-9804-D2BBA7326630",
    "data": {
        "diet": {
            "dietPlans": [
                "Fat-Restricted",
                "Gluten-Free"
            ],
            "fluidConsistency": "Thin",
            "foodTexture": "Regular/Easy to Chew",
            "residentId": "6B74A89D-71FC-49DB-9035-8005A6E9CC77",
            "specialDietOrders": [
                "1500 Calorie",
                "Minced Meats"
            ]
        }
    },
    "dataFormat": "JSON",
    "eventName": "diet.update",
    "eventTimestamp": "2025-02-08T17:47:21.823",
    "id": "42F81723-75BB-450F-BDEE-3FD237C72157",
    "locationId": "1F1E8529-A69C-4A8D-9575-DE8C7B661BEE",
    "version": "1.0"
}
            

 

allergy.update
{
    "companyId": "93AF182E-C2E5-434E-9804-D2BBA7326630",
    "data": {
        "allergy": {
            "allergies": [
                "Gluten",
                "Peanuts",
                "Bees",
                "Latex",
                "Penicillin"
            ],
            "residentId": "6B74A89D-71FC-49DB-9035-8005A6E9CC77"
        }
    },
    "dataFormat": "JSON",
    "eventName": "allergy.update",
    "eventTimestamp": "2025-02-02T17:47:21.823",
    "id": "44999E915-BFF7-4A83-A6A7-7430FC4D2C11",
    "locationId": "1F1E8529-A69C-4A8D-9575-DE8C7B661BEE",
    "version": "1.0"
}

 

levelOfCare.update
{
    "companyId": "93AF182E-C2E5-434E-9804-D2BBA7326630",
    "data": {
        "levelOfCare": {
            "amount": 1500.00,
            "amountFrequency": "Monthly",
            "effectiveTimestamp": "2024-02-02T17:47:21.823",
            "name": "Pro Max",
            "residentId": "6B74A89D-71FC-49DB-9035-8005A6E9CC77"
        }
    },
    "dataFormat": "JSON",
    "eventName": "levelOfCare.update",
    "eventTimestamp": "2025-02-02T17:47:21.823",
    "id": "44999E915-BFF7-4A83-A6A7-7430FC4D20IT",
    "locationId": "1F1E8529-A69C-4A8D-9575-DE8C7B661BEE",
    "version": "1.0"
}

 

contact.create
{
    "companyId": "93AF182E-C2E5-434E-9804-D2BBA7326630",
    "data": {
        "contact": {
            "address": "123 Fake St.",
            "city": "Elkhorn",
            "contactId": "A239D0E1-5A78-4F05-9C10-54CCD4B807F8",
            "email": "john@email.com",
            "firstName": "John",
            "lastName": "Contact",
            "phone": "555-555-5556",
            "phoneCell": "555-555-5557",
            "phoneWork": "555-555-5558",
            "preferredContactMethod": "Phone",
            "preferredContactTime": "Afternoon",
            "residents": [
                {
                    "billingContact": false,
                    "healthCarePoa": false,
                    "healthCarePoaActivated": false,
                    "notes": "John visits every Monday.",
                    "primaryContact": false,
                    "providesProducts": false,
                    "relationship": "Son",
                    "residentId": "6B74A89D-71FC-49DB-9035-8005A6E9CC77",
                    "stateAppointedGuardian": false
                },
                {
                    "billingContact": false,
                    "healthCarePoa": true,
                    "healthCarePoaActivated": true,
                    "notes": "John visits every Monday.",
                    "primaryContact": false,
                    "providesProducts": false,
                    "relationship": "Son",
                    "residentId": "8684A89V-999C-4E0B-5565-966EBRE9CC77",
                    "stateAppointedGuardian": false
                }
            ],
            "state": "WI",
            "zip": "53121"
        }
    },
    "dataFormat": "JSON",
    "eventName": "contact.create",
    "eventTimestamp": "2024-02-06T17:47:21.823",
    "id": "C66E73B3-49E9-4CEB-83D6-1FAB44D72541",
    "locationId": "1F1E8529-A69C-4A8D-9575-DE8C7B661BEE",
    "version": "1.0"
}

 

user.create
{
    "companyId": "93AF182E-C2E5-434E-9804-D2BBA7326630",
    "data": {
        "user": {
            "chartingInitials": "JaBa",
            "email": "james@james.com",
            "firstName": "James",
            "lastName": "Baum",
            "locationsAllowed": [
                "D40ADCBD-1808-478A-9F76-A702403A0FD4",
                "1F1E8529-A69C-4A8D-9575-DE8C7B661BEE"
            ],
            "phone": "555-555-5555",
            "phoneCell": "555-555-5566",
            "role": "Nursing",
            "title": "VP of Clinical Services",
            "userId": "E635DCE9-D456-4F5B-A608-F6FBFA4D6A81"
        }
    },
    "dataFormat": "JSON",
    "eventName": "user.create",
    "eventTimestamp": "2024-02-06T17:47:21.823",
    "id": "C66E73B3-49E9-4CEB-83D6-1FAB44D72541",
    "locationId": "1F1E8529-A69C-4A8D-9575-DE8C7B661BEE",
    "version": "1.0"
}

 

ECP's REST API


ECP's REST API provides a programmatic interface to interact with ECP's core functionalities. This API empowers developers to build custom integrations and automate tasks, improving efficiency and data accuracy within the ECP platform.

The following API specifications outline the available API endpoints and associated data points.

Please submit an integration request to start building your connection and begin the process of becoming an official ECP Dev Partner.

Method: POST
URL: https://oauth2.ecp123.com/token
Description: This endpoint is utilized to retrieve a temporary bearer token that will be required in the headers of all REST API calls outlined in the sections below. Provided bearer tokens expire in 60 minutes.

Request Body:
Parameter Data Type Description Required
grant_type String Set to "client_credentials" Yes
client_id String OAuth client ID unique to each community's parent organization; Currently provided by ECP representative Yes
client_secret String Base64-encoded client secret unique to each community's parent organization; Decoded value currently provided by ECP representative Yes
scope String The scopes this OAuth client have access to OR the scopes being requested at this time Yes
Successful Response:
Parameter Data Type Description Required
token_type String Set to "Bearer" Yes
expires_in Number Number of seconds before bearer token expires Yes
access_token String

Bearer token to use in subsequent API calls

Yes
scope String

Echo of scopes requested

Yes
Request Body Sample:

{ "grant_type": "client_credentials", "client_id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", "client_secret": "lkinawekiginawkeuifnalksdfnalkwuenfaukwefluaksdf", "scope": "location.read vital.read vital.write" }

Method: GET
URL: https://api.ecp123.com/clinical/v1/location
Scope Required:
location.read
Description: This endpoint is utilized to retrieve the locations that the provided OAuth token has access to.

Headers:
Key Value Description Required
auth-bearer "Bearer [token returned from OAuth API endpoint]" Bearer token (expires in 60 minutes) Yes
authorization "Api-Key [key provided by ECP representative]" Key utilized across all locations/endpoints that vendor/company has access to Yes
Response:
Code Data Type Description Required
200 Array of Strings Array of location names that vendor/company has access to with provided OAuth token. No
400 String There was a problem with the request. No

Method: POST
URL:
https://api.ecp123.com/clinical/v1/resident
Scope Required:
resident.write
Description: This endpoint is utilized to create resident profiles in the ECP locationId specified. A unique identifier is returned to be stored and referenced if subscribed to ECP's Webhook API for future resident profile updates.

Headers:
Key Value Description Required
auth-bearer "Bearer [token returned from OAuth API endpoint]" Bearer token (expires in 60 minutes) Yes
authorization "Api-Key [key provided by ECP representative]" Key utilized across all locations/endpoints that vendor/company has access to" Yes
Request Body:
Parameter Data Type Description Required
building String (150) Resident's building name No
codeStatus String (9) Resident's current code status:
"Full Code" | "DNR"
No
dateOfBirth String (10) Resident's date of birth in YYYY-MM-DD format Yes
email String (100) Resident's email No
firstName String (30) Resident's first name Yes
gender String (6) Resident's gender:
"Male" | "Female" | "Other"
No
lastName String (30) Resident's last name Yes
livingWill Boolean Indicates if resident has a living will No
locationId String (36) Unique identifier associated with location the resident is assigned to Yes
middleName String (1) Resident's middle initial No
moveInDate String (10) Resident's move-in date in YYYY-MM-DD format
Note: If set to future date, resident will be given an "Awaiting Move-In" status
 
nickname String (30) Resident's nickname No
otherAdvancedDirectives String (300) Resident's other advanced directives No
phone String (16) Resident's phone number No
room String (16) Resident's room label No
suffix  String (6) Resident's suffix No
Response:
Parameter Data Type Description Required
result String Either "Success" or "Error" Yes
error String If an error occurred, the error message. Will fail if required fields are not provided OR location is invalid. No
residentId String (36)

GUID provided in response to POST resident

If sent with “Success” result, this will be the GUID of the newly created resident. If sent with “Error” result due to duplicate resident, this will be the GUID of the existing resident where first name, last name, DOB match.

No
Request Body Sample:
{
    "building": "West Wing",
    "codeStatus": "Full Code",
    "dateOfBirth": "1970-02-21",
    "email": "james@james.com",
    "firstName": "James",
    "gender": "Male",
    "lastName": "Baum",
    "livingWill": false,
    "locationId": "XXX12FF-XXXC-XXX2-843C-93AXXXX772F8",
    "middleName": "A",
    "moveInDate": "2025-01-05",
    "nickname": "Jim",
    "otherAdvancedDirectives": "This is a long text field.",
    "phone": "555-555-5555",
    "room": "1A",
    "suffix": "Sr."
}     

Method: POST
URL: https://api.ecp123.com/clinical/v1/resident/contact/
Scope Required: contact.write
Description: This endpoint is utilized to create resident contacts in the ECP locationId specified. A unique identifier is returned to be stored and referenced if subscribed to ECP's Webhook API for future Contact updates.

Headers:
Key Value Description Required
auth-bearer "Bearer [token returned from OAuth API endpoint]" Bearer token (expires in 60 minutes) Yes
authorization "Api-Key [key provided by ECP representative]" Key utilized across all locations/endpoints that vendor/company has access to" Yes
Request Body:
Parameter
Data Type
Description
Required
address
String (50)
Contact's address
No
billingContact
Boolean
Indicates whether contact is marked a billing contact
No
city
String (50)
Contact's city
No
email
String (100)
Contact's email
No
firstName
String (30)
Contact's first name
Yes
healthCarePoa
Boolean
Indicates whether contact is marked health care power of attorney
No
healthCarePoaActivated
Boolean
If contact is resident’s health care power of attorney, indicates if POA is activated 
No
lastName
String (30)
Contact's last name
Yes
locationId
String (36)
Unique GUID associated with location the contact’s resident is assigned to 
Yes
notes
String (300)
Contact-related notes
No
phone
String (16)
Contact's phone number
No
phoneCell
String (16)
Contact's cellphone number
No
phoneWork
String (16)
Contact's work phone number
No
preferredContactMethod
String (5)
Contact’s preferred contact method: 
“Phone” | “Text” | “Email” 
No
preferredContactTime
String (9)
Contact’s preferred time to be contacted: 
“Morning” | “Afternoon” | “Evening” 
No
primaryContact
Boolean
Indicates whether contact is marked primary 
No
providesProducts
Boolean
Indicates whether contact provides products and/or medications for resident 
No
relationship
String (100)
Contact’s relation to resident 
No
residentId
String (36)
Unique GUID associated with resident that contact relates to 
Yes
state
String (2)
Contact's state
No
stateAppointedGuardian
Boolean
Indicates whether contact is marked resident’s state-appointed guardian 
No
zip
String (9)
Contact’s zip code 
No
Response:
Parameter
Data Type
Description
Required
result
String
Either “Success” or “Error”. 
Yes
error
String
If an error occurred, the error message.

Will fail if required fields are not provided OR location is invalid. 
No
contactId
String (36)
GUID provided in response to POST contact 
If sent with “Success” result, this will be the GUID of the newly created contact. If sent with “Error” result due to duplicate contact, this will be the GUID of the existing contact where first name and last name match.
No
Request Body Sample:
{
    "address": "123 Main St.",
    "billingContact": 1,
    "city": "Fake City",
    "email": "jamies@email.com",
    "firstName": "Jamie",
    "healthCarePoa": 1,
    "healthCarePoaActivated": 1,
    "lastName": "Tester",
    "locationId": "XXX12FF-XXXC-XXX2-843C-93AXXXX772F8",
    "notes": "This is a long text field for additional notes.",
    "phone": "555-555-5556",
    "phoneCell": "555-555-5557",
    "phoneWork": "555-555-5558",
    "preferredContactMethod": "Phone",
    "preferredContactTime": "Morning",
    "primaryContact": 1,
    "providesProducts": 1,
    "relationship": "Daughter",
    "residentId": "2CXXXXFB-4XXE-4XX0-8XX6-1ECB6XXXX173",
    "state": "WI",
    "stateAppointedGuardian": 0,
    "zip": 53120
}     

Method: POST
URLs:
https://api.ecp123.com/clinical/v1/resident/vital/blood-ox
https://api.ecp123.com/clinical/v1/resident/vital/blood-pressure
https://api.ecp123.com/clinical/v1/resident/vital/blood-sugar
https://api.ecp123.com/clinical/v1/resident/vital/pulse
https://api.ecp123.com/clinical/v1/resident/vital/respirations
https://api.ecp123.com/clinical/v1/resident/vital/temperature
https://api.ecp123.com/clinical/v1/resident/vital/weight
Scope Required:
vital.write
Description:
These endpoints are utilized to add resident vital readings to residents' profiles in ECP. These seven endpoints are identical, with the exception of vital-specific fields/values required when posting to each. This information is specified in the table below. Please note, there are different ways to identify locations/users/residents. If not utilizing ECP's Webhook API, the location endpoint can be leveraged to retrieve required location names.

Headers:
Key Value Description Required
auth-bearer "Bearer [token returned from OAuth API endpoint]" Bearer token (expires in 60 minutes) Yes
authorization "Api-Key [key provided by ECP representative]" Key utilized across all locations/endpoints that vendor/company has access to" Yes
Request Body:
Parameter Data Type Description Required
(for blood-ox endpoint) bloodOx Number  Resident's blood ox reading Yes, but only when hitting /v1/resident/vital/blood-ox
(for blood-pressure endpoint) systolic Number Systolic portion of resident's blood pressure reading Yes, but only when hitting /v1/resident/vital/blood-pressure
(for blood-pressure endpoint) diastolic Number Diastolic portion of resident's blood pressure reading Yes, but only when hitting /v1/resident/vital/blood-pressure
(for blood-sugar endpoint) bloodSugar Number Resident's blood sugar reading Yes, but only when hitting /v1/resident/vital/blood-sugar
(for pulse endpoint) pulse Number Resident's pulse reading Yes, but only when hitting /v1/resident/vital/pulse
(for respirations endpoint) respirations Number Resident's respirations reading Yes, but only when hitting /v1/resident/vital/respirations
(for temperature endpoint) temperature Number Resident's temperature reading Yes, but only when hitting /v1/resident/vital/temperature
(for weight endpoint) weight Number Resident's weight reading Yes, but only when hitting /v1/resident/vital/weight
location String Resident's location (referencing names returned from v1/location endpoint) Yes, but only when using location instead of locationId to specify resident location
locationId String (36) Resident's locationId, a unique identifier shared via ECP representative or ECP's Webhook API Yes, but only when using locationId instead of location to specify resident location
loginName String Login Name of user recording vital reading Yes, but only when using loginName instead of userId to specify user recording vital
userId String (36) User's unique identifier shared via ECP's Webhook API Yes, but only when using userId instead of loginName to specify user recording vital
firstName String Resident's first name Yes, but only when passing FN + LN + DOB to identify resident
lastName String Resident's last name Yes, but only when passing FN + LN + DOB to identify resident
dateOfBirth String Resident's date of birth in YYYY-MM-DD format Yes, but only when passing FN + LN + DOB to identify resident
residentId String (36) Resident's unique identifier shared via ECP's Webhook API Yes, but only when passing residentId to identify resident
externalIdName String Resident's External ID field name Yes, but only when passing externalIdName + externalIdValue to identify resident
externalIdValue String Resident's External ID value corresponding with externalIdName Yes, but only when passing externalIdName + externalIdValue to identify resident
timestamp String Timestamp of when vital sign was recorded, conforming to ISO 8601

Example Provided: "2025-05-05T13:37:27+00:00"
Yes
Response:
Parameter Data Type Description Required
result String Either "Success" or "Error" Yes
error String If an error occurred, the error message. POST will fail if required fields are not provided. No
Request Body Sample:
{
    "weight": "180",
    "locationId": "XXX12FF-XXXC-XXX2-843C-93AXXXX772F8",
    "userId": "12314XX-XXXX-XXXX-XXXX-876XXXX888XX",
    "firstName": "James",
    "lastName": "Baum",
    "dateOfBirth": "1950-06-02",
    "timestamp": "2025-10-09T19:20:30+00:00",
}     

Method: GET
URLs:
https://api.ecp123.com/clinical/v1/resident/vital/blood-ox
https://api.ecp123.com/clinical/v1/resident/vital/blood-pressure
https://api.ecp123.com/clinical/v1/resident/vital/blood-sugar
https://api.ecp123.com/clinical/v1/resident/vital/pulse
https://api.ecp123.com/clinical/v1/resident/vital/respirations
https://api.ecp123.com/clinical/v1/resident/vital/temperature
https://api.ecp123.com/clinical/v1/resident/vital/weight
Scope Required:
vital.read
Description: These endpoints are utilized to retrieve vital readings for all residents in a specified ECP location.

Headers:
Key Value Description Required
auth-bearer "Bearer [token returned from OAuth API endpoint]" Bearer token (expires in 60 minutes) Yes
authorization "Api-Key [key provided by ECP representative]" Key utilized across all locations/endpoints that vendor/company has access to" Yes
Request Body:
Parameter Data Type Description Required
location String Residents' location (referencing names returned from v1/location/ endpoint) Yes, but only when using location instead of locationId to specify location
locationId String (36) Residents' locationId, a unique identifier shared via ECP representative or ECP's Webhook API Yes, but only when using locationId instead of location to resident location
startingDateTime String Start of date range of when vital signs were recorded, conforming to ISO 8601

Example Provided: "2025-05-05T13:37:27+00:00"
No
endingDateTime String End of date range of when vital signs were recorded, conforming to ISO 8601

Example Provided: "2025-05-05T13:37:27+00:00"
No
page Number Data will be paginated into batches of 100. Sorting will be by date/time. No
Response:
Parameter Data Type Description Required
result String Either "Success" or "Error" Yes
data Array
An array of objects of the form
{
   [vitalreading],
   location,
   timestamp,
   firstName,
   lastName,
   dateOfBirth,
   loginName,
   externalIds: [
 {externalIdName: externalIdValue},
   {externalIdName2: externalIdValue2},
     ...
   ]
}
 
Up to 100 entries will be returned (the result is paginated). Note that an array of all external IDs and their corresponding values will be returned in the object.
No
numberOfResults Number The total number of results (the response is paginated in batches of 100). Yes
error String If an error occurred, the error message. No
Request Body Sample:

{ "locationId": "XXX12FF-XXXC-XXX2-843C-93AXXXX772F8", "startingDateTime": "2025-01-05T19:20:30+00:00", "endingDateTime": "2025-01-10T19:20:30+00:00", "page": 10 }

Method: POST
URL:
https://api.ecp123.com/clinical/v1/resident/allergy
Scope Required: allergy.write
Description: This endpoint is utilized to add/update resident's allergies in ECP. Every request must either include the resident's firstName + lastName + dateOfBirth OR externalIdName + externalIdValue for resident matching purposes.

Headers:
Key Value Description Required
auth-bearer "Bearer [token returned from OAuth API endpoint]" Bearer token (expires in 60 minutes) Yes
authorization "Api-Key [key provided by ECP representative]" Key utilized across all locations/endpoints that vendor/company has access to" Yes
Request Body:
Parameter Data Type Description Required
allergy String An allergy to add to a resident's list of allergies. Yes
location String A unique identifier associated with the ECP location the resident is assigned to. Yes
firstName String (30) Resident's first name No
lastName String (30) Resident's last name No
dateOfBirth String Resident's date of birth No
externalIdName String The name of an External ID field set in the ECP GUI. If provided, this will override all other identity fields (e.g., firstName, lastName, and dateOfBirth will be ignored). No
externalIdValue String The value of the ExternalID field whose name is specified in the externalIdName parameter. No
Response:
Parameter Data Type Description Required
result String Either "Success" or "Error" Yes
error String If an error occurred, the error message. Will fail if either all three of firstName/lastName/dateOfBirth OR both of externalIdName and externalIdValue are not entered. Will also fail if either no or multiple residents match the firstName/lastName/dateOfBirth or the externalIdName/externalIdValue provided. No
Method: GET
URL: https://api.ecp123.com/clinical/v1/resident/allergy
Scope Required: allergy.read
Description: This endpoint is utilized to retrieve documented allergies for all residents of a specified location.
 
Headers:
Key Value Description Required
auth-bearer "Bearer [token returned from OAuth API endpoint]" Bearer token (expires in 60 minutes) Yes
authorization "Api-Key [key provided by ECP representative]" Key utilized across all locations/endpoints that vendor/company has access to" Yes
Request Body:
Parameter Data Type Description Required
location String A unique identifier associated with the ECP location the resident is assigned to. Yes
page Number Data will be paginated into batches of 100. Sorting will be by date/time for all fields with date/time associated, and alphabetical by last name for fields without date/time associated. No
Response:
Parameter Data Type Description Required
result String Either "Success" or "Error" Yes
data Array

An array of objects of the form 

   allergy, 
   location, 
   firstName, 
   lastName, 
   dateOfBirth, 
   externalIds: [ 
    {externalIdName: externalIdValue}, 
    {externalIdName2: externalIdValue2}, 
     ... 
   ] 


Up to 100 entries will be returned (the result is paginated). Note that an array of all external IDs and their corresponding values will be returned in the object. 

No
numberOfResults Number The total number of results (the response is paginated in batches of 100). No
error String If an error occurred, the error message. No
Request Body Sample:

{ "location": "Evergreen Assisted Living", "page": 10 }

Method: POST
URL: https://api.ecp123.com/clinical/v1/resident/diagnosis 
Scope Required: diagnosis.write
Description:
This endpoint is utilized to add diagnoses to residents in ECP. Every request must either include the resident's firstName + lastName + dateOfBirth OR externalIdName + externalIdValue for resident matching purposes. Requests must also include the diagnosis code and/or diagnosis description.

Headers:
Key Value Description Required
auth-bearer "Bearer [token returned from OAuth API endpoint]" Bearer token (expires in 60 minutes) Yes
authorization "Api-Key [key provided by ECP representative]" Key utilized across all locations/endpoints that vendor/company has access to" Yes
Request Body:
Parameter Data Type Description Required
loginName String (25) The user this charting event is to be associated with Yes
code String The ICD-10 code of the diagnosis. Required if no diagnosis is provided.  Must precisely match an ICD-10 code.  No
diagnosis Strong (MAX) The diagnosis description. Required if no code is provided. If a code is provided, we will ignore this parameter.  No
comment String (2000) Any comments associated with the diagnosis No
location String (60) A unique identifier associated with the ECP location the resident is assigned to. Yes
timestamp String (25) The date the diagnosis was recorded, conforming to ISO 8601 (e.g.,2014-03-12T13:37:27+00:00) Yes
firstName String (30) Resident's first name No
lastName String (30) Resident's last name No
dateOfBirth String Resident's date of birth No
externalIdName String The name of an External ID field set in the ECP GUI. If provided, this will override all other identity fields (e.g., firstName, lastName, and dateOfBirth will be ignored). No
externalIdValue String The value of the ExternalID field whose name is specified in the externalIdName parameter. No
Response:
Parameter Data Type Description Required
result String Either "Success" or "Error" Yes
error String If an error occurred, the error message. Will fail if either all three of firstName/lastName/dateOfBirth OR both of externalIdName and externalIdValue are not entered. Will also fail if either no or multiple residents match the firstName/lastName/dateOfBirth or the externalIdName/externalIdValue provided. Will also fail if an invalid code is entered. No

Method: GET
URL: https://api.ecp123.com/clinical/v1/resident/diagnosis
Scope Required: diagnosis.read
Description: This endpoint is utilized to retrieve documented diagnoses for all residents of a specified location.

Headers:
Key Value Description Required
auth-bearer "Bearer [token returned from OAuth API endpoint]" Bearer token (expires in 60 minutes) Yes
authorization "Api-Key [key provided by ECP representative]" Key utilized across all locations/endpoints that vendor/company has access to" Yes
Request Body:
Parameter Data Type Description Required
location String (60) A unique identifier associated with the ECP location the resident is assigned to. Yes
startingDateTime String (25) The starting date/time to pull data for, conforming to ISO 8601 (e.g.,  2014-03-12T13:37:27+00:00). If skipped, data will start at the beginning of time.  No
endingDateTime String (25) The ending date/time to pull data for, conforming to ISO 8601 (e.g.,  2014-03-12T13:37:27+00:00). If skipped, data will not have an ending date/time. No
page Number Data will be paginated into batches of 100. Sorting will be by date/time for all fields with date/time associated, and alphabetical by last name for fields without date/time associated.  No
Response:
Parameter Data Type Description Required
result String Either "Success" or "Error" Yes
data Array

An array of objects of the form 

   code, 
   location, 
   diagnosis, 
   comment, 
   timestamp, 
   firstName, 
   lastName, 
   dateOfBirth, 
   loginName, 
   externalIds: [ 
    {externalIdName: externalIdValue}, 
    {externalIdName2: externalIdValue2}, 
     ... 
   ] 

 

Up to 100 entries will be returned (the result is paginated). Note that an array of all external IDs and their corresponding values will be returned in the object.

No
numberOfResults Number The total number of results (the response is paginated in batches of 100). No
error String If an error occurred, the error message. No

Method: POST
URL: https://api.ecp123.com/clinical/v1/user/ 
Scope Required:
user.write
Description: This endpoint is utilized to create user accounts in ECP.

Headers:
Key Value Description Required
auth-bearer "Bearer [token returned from OAuth API endpoint]" Bearer token (expires in 60 minutes) Yes
authorization "Api-Key [key provided by ECP representative]" Key utilized across all locations/endpoints that vendor/company has access to" Yes
Request Body:
Parameter
Data Type
Description
Required
loginName
String (25)
Username used to login
Yes
location
Array[String(60)]
An array of unique identifiers associated with the ECP locations the user has access to.
Yes
firstName
String (30)
User's first name
Yes
lastName
String (30)
User's last name
Yes
active
Boolean
If the user is active
No
viewAllResidents
Boolean
If the User has access to view residents
No
userGroup
String (15)
The User's user group. Must precisely math one of the user groups enabled in ECP. By default, these user groups are "Resident Assistant", "RN", "Medpasser", "Maintenance", "Super User", and "Director".
Yes
role
String (15)
The User's role. Must precisely match one of "Owner", "Director", "Manager", "Nursing", "Med Passer", "Caregiver", "Operations", "Finance", "Life Enrichment", "Dietary", "Maintenance", "Housekeeping", "Administrative", "IT", "Human Resources", "Community Relations", "Pharmacy", "Outside Provider".
Yes
systemAdmin
Boolean
Whether or not the user is a System Admin. Defaults to false. A maximum of 3 System Admins can be set per account.
No
chartingInitials
String (5)
User's charting initials. If not provided, system will auto-generate.
No
title
String (50)
User's title
No
address
String (50)
User's address
No
cityStateZip
String (50)
User's city, state, and zip
No
phone
String (16)
User's home phone number
No
cellphone
String (16)
User's cellphone number
No
cellCarrier
String (15)
User's cellphone carrier. Must precisely match one of "Alltel", "AT&T", "Boost Mobile", "CellCom", "CellularOne", "Cingular", "Cricket", "Metro PCS", "Net10", "Nextel", "Omnipotent", "Qwest", "Sprint", "US Cellular", "Verizon", "Virgin Mobile"
No
pager
String (16)
User's pager number
No
email
String (150)
User's email address. Note that if systemAdmin is true, then this field is required.
No
Response:
Parameter
Data Type
Description
Required
result
String
Either “Success” or “Error”. 
Yes
error
String
If an error occurred, the error message.
No

 

Method: PUT
URL:
https://api.ecp123.com/clinical/v1/user/ 
Scope Required: user.write
Description: This endpoint is utilized to update user accounts in ECP. loginName is the primary lookup field with results limited to location access granted via bearer token. All other fields are optional and will be updated if set.

Headers:
Key Value Description Required
auth-bearer "Bearer [token returned from OAuth API endpoint]" Bearer token (expires in 60 minutes) Yes
authorization "Api-Key [key provided by ECP representative]" Key utilized across all locations/endpoints that vendor/company has access to" Yes
Request Body:
Parameter
Data Type
Description
Required
loginName
String (25)
Username used to login
Yes
location
Array[String(60)]
An array of unique identifiers associated with the ECP locations the user has access to.
No
firstName
String (30)
User's first name
No
lastName
String (30)
User's last name
No
active
Boolean
If the user is active
No
viewAllResidents
Boolean
If the User has access to view residents
No
userGroup
String (15)
The User's user group. Must precisely math one of the user groups enabled in ECP. By default, these user groups are "Resident Assistant", "RN", "Medpasser", "Maintenance", "Super User", and "Director".
No
role
String (15)
The User's role. Must precisely match one of "Owner", "Director", "Manager", "Nursing", "Med Passer", "Caregiver", "Operations", "Finance", "Life Enrichment", "Dietary", "Maintenance", "Housekeeping", "Administrative", "IT", "Human Resources", "Community Relations", "Pharmacy", "Outside Provider".
No
systemAdmin
Boolean
Whether or not the user is a System Admin. Defaults to false. A maximum of 3 System Admins can be set per account.
No
chartingInitials
String (5)
User's charting initials. If not provided, system will auto-generate.
No
title
String (50)
User's title
No
address
String (50)
User's address
No
cityStateZip
String (50)
User's city, state, and zip
No
phone
String (16)
User's home phone number
No
cellphone
String (16)
User's cellphone number
No
cellCarrier
String (15)
User's cellphone carrier. Must precisely match one of "Alltel", "AT&T", "Boost Mobile", "CellCom", "CellularOne", "Cingular", "Cricket", "Metro PCS", "Net10", "Nextel", "Omnipotent", "Qwest", "Sprint", "US Cellular", "Verizon", "Virgin Mobile"
No
pager
String (16)
User's pager number
No
email
String (150)
User's email address. Note that if systemAdmin is true, then this field is required.
No
Response:
Parameter
Data Type
Description
Required
result
String
Either “Success” or “Error”. 
Yes
error
String
If an error occurred, the error message.
No

 

Method: GET
URL:
https://api.ecp123.com/clinical/v1/user/ 
Scope Required:
user.read
Description:
This endpoint is utilized to retrieve ECP user accounts. loginName is the lookup field.

Headers:
Key Value Description Required
auth-bearer "Bearer [token returned from OAuth API endpoint]" Bearer token (expires in 60 minutes) Yes
authorization "Api-Key [key provided by ECP representative]" Key utilized across all locations/endpoints that vendor/company has access to" Yes
Request Body:
Parameter
Data Type
Description
Required
loginName
String (25)
Username used to login
Yes
Response: 
Parameter
Data Type
Description
Required
result
String
Either "Success" or "Error"
Yes
error
String
If an error occurred, the error message
No
loginName
String (25)
Username used to login
No
location
Array[String(60)]
An array of unique identifiers associated with the ECP locations the user has access to.
No
firstName
String (30)
User's first name
No
lastName
String (30)
User's last name
No
active
Boolean
If the user is active
No
viewAllResidents
Boolean
If the User has access to view residents
No
userGroup
String (15)
The User's user group. Must precisely math one of the user groups enabled in ECP. By default, these user groups are "Resident Assistant", "RN", "Medpasser", "Maintenance", "Super User", and "Director".
No
role
String (15)
The User's role. Must precisely match one of "Owner", "Director", "Manager", "Nursing", "Med Passer", "Caregiver", "Operations", "Finance", "Life Enrichment", "Dietary", "Maintenance", "Housekeeping", "Administrative", "IT", "Human Resources", "Community Relations", "Pharmacy", "Outside Provider".
No
systemAdmin
Boolean
Whether or not the user is a System Admin. Defaults to false. A maximum of 3 System Admins can be set per account.
No
chartingInitials
String (5)
User's charting initials. If not provided, system will auto-generate.
No
title
String (50)
User's title
No
address
String (50)
User's address
No
cityStateZip
String (50)
User's city, state, and zip
No
phone
String (16)
User's home phone number
No
cellphone
String (16)
User's cellphone number
No
cellCarrier
String (15)
User's cellphone carrier. Must precisely match one of "Alltel", "AT&T", "Boost Mobile", "CellCom", "CellularOne", "Cingular", "Cricket", "Metro PCS", "Net10", "Nextel", "Omnipotent", "Qwest", "Sprint", "US Cellular", "Verizon", "Virgin Mobile"
No
pager
String (16)
User's pager number
No
email
String (150)
User's email address. Note that if systemAdmin is true, then this field is required.
No

 

Let's Team Up! Integrate with ECP

Are you ready to connect your solution with the easiest-to-use and most modern software in senior living? At ECP, we help your product shine while serving thousands of communities nationwide.