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.
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 |
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 |
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 |
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.
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 |
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 |
{ "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.
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 |
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.
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 |
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 |
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 |
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 |
No |
{ "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.
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 |
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
|
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
|
{ "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.
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 |
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 |
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 |
{ "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.
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 |
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 |
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 |
{ "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.
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 |
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 |
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 |
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.
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 |
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 |
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 |
{ "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.
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 |
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 |
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.
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 |
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 |
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.
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 |
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
|
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.
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 |
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
|
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.
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 |
Parameter
|
Data Type
|
Description
|
Required
|
loginName
|
String (25)
|
Username used to login
|
Yes
|
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.