Skip to content
  • Why ECP
    Read about ECP's mission and values in proving a complete software solution for assisted living and long-term care communities.
    See what our valued customers have to say about their personal experience with ECP.
    ECP is a rapidly growing software service that provides industry leading community management solution.
    View the list of industry standard certifications that we're proud to have achieved.
  • Solutions
    BY INDUSTRY
    Discover why ECP is the preferred assisted living software, helping communities thrive and provide better care.
     
    Understand how ECP aids in providing person-centered care to improve residents' quality of life.  
     
    Save time and grow your business with the leading Assisted Living eMAR.
     
    Automate and grow your Independent Living communities.
     
    Explore the tools available to help improve the quality of care for individuals with disabilities.
     
    Learn how ECP can benefit Adult Family Homes, Group Homes, and Small Assisted Living Communities.
    ECP provides a complete workflow solution for your business, from lead to resident to revenue.
     
    Take a look at the tools ECP provides to gain complete oversight into your communities.  
     
    Improve your workflow and spend more time caring for your residents with the inudustry's leading clinical software.
     
    Learn how ECP helps reduce time spent charting, providing more quality time with residents.
     
    Identify prospects that align with your goals and increase occupancy rates.  
     
     

     

  • Products

    Reduce medication errors with safer med passing and enhanced oversight.

    Capture leads, build relationships, and grow occupancy.
    Confidently care and ensure better care.

     

    Track every step from decision to move-in day, all in one place.
    Capture every service, every payment, every time.
  • Resources
    Review common questions to find the answers you're looking for.
     
    Our library of informative guides to ECP products and solutions as well as industry-related topics.
     
    View a list of upcoming webinars and events.
    Connect seamlessly with pharmacy partners and favorite tools through ECP's integrations.
     
    Read these success stories from our customers.
     
    ECP helps senior living communities turn daily care into measurable outcomes that support value-based care partnerships.
    Build seamless, reliable connections to ensure accurate data exchange.
     
    Stay in the know with ECP updates and industry knowledge.
    Browse our comprehensive library of standard and state custom reports.
     
    Stay informed with official updates, product enhancements, and industry contributions from ECP.
  • Integrations
  • Contact
  • Customer login
Search icon

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.

ECP API developer resources

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
billThroughDate String Date up to which the resident is billed for services No
building String Resident's building name No
buildingId String (GUID) Resident's unique building identifier No
careType String
Resident's care type:
"Adult Day Care" | "Assisted Living" | "Group Home" | "Home Health" | "Independent Living" | "Memory Care" | "Other" | "Personal Care"
No
codeStatus String Indicates resident's current code status:
"Full Code" | "DNR (Do Not Resuscitate)"
No
currentPayorType Object
Object containing the following information regarding resident's payor:
payorTypeId: String (GUID)
displayValue: String
Example Provided:
"payorTypeId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"displayValue": "Private"
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
financialMoveInDate String Resident's financial move-in date 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
residencyEnd String Resident's residency end date (typically populated upon discharge) No
residencyStart String Resident's physical move-in date (sometimes also referred to as physicalMoveInDate) Yes
residentId String (GUID) Unique resident identifier Yes
room String Resident's room label No
roomId String (GUID) Resident's unique room identifier 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 line 1 and address line 2 values combined No
addressLine1 String Resident contact's address line 1 No
addressLine2 String Resident contact's address line 2 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
prospectiveResidents Array of Objects If contact is associated with prospective residents, their information will be provided here. See contact.residents // contact.prospectiveResidents information below.  
residents Array of Objects If contact is associated with residents, their information will be provided here. See contact.residents // contact.prospectiveResidents information below. Yes
state String Resident contact’s state No
zip String Resident contact’s zip code No
 

contact.residents // contact.prospectiveResidents Array:

Since a contact can relate to multiple residents and/or prospective residents, contact.residents and contact.prospectiveResidents are sent as arrays 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/residents 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
admin Boolean Indicates whether user is a System Administrator Yes
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
residentsAllowed Array of GUIDs Unique identifiers of residents the user has access to
Notes:
If empty array w/ viewAllResidents:true, user has access to all residents.
If empty array w/ viewAllResidents:false, user has access to no residents.
Yes
role String User’s role:
"Administrative" | "Caregiver" | "Community Relations" | "Dietary" | "Director" | "Finance" | "Housekeeping" | "Human Resources" | "IT" | "Life Enrichment" | "Maintenance" | "Manager" | "Med Passer" | "Nursing" | "Operations" | "Outside Provider" | "Owner" | "Pharmacy"
Yes
title String User’s job title No
userId String (GUID) User’s ID Yes
userTaskGroups Array of Objects

User's assigned Task Groups. Each object contains:
{
   displayValue (String),
   
userTaskGroupId (String - GUID)
}

No
viewAllResidents Boolean Indicates whether user is configured to view all residents
Note: See residentsAllowed above
Yes

 

 

 

Sample Payloads

resident.create:
{
    "companyId": "93AF182E-C2E5-434E-9804-D2BBA7326630",
    "data": {
        "resident": {
            "billThroughDate": "2025-08-18T00:00:00",
            "building": "Main Building",
            "buildingId": "bb04a556-12ae-4c42-9c10-77a5005ba52c",
            "careType": null,
            "codeStatus": "Full Code",
            "currentPayorType": {
                "payorTypeId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
                "displayValue": "Private"
            },
            "dateOfBirth": "1991-01-01T00:00:00",
            "email": "testemail@email.com",
            "externalIds": {
                "billingid": "123456"
            },
            "financialMoveInDate": "2025-01-01T00:00:00",
            "firstName": "James",
            "gender": "Male",
            "lastName": "Tester",
            "livingWill": true,
            "middleName": "I",
            "nickname": "Jim",
            "otherAdvancedDirectives": null,
            "phone": "555-555-5555",
            "residencyEnd": "2025-08-18T00:00:00",
            "residencyStart": "2025-01-19T00:00:00",
            "residentId": "E062E995-B6B0-4332-9B19-AAD64E5CB048",
            "room": "101",
            "roomId": "57555b66-6b81-4dbb-9407-01efdd38b85d",
            "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. Apartment 101",
            "addressLine1": "123 Fake St.",
            "addressLine2": "Apartment 101",
            "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",
            "prospectiveResidents": [],
            "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": {
            "admin": false,
            "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",
            "residentsAllowed": [
                "800097B6-E637-41D1-9575-1F052EE6DEFA",
                "23D8895E-6179-49CE-843F-3291B8D3E288",
                "7F5A422C-8EF6-4B6E-A03E-F24EEA10E9F4"
            ],
            "role": "Nursing",
            "title": "VP of Clinical Services",
            "userId": "E635DCE9-D456-4F5B-A608-F6FBFA4D6A81",
            "userTaskGroups": [
                {
                    "displayValue": "RN (TASK GROUP)",
                    "userTaskGroupId": "62DA5A73-0DC0-454C-9413-C65EF7432498"
                },
                {
                    "displayValue": "Medpasser (TASK GROUP)",
                    "userTaskGroupId": "624D26BB-357D-4571-BBA7-B6C7565E0100"
                }
            ],
            "viewAllResidents": false
        }
    },
    "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/locations
URL Path Parameters: Add /{locationId} to URL to retrieve a specific location's information.
Scope Required:
location.read
Description: Retrieve active locations/accounts 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 endpoints the vendor/company has access to Yes
Optional Request Parameters:
Parameter Data Type Type Description
locationId String (GUID) Path Parameter

Added to URL to retrieve a specific location's info.
Example Provided: "...v1/locations/1fc5EEEE-AAAA-4f75-CCCC-4ecd23feBBCC"

page Number Query String Parameter By default, results are returned in batches of 100. Page is sometimes necessary to see subsequent results.
Example Provided: "...v1/locations?page=2"
resultsPerPage Number Query String Parameter Used to specify the amount of results per page with a max of 100. If this value is greater than 100, 100 will be returned.
Example Provided: "...v1/locations?resultsPerPage=10&page=2"

Response:
Parameter Data Type Description Always Specified
result String Either "Success" or "Error" Yes
data Array of Location Objects
Contains an array of Location objects including the following:
{
   locationId (GUID),
   displayValue (String),
   address (String),
   city (String),
   state (String),
   zip (String)
}
No
numberOfResults Number The total number of results (the response is paginated in batches of what resultsPerPage is set to, with a default max of 100 results per page) No
error String If an error occurred, the error message No

Method: GET
URL: https://api.ecp123.com/clinical/v1/location
Scope Required:
location.read
Description: Retrieve location names the provided OAuth token has access to. These names are required when using POST/PUT/GET User endpoints. See GET Locations to retrieve more detailed location-related information.

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: GET
URL: https://api.ecp123.com/clinical/v1/locations/{locationId}/buildings
URL Path Parameters: Add /{buildingId} to URL to retrieve a specific building's information.
Scope Required:
location.read
Description: Retrieve a list of active buildings/buildingIds per locationId specified in the request URL. Buildings are the equivalent of wings/floors 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 endpoints the vendor/company has access to Yes
Optional Request Parameters:
Parameter Data Type Type Description
buildingId String (GUID) Path Parameter

Added to URL to retrieve a specific building's info.
Example Provided: "...v1/locations/1fc5EEEE-AAAA-4f75-CCCC-4ecd23feBBCC/buildings/fdad8823-83e2-42dc-8c33-9bb57e125844"

page Number Query String Parameter By default, results are returned in batches of 100. Page is sometimes necessary to see subsequent results.
Example Provided: ".../buildings?page=2"
resultsPerPage Number Query String Parameter Used to specify the amount of results per page with a max of 100. If this value is greater than 100, 100 will be returned.
Example Provided: ".../buildings?resultsPerPage=10&page=2"

Response:
Parameter Data Type Description Always Specified
result String Either "Success" or "Error" Yes
data Array of Building Objects
Contains an array of Building objects including the following:
{
   buildingId (GUID),
   displayValue (String)
}
No
numberOfResults Number The total number of results (the response is paginated in batches of what resultsPerPage is set to, with a default max of 100 results per page) No
error String If an error occurred, the error message No

Method: GET
URL: https://api.ecp123.com/clinical/v1/locations/{locationId}/buildings/{buildingId}/rooms
URL Path Parameters: Add /{roomId} to URL to retrieve a specific room's information.
Scope Required:
location.read
Description: Retrieve active apartments/rooms, per locationId and buildingId specified in the request URL.

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 endpoints the vendor/company has access to Yes
Optional Request Parameters:
Parameter Data Type Type Description
roomId String (GUID) Path Parameter

Added to URL to return a specific room's info.
Example Provided: "...v1/locations/1fc5EEEE-AAAA-4f75-CCCC-4ecd23feBBCC/buildings/fdad8823-83e2-42dc-8c33-9bb57e125844/rooms/1840d08c-391f-4535-b20e-0ec5100e89cd"

page Number Query String Parameter By default, results are returned in batches of 100. Page is sometimes necessary to see subsequent results.
Example Provided: ".../rooms?page=2"
resultsPerPage Number Query String Parameter Used to specify the amount of results per page with a max of 100. If this value is greater than 100, 100 will be returned.
Example Provided: ".../rooms?resultsPerPage=10&page=2"

Response:
Parameter Data Type Description Always Specified
result String Either "Success" or "Error" Yes
data Array of Room Objects
Contains an array of Room objects including the following:
{
   addressLine1 (String),
   addressLine2 (String),
   careType (String),
   city (String),
   displayValue (String),
   notes (String),
   phone (String),
   roomId (GUID),
   state (String),
   type (String),
   zip (String)
}
No
numberOfResults Number The total number of results (the response is paginated in batches of what resultsPerPage is set to, with a default max of 100 results per page) No
error String If an error occurred, the error message No

Method: GET
URL: https://api.ecp123.com/clinical/v1/locations/{locationId}/shifts
Scope Required:
shift.read
Description: Returns the name, ID, and local start time for all care and med shifts configured for the location specified in the request URL.

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 endpoints the vendor/company has access to Yes
Response:
Parameter Data Type Description Always Specified
result String Either "Success" or "Error" Yes
data Object
Contains careShifts and medShifts arrays of objects (outlined below).
No
data.careShifts Array of Objects

Each careShift object contains:
{
   displayValue (String),
   shiftId (String - GUID),
   localStartTime (String - 24-hour time)
}

Yes, when data object is returned. However, careShifts can be an empty array if the locationId specified does not use ECP care-planning.
data.medShifts Array of Objects

Each medShift object contains:
{
   displayValue (String),
   shiftId (String - GUID),
   localStartTime (String - 24-hour time)
}

Yes, when data object is returned.
error String If an error occurred, the error message No

Method: GET
URL: https://api.ecp123.com/clinical/v1/locations/{locationId}/careCategories
Scope Required:
careCategory.read
Description: Returns Care Categories' display labels, unique IDs, and subcategories for the location specified in the request URL. The location specified must have ECP Care Planning enabled.

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 endpoints the vendor/company has access to Yes
Response:
Parameter Data Type Description Always Specified
result String Either "Success" or "Error" Yes
data Object
Contains a careCategories array of objects (outlined below)
No
data.careCategories Array of Objects

Each careCategories object contains:
{
   displayValue (String),
   careCategoryId (String - GUID),
   careSubcategories (Array of Objects - outlined below)
}

No
data.careCategories.careSubcategories Array of Objects

Each careSubcategories object contains:
{
   displayValue (String),
   careSubcategoryId (String - GUID)
}

No
error String If an error occurred, the error message No

Method: GET
URL: https://api.ecp123.com/clinical/v1/locations/{locationId}/notIssuedReasons
Scope Required:
notIssuedReason.read
Description: Returns all potential care/med-related "not issued"/refusal reasons that are unique per location specified in the request URL.
Note: Reasons and their IDs sometimes match across multiple locations, especially when a company is set up to store reasons at the global, company-wide level.

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 endpoints the vendor/company has access to Yes
Response:
Parameter Data Type Description Always Specified
result String Either "Success" or "Error" Yes
data Object
Contains a notIssuedReasons array of objects (outlined below)
No
data.notIssuedReasons Array of Objects

Each notIssuedReasons object contains:
{
   displayValue (String),
   notIssuedReasonId (String - GUID)
}

No
error String If an error occurred, the error message No

Method: POST
URL:
https://api.ecp123.com/clinical/v1/locations/{locationId}/emitEvents
Scope Required:
emitEvents.write
Other Requirements: To successfully submit event emit requests, an ECP representative must link your REST API access with a webhook event subscriber. The linked event subscriber must also be subscribed to events for the location specified in the URL. You will be prevented from requesting entities that your linked subscriber is not granted access to.
Description: If integrated via the webhook event approach outlined in the top section of this page, this endpoint is used to request a full snapshot (via a string of event payloads) of all active/current information for the location specified in the request URL and entities specified in the request body. To be used to request initial data pushes leading up to go-live.

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
entities Array of Strings Entities currently supported:
"allergy" | "contact" | "diet" | "levelOfCare" | "payorType" | "resident.assessmentDecision" | "resident.levelOfCareLogEntry" | "resident.payorTypeLogEntry" | "resident.roomLogEntry" | "resident.statusLogEntry" | "resident" | "user"

Note:
Your linked event subscriber must be subscribed to the entities requested.
Yes
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, an invalid locationId is specified, or if rate-limiting applies. POST emitEvents currently only allows for:
   - Up to [1] emit events request per unique locationId within a 15-minute timespan
   - Up to [3] emit events requests per unique locationId in a rolling 24-hour period
   - Up to [50] emit events requests per vendor in a rolling 24-hour period

No
Request Body Sample:
{
    "entities": [
"contact",
"resident"
]
}

Method: GET
URL: https://api.ecp123.com/clinical/v1/locations/{locationId}/residents
URL Path Parameters: Add /{residentId} to URL to retrieve a specific resident's information.
Scope Required:
resident.read
Description: This endpoint is utilized to retrieve basic information on residents, per locationId specified in the request URL.

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 endpoints the vendor/company has access to Yes
Optional Request Parameters:
Parameter Data Type Type Description
discharged Boolean Query String Parameter

By default, only active residents are returned. Setting discharged to true will return all discharged residents.

Example Provided: "...v1/locations/1fc5EEEE-AAAA-4f75-CCCC-4ecd23feBBCC/residents?discharged=true"

page Number Query String Parameter

By default, results are returned in batches of 100. Page is sometimes necessary to see subsequent results.
Example Provided: ".../rooms?page=2"

residentId String (GUID) Path Parameter Added to URL to return a specific resident's info.
Example Provided: "...v1/locations/1fc5EEEE-AAAA-4f75-CCCC-4ecd23feBBCC/residents/45b6837b-5324-4990-a388-880e82d5934f"
resultsPerPage Number Query String Parameter Used to specify the amount of results per page with a max of 100. If this value is greater than 100, 100 will be returned.
Example Provided: ".../rooms?resultsPerPage=10&page=2"

Response:
Parameter Data Type Description Always Specified
result String Either "Success" or "Error" Yes
data Array of Resident Objects
Contains an array of Resident objects including the following:
{
   building (Object) {
      buildingId (GUID),
      displayValue (String)
   },
   dateOfBirth (String),
   externalIds (Custom resident-related key/value pairs) {
      "[Custom Key 1]": "[Value 1]",
      "[Custom Key 2]": "[Value 2]",
      [...]
   },
   firstName (String),
   gender (String),
   lastName (String),
   middleName (String),
   nickname (String),
   residentId (GUID),
   room (Object) {
      displayValue (String),
      roomId (GUID)
   },
   status (String),
   statusDescription (String),
   suffix (String)
}
No
numberOfResults Number The total number of results (the response is paginated in batches of what resultsPerPage is set to, with a default max of 100 results per page) No
error String If an error occurred, the error message No

Method: POST
URL:
https://api.ecp123.com/clinical/v1/resident
Scope Required:
resident.write
Description: Create resident profiles in the ECP. A unique identifier (GUID) 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
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
externalIds
Array of key/value pairs:
idKey; String (30)
idValue; String (50)
Location-specific idKey followed by resident-specific idValue derived from third-party system.
Note: idKeys must be configured per mutual client location/company before vendor utilization. Keys cannot be created via API.
No
financialMoveInDate String (10) Resident's financial move-in date in YYYY-MM-DD format 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 (GUID) Unique identifier associated with location the resident is assigned to Yes
middleName String (1) Resident's middle initial No
moveInDate (Deprecated) String (10) This field is now deprecated. Please use physicalMoveInDate instead.
No
nickname String (30) Resident's nickname No
otherAdvancedDirectives String (300) Resident's other advanced directives No
phone String (16) Resident's phone number No
physicalMoveInDate String (10)

Resident's physical move-in date in YYYY-MM-DD format
Notes:
- If set to future date and community uses Clinical-only, resident will be given an "Awaiting Move-In" status.
- This field replaces the deprecated moveInDate field.
- If financialMoveInDate is not passed in, this sets both physical and financial move-in dates.

No
readyForDeposit Boolean If location is using ECP CRM/Move-Ins, a Prospect will be created as a result of a POST Resident request. When a Prospect is created, this field indicates whether the Prospect is ready for deposit. No
readyForPreAssessment Boolean If location is using ECP CRM/Move-Ins, a Prospect will be created as a result of a POST Resident request. When a Prospect is created, this field indicates whether the Prospect is ready for a pre-assessment. No
room String (16) Resident's room label No
stageId String (GUID) If location is using ECP CRM/Move-Ins, a Prospect will be created as a result of a POST Resident request. When a Prospect is created, this field can be used to set the Prospect's current Stage. If not specified, the Prospect will be created in the first default Stage.
Note: See GET Stages endpoint for more information.
No
suffix String (6) Resident's suffix No
coResident Object A secondary, related resident to create at the same time. If location is using ECP CRM/Move-Ins, the two prospects will be created under the same Lead profile. See sample below for supported fields. No
Response:
Parameter Data Type Description Required
result String Either "Success" or "Error" Yes
error String

If an error occurred, the error message. Potential errors include:
  - A resident with the same first name, last name, and date of birth already exists.
  - locationId is a required field
  - locationId must be a valid UUID
  - firstName is a required field
  - firstName must not exceed 30 characters
  - lastName is a required field
  - lastName must not exceed 30 characters
  - dateOfBirth is required and must be in the format YYYY-MM-DD
  - dateOfBirth must be in the format YYYY-MM-DD
  - middleName must not exceed 1 character
  - nickname must not exceed 30 characters
  - email must not exceed 100 characters
  - phone must not exceed 16 characters
  - room must not exceed 30 characters
  - suffix must not exceed 6 characters
  - otherAdvancedDirectives must not exceed 300 characters
  - gender value must be Male, Female, or Other.
  - codeStatus value must be either Full Code or DNR
  - livingWill must be a boolean type.
  - readyForPreAssessment must be a boolean type.
  - readyForDeposit must be a boolean type.
  - moveInDate must be in the format YYYY-MM-DD and represent a valid date
  - physicalMoveInDate must be in the format YYYY-MM-DD and represent a valid date
  - financialMoveInDate must be in the format YYYY-MM-DD and represent a valid date
  - stageId must be a valid UUID
  - stageId not found.
  - The stageId specified is restricted.
  - externalIds must be valid key/value pairs.
  - externalIds idKey must not exceed 50 characters.
  - externalIds idValue must not exceed 100 characters.
  - idKey of [key] does not exist in locationId specified.
  - idKey [idKey]; idValue [idValue] is already in-use by residentId [residentId]
  - Failed to create resident - [details]

No
residentId String (36)

GUID provided in response to POST resident
Note:
If sent with “Success” result, this is the GUID of the newly created resident. If sent with “Error” result due to duplicate resident, this is the GUID of the existing resident where first name, last name, and DOB match.

No
Request Body Sample:
{
    "codeStatus": "Full Code",
    "dateOfBirth": "1970-02-21",
    "email": "james@james.com",
    "externalIds": [
    	{"idKey": "billingid", "idValue": "12345"},
        {"idKey": "thirdpartyid", "idValue": "67890"}
    ],     
"financialMoveInDate": "2026-01-01",
"firstName": "James", "gender": "Male", "lastName": "Baum", "livingWill": false, "locationId": "XXX12FF-XXXC-XXX2-843C-93AXXXX772F8", "middleName": "A",
"nickname": "Jim",
"otherAdvancedDirectives": "This is a long text field.", "phone": "555-555-5555",
"physicalMoveInDate": "2026-01-23",
"readyDeposit": true,
"readyForPreAssessment": true, "room": "1A", "suffix": "Sr.",
"coResident": {
  "codeStatus": "DNR",
"dateOfBirth": "1965-01-09",
"email": "secondary@test.com",
"externalIds": [
{"idKey": "billingid", "idValue": "765432"},
{"idKey": "thirdpartyid", "idValue": "67123"}
],
"firstName": "Secondary",
"gender": "Female",
"lastName": "Baum",
"livingWill": true,
"middleName": "B",
"nickname": "Sec",
"otherAdvancedDirectives": "Here are other advanced directives for the secondary resident.",
"phone": "555-555-6666",
"readyForDeposit": true,
"readyForPreAssessment": true,
"room": "1B",
"suffix": "Jr."
}
}

Method: PATCH
URL:
https://api.ecp123.com/clinical/v1/resident
Scope Required:
resident.write
Description: Update resident profiles in the ECP using the resident's locationId and unique residentId. All other fields are optional and will only be updated if defined.

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
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 No
email String (100) Resident's email No
externalIds Array of key/value pairs:
idKey; String (30)
idValue; String (50)
Location-specific idKey followed by resident-specific idValue derived from third-party system.
Note: idKeys must be configured per mutual client location/company before vendor utilization. Keys cannot be created via API.
No
firstName String (30) Resident's first name No
gender String (6) Resident's gender:
"Male" | "Female" | "Other"
No
lastName String (30) Resident's last name No
livingWill Boolean Indicates if resident has a living will No
locationId String (GUID) Unique identifier associated with location the resident is assigned to Yes
middleName String (1) Resident's middle initial No
nickname String (30) Resident's nickname No
otherAdvancedDirectives String (300) Resident's other advanced directives No
phone String (16) Resident's phone number No
readyForDeposit Boolean If location is using ECP CRM/Move-Ins and the resident specified is still a Prospect, this field indicates whether the Prospect is ready for deposit. No
readyForPreAssessment Boolean If location is using ECP CRM/Move-Ins and the resident specified is still a Prospect, this field indicates whether the Prospect is ready for a pre-assessment. No
residentId String (GUID) Resident's unique identifier Yes
stageId String (GUID) If location is using ECP CRM/Move-Ins and the resident specified is still a Prospect, this field can be used to set the Prospect's current Stage.
Note: See GET Stages endpoint for more information.
No
suffix String (6) Resident's suffix No
Response:
Parameter Data Type Description Required
result String Either "Success" or "Error" or "Failure" Yes
error String If an error occurred, the error message. Potential errors include:
  - locationId is a required field
  - locationId must be a valid UUID
  - residentId is a required field
  - residentId not found.
  - firstName must not exceed 30 characters
  - lastName must not exceed 30 characters
  - dateOfBirth must be in the format YYYY-MM-DD
  - middleName must not exceed 1 character
  - nickname must not exceed 30 characters
  - email must not exceed 100 characters
  - phone must not exceed 16 characters
  - room must not exceed 30 characters
  - suffix must not exceed 6 characters
  - otherAdvancedDirectives must not exceed 300 characters
  - gender value must be Male, Female, or Other.
  - codeStatus value must be either Full Code or DNR
  - livingWill must be a boolean type.
  - readyForPreAssessment must be a boolean type.
  - readyForDeposit must be a boolean type.
  - stageId must be a valid UUID
  - stageId not found.
  - The stageId specified is restricted.
  - externalIds must be valid key/value pairs.
  - externalIds idKey must not exceed 50 characters.
  - externalIds idValue must not exceed 100 characters.
  - idKey of [key] does not exist in locationId specified.
  - idKey [idKey]; idValue [idValue] is already in-use by residentId [residentId]
  - The following parameters are not supported: [parameters]
  - Error: [generic error]
  - Failed to update resident - [details]
No
Request Body Sample:
{
    "codeStatus": "Full Code",
    "dateOfBirth": "1970-02-21",
    "email": "james@james.com",
"firstName": "James", "gender": "Male", "lastName": "Baum", "livingWill": false, "locationId": "F2266F87-52BC-4EBA-AECB-7E6ABEBF3EBF", "middleName": "A",
"nickname": "Jim",
"otherAdvancedDirectives": "This is a long text field.", "phone": "555-555-5555",
"readyDeposit": true,
"readyForPreAssessment": true,
"residentId": "2B9FA1B5-82F3-4F2A-8017-149FF263AEB2",
"stageId": "7A36D2F4-3F99-4CCA-B381-C9261E8A2777",    
"suffix": "Sr."
}

Method: GET
URL: https://api.ecp123.com/clinical/v1/locations/{locationId}/residents/{residentId}/statusLog
URL Path Parameters: Add /{statusLogEntryId} to URL to retrieve a specific log's information.
Scope Required:
resident.read
Description: This endpoint is utilized to retrieve a resident's entire status log, per residentId specified in the request URL.

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 endpoints the vendor/company has access to Yes
Optional Request Parameters:
Parameter Data Type Type Description
page Number Query String Parameter By default, results are returned in batches of 100. Page is sometimes necessary to see subsequent results.
Example Provided: ".../statusLog?page=2"
resultsPerPage Number Query String Parameter Used to specify the amount of results per page with a max of 100. If this value is greater than 100, 100 will be returned.
Example Provided: ".../statusLog?resultsPerPage=10&page=2"

statusLogEntryId String (GUID) Path Parameter Added to URL to return a specific status log entry's info.
Example Provided: "...v1/locations/1fc5EEEE-AAAA-4f75-CCCC-4ecd23feBBCC/residents/fdad8823-83e2-42dc-8c33-9bb57e125844/statusLog/fb9e3a60-9b17-4257-b52f-f192d10c77cb"
Response:
Parameter Data Type Description Always Specified
result String Either "Success" or "Error" Yes
data Array of Status Log Entry Objects
Contains an array of Status Log Entry objects including the following:
{
   billable (Boolean),
   createdTimestamp (String - UTC),
   effectiveTimestamp (String - UTC),
   notes (String),
   status ("Active" or "Inactive"),
   statusDescription (String),
   statusLogEntryId (String - GUID)
}
No
numberOfResults Number The total number of results (the response is paginated in batches of what resultsPerPage is set to, with a default max of 100 results per page) No
error String If an error occurred, the error message No

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
URL:
https://api.ecp123.com/clinical/v1/resident/observation
Scope Required:
observation.write
Description: This endpoint is utilized to post resident observations.

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
important
Boolean
Flag observation as important to display at the top of Recent Notes/Observations windows
 
Note: Default value is false
No
locationId String (36) Resident's locationId, a unique identifier shared via ECP representative or ECP's Webhook API Yes
minutes Integer User time spent as a result of observation No
note String (20000) Resident observation note Yes
timestamp
String (10)
UTC timestamp of when observation was recorded, conforming to ISO 8601

Example Provided: "2025-05-05T13:37:27+00:00"
Yes
residentId String (36) Resident's unique identifier shared via ECP's Webhook API Yes, but only when passing residentId to identify resident
firstName String (30) Resident's first name Yes, but only when passing FN + LN + DOB to identify resident
lastName String (30) Resident's last name Yes, but only when passing FN + LN + DOB to identify resident
dateOfBirth String (10) Resident's date of birth in YYYY-MM-DD format Yes, but only when passing FN + LN + DOB to identify resident
externalIdName String (30) Resident's External ID field name Yes, but only when passing externalIdName + externalIdValue to identify resident
externalIdValue String (50) Resident's External ID value corresponding with externalIdName Yes, but only when passing externalIdName + externalIdValue to identify resident
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 observation
loginName String (113) Login Name of user recording observation Yes, but only when using loginName instead of userId to specify user recording observation
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
Request Body Sample:
{
    "important": 1,
"locationId": "XXX12FF-XXXC-XXX2-843C-93AXXXX772F8",
"minutes": 20,
"note": "As of late, Lauren requires more assistance with mobility. Today, I assisted her to and from commons on a few different occasions.", "timestamp": "2025-03-05T09:20:30+00:00", "firstName": "James", "lastName": "Baum",
"dateOfBirth": "1970-02-21",
"userId": "12312FF-X555-X555-8XXS-18XXXXX38105"
}

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: Retrieve vital readings for a specific resident or all residents in a single 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
Query String Parameters:
Parameter Data Type Description Required
location String Residents' location name (referencing names returned from v1/location/ endpoint) Yes, but only when using location instead of locationId to specify location
locationId String (GUID) Residents' locationId, a unique identifier shared via ECP representative or ECP's Webhook API Yes, but only when using locationId instead of location to specify 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
residentId String (GUID) Residents' residentId, a unique identifier No
Response:
Parameter Data Type Description Required
result String Either "Success" or "Error" Yes
data Array
An array of objects of the form:
{
   resident (Object)
      firstName (String),
      lastName (String),
      dateOfBirth (String),
      residentId (String - GUID),
      externalIds (Array)
         externalIdName (String),
         externalIdValue (String),
   [vital] (Object),
      id (String - GUID),
      [vital reading],
      timestamp (String),
      createdDate (String),
      updatedDate (String),
      loginName (String)
}
 
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. Potential errors include:
  - Either location or locationId is required.
  - startingDateTime must match ISO 8601 (https://www.w3.org/TR/NOTE-datetime).
  - endingDateTime must match ISO 8601 (https://www.w3.org/TR/NOTE-datetime).
  - endingDateTime must be at least startingDateTime
  - Invalid residentId format.
  - Something went wrong.

If using ECP's user-specific OAuth token approach (authorization_code grant type):
  - You do not have access to locationId provided.
  - You do not have permission to view Vitals History in ECP.
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 a resident's allergies in ECP. Please note, there are different ways to identify locations/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
allergy String An allergy to add to a resident's list of allergies. Yes
location String (60) A unique identifier associated with the ECP location the resident is assigned to. 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 allergies. Yes
firstName String (30) Resident's first name Yes, but only when passing FN + LN + DOB to identify resident
lastName String (30) 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
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 residentId OR firstName/lastName/dateOfBirth OR externalIdName/externalIdValue are not specified.
Will 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. Results are paginated in batches of 100. Please note, there are two different ways of specifying which location you're querying, via location name (location) or location ID (locationId).
 
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
Query String Parameters:
Parameter Data Type Description Required
location
String
Residents' location name (referencing names returned from v1/location/ endpoint)
Yes, but only when using location instead of locationId to specify location
locationId
String (GUID)
Residents' locationId (GUID), a unique identifier shared via ECP representative or ECP's Webhook API
Yes, but only when using locationId instead of location to specify location
page
String
Page number of results
Note: With results paginated into batches of 100, increment page number until numberOfResults=0
No
residentId
String (GUID)
Residents' residentId (GUID), a unique identifier
No
Response:
Parameter Data Type Description Required
result
String
Either "Success" or "Error"
Yes
data
Array
An array of objects containing the following fields:
allergy (String),
allergiesModifiedDate: String,
dateOfBirth (String),
externalIds: Array of externalIdName (String) and externalIdValue (String) pairings,
firstName (String),
lastName (String),
residentId (String - GUID),
timestamp (deprecated)
No
numberOfResults
Number
Total number of results (residents w/ allergies) on page returned
Note: With results paginated into batches of 100, increment page number until numberOfResults=0
No
error
String
If an error occurred, the error message
No
Using Query String Parameters:

https://api.ecp123.com/clinical/v1/resident/allergy?locationId=XXX812FF-XXXC-XXX2-XXXC-XXX0603772F8

OR

https://api.ecp123.com/clinical/v1/resident/allergy?locationId=XXX812FF-XXXC-XXX2-XXXC-XXX0603772F8&page=1

OR

https://api.ecp123.com/clinical/v1/resident/allergy?location=Evergreen Assisted Living&page=2

Method: POST
URL: https://api.ecp123.com/clinical/v1/resident/diagnosis 
Scope Required: diagnosis.write
Description:
This endpoint is utilized to add diagnoses to resident profiles in ECP. Please note, there are different ways to identify locations/residents. If not utilizing ECP's Webhook API, the location endpoint can be leveraged to retrieve required location names. Requests must include a diagnosis code or 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) Login Name of user recording diagnosis Yes
code String ICD-10 code of recorded diagnosis
Note: Must precisely match an ICD-10 code
Yes, but only when diagnosis value is not provided
diagnosis
String
Description of recorded diagnosis
Yes, but only when code is not provided
comment String (2000) Any comments associated with diagnosis No
location String (60) A unique identifier associated with the ECP location the resident is assigned to 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
timestamp String (25) Timestamp of when diagnosis was recorded, conforming to ISO 8601

Example Provided: "2025-05-05T13:37:27+00:00"
Yes
firstName String (30) Resident's first name Yes, but only when passing FN + LN + DOB to identify resident
lastName String (30) 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
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
residentId OR firstName/lastName/dateOfBirth OR externalIdName/externalIdValue are not specified.
Will fail if either no or multiple residents match the firstName/lastName/dateOfBirth or the externalIdName/externalIdValue provided.
Will fail if an invalid ICD-10 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
Query String Parameters:
Parameter Data Type Description Required
location String (60) Residents' location name (referencing names returned from v1/location/ endpoint) Yes, but only 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 specify location
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: 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)
User's Employee Login
Yes
password
String (16)
User's temporary password
Note: User will be prompted to update their password the first time they log in.
No
location
Array of Strings (60)
Array of unique identifiers associated with 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
Indicates if user account is active
No
viewAllResidents
Boolean
Indicates if user account has access to all residents
No
userGroup
String (15)
User's assigned User Group
Note: This value must precisely match a User Group unique to the user's ECP account.
Yes
role
String (15)
User's assigned Role
"Administrative" | "Caregiver" | "Community Relations" | "Dietary" | "Director" |
"Finance" | "Housekeeping" | "Human Resources" | "IT" | "Life Enrichment" | "Maintenance" | "Manager" | "Med Passer" | "Nursing" | "Operations" | "Outside Provider" | "Owner" | "Pharmacy"
Yes
systemAdmin
Boolean
Indicates if user is a System Administrator
Note: Default = false; Maximum of three per ECP account
No
chartingInitials
String (5)
User's charting initials
Note: If not provided, charting initials will be auto-generated.
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 phone number
No
cellphone
String (16)
User's cellphone number
No
cellCarrier
String (15)
User's cellphone carrier
"Alltel" | "AT&T" | "Boost Mobile" | "CellCom" | "CellularOne" | "Cingular" | "Cricket" | "Metro PCS" | "Net10" | "Nextel" | "Omnipoint" | "Qwest" | "Spectrum Mobile" | "Sprint" | "T-Mobile" | "US Cellular" | "Verizon" | "Virgin Mobile"
No
pager
String (16)
User's pager number
No
email
String (150)
User's email address
Note: Required for System Administrators
No
Response:
Response
Description
"Success"
No errors encountered; User/employee created
"Error:" or "Errors:"

An individual error or list of errors. Potential errors include:
  - loginName is a required field.
  - password must be a string.
  - password must be at least 8 characters.
  - password must be at most 16 characters.
  - password cannot contain your login name.
  - password cannot contain your first name.
  - password cannot contain your last name.
  - password is too common and cannot be used. Please choose a more secure password.
  - firstName is a required field.
  - firstName must be at most 30 characters
  - lastName is a required field.
  - lastName must be at most 30 characters
  - There is already a user with this LoginName.
  - loginName must be at least 3 characters
  - loginName must be at most 113 characters
  - address must be at most 50 characters
  - cityStateZip must be at most 50 characters
  - phone must be at most 16 characters
  - cellPhone must be at most 16 characters
  - pager must be at most 16 characters
  - email must be at most 150 characters
  - chartingInitials must be at most 6 characters
  - Charting Initials are not unique, please try again.
  - There are too many users with similarly auto-generated initials. Please provide unique charting initials for this user.
  - This is not a valid Role. Role must be one of [list of valid roles]
  - This is not a valid User Group. User Group must be one of [list of valid user groups]
  - This is not a valid Cell Phone Carrier. Cell Phone Carrier must be one of [list of valid carriers]
  - System Admins must have an email address.
  - At least one valid location must be provided.
  - Failed to create employee.
  - Failed to create employee log.
  - Failed to link locations to the employee.

 

Method: PUT
URL:
https://api.ecp123.com/clinical/v1/user/ 
Scope Required: user.write
Description: Update a user account in ECP by passing in the user's unique loginName. All other fields are optional and will be updated if defined.

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)
User's Employee Login
Yes
password
String (16)
User's password
No
location
Array of Strings (60)
Array of unique identifiers associated with 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
Indicates if user account is active
No
viewAllResidents
Boolean
Indicates if user account has access to all residents
No
userGroup
String (15)
User's assigned User Group
Note: This value must precisely match a User Group unique to the user's ECP account.
No
role
String (15)
User's assigned Role
"Administrative" | "Caregiver" | "Community Relations" | "Dietary" | "Director" |
"Finance" | "Housekeeping" | "Human Resources" | "IT" | "Life Enrichment" | "Maintenance" | "Manager" | "Med Passer" | "Nursing" | "Operations" | "Outside Provider" | "Owner" | "Pharmacy"
No
systemAdmin
Boolean
Indicates if user is a System Administrator
Note: Maximum of three per ECP account
No
chartingInitials
String (5)
User's charting initials
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 phone number
No
cellphone
String (16)
User's cellphone number
No
cellCarrier
String (15)
User's cellphone carrier
"Alltel" | "AT&T" | "Boost Mobile" | "CellCom" | "CellularOne" | "Cingular" | "Cricket" | "Metro PCS" | "Net10" | "Nextel" | "Omnipoint" | "Qwest" | "Spectrum Mobile" | "Sprint" | "T-Mobile" | "US Cellular" | "Verizon" | "Virgin Mobile"
No
pager
String (16)
User's pager number
No
email
String (150)
User's email address
Note: Required for System Administrators
No
Response:
Response
Description
"Success"
No errors encountered; User/employee updated
"Error:" or "Errors:"
An individual error or list of errors. Potential errors include:
  - firstName must be at most 30 characters
  - lastName must be at most 30 characters
  - loginName must be at least 3 characters
  - loginName must be at most 113 characters
  - password must be a string.
  - password must be at least 8 characters.
  - password must be at most 16 characters.
  - password cannot contain your login name.
  - password cannot contain your first name.
  - password cannot contain your last name.
  - password is too common and cannot be used. Please choose a more secure password.
  - address must be at most 50 characters
  - cityStateZip must be at most 50 characters
  - phone must be at most 16 characters
  - cellPhone must be at most 16 characters
  - pager must be at most 16 characters
  - email must be at most 150 characters
  - chartingInitials must be at most 6 characters
  - Charting Initials are not unique, please try again.
  - This is not a valid Role. Role must be one of [list of valid roles]
  - This is not a valid User Group. User Group must be one of [list of valid user groups]
  - This is not a valid Cell Phone Carrier. Cell Phone Carrier must be one of [list of valid carriers]
  - System Admins must have an email address.
  - Could not find employee with LoginName: [loginName]
  - Must include at least 1 valid location.
  - Failed to update employee.
  - Failed to create employee log.
  - Failed to link locations to the employee.

 

Method: GET
URL:
https://api.ecp123.com/clinical/v1/user/ 
Scope Required:
user.read
Description: Retrieve ECP user account information using the user's unique loginName.

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
Query String Parameters:
Parameter
Data Type
Description
Required
loginName
String (25)
User's Employee Login
Yes
Response:
Parameter
Data Type
Description
Always Specified
loginName
String (25)
User's Employee Login
Yes
location
Array of Strings (60)
Array of unique identifiers associated with ECP locations the user has access to
No
firstName
String (30)
User's first name
Yes
lastName
String (30)
User's last name
Yes
active
Boolean
Indicates if user account is active
Yes
viewAllResidents
Boolean
Indicates if user account has access to all residents
Yes
userGroup
String (15)
User's assigned User Group
No
role
String (15)
User's assigned Role
"Administrative" | "Caregiver" | "Community Relations" | "Dietary" | "Director" |
"Finance" | "Housekeeping" | "Human Resources" | "IT" | "Life Enrichment" | "Maintenance" | "Manager" | "Med Passer" | "Nursing" | "Operations" | "Outside Provider" | "Owner" | "Pharmacy"
Yes
systemAdmin
Boolean
Indicates if user is a System Administrator
Yes
chartingInitials
String (5)
User's charting initials
Yes
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 phone number
No
cellphone
String (16)
User's cellphone number
No
cellCarrier
String (15)
User's cellphone carrier
"Alltel" | "AT&T" | "Boost Mobile" | "CellCom" | "CellularOne" | "Cingular" | "Cricket" | "Metro PCS" | "Net10" | "Nextel" | "Omnipoint" | "Qwest" | "Spectrum Mobile" | "Sprint" | "T-Mobile" | "US Cellular" | "Verizon" | "Virgin Mobile"
No
pager
String (16)
User's pager number
No
email
String (150)
User's email address
No
[Potential 400 Errors Returned]
N/A
An individual error or list of errors. Potential errors include:
  - loginName or userId query parameter is required.
  - No information found for the loginName or userId specified.
If using ECP's user-specific OAuth token approach (authorization_code grant type):
  - You do not have permission to view other users' information in ECP.
No

 

Method: GET
URL: https://api.ecp123.com/clinical/v1/locations/{locationId}/stages
URL Path Parameters: Add /{stageId} to URL to retrieve a specific stage's information.
Scope Required:
stage.read
Description: This endpoint is utilized to retrieve the ECP CRM/Move-Ins Stage configuration per locationId specified in the request URL. The locationId specified must have the ECP CRM/Move-Ins product enabled to get any information returned.

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 endpoints the vendor/company has access to Yes
Optional Request Parameters:
Parameter Data Type Type Description
page Number Query String Parameter By default, results are returned in batches of 100. Page is sometimes necessary to see subsequent results.
Example Provided: ".../stages?page=2"
resultsPerPage Number Query String Parameter Used to specify the amount of results per page with a max of 100. If this value is greater than 100, 100 will be returned.
Example Provided: ".../stages?resultsPerPage=10&page=2"

stageId String (GUID) Path Parameter Added to URL to return a specific stage's info.
Example Provided: "...v1/locations/1fc5EEEE-AAAA-4f75-CCCC-4ecd23feBBCC/stages/AAAA8823-83e2-42dc-BBBB-9bb57e125844"
Response:
Parameter Data Type Description Always Specified
result String Either "Success" or "Error" Yes
data Array of Stage Objects
Contains an array of Stage objects including the following:
{
   displayValue (String),
   type (String - "archived" or "custom" or "default"),
   order (Integer),
   restricted (Boolean),
   stageId (String - GUID)
}
Notes: Type can be used to tell the difference between the default landing stage for new leads/prospects if stage is not specified ("default"), what stage(s) are treated as archived ("archived"), and all others ("custom"). The Restricted boolean indicates the stage cannot be interacted with via other API endpoints (POST/PATCH Resident).
No
numberOfResults Number The total number of results (the response is paginated in batches of what resultsPerPage is set to, with a default max of 100 results per page) No
error String If an error occurred, the error message No

Note: CRM endpoints use a different method of authorization than the other REST endpoints. You can get a CRM API key from settings within the application. You’ll also need to generate a “snippet ID” — also from in-app CRM settings — that serves as a destination location identifier. These values are included in the required payload body. The request body MUST be encoded as multipart/form-data.
Method:
POST
URL:
https://crm.ecp123.com/system/integrations/webform/addLead_webform.cfm
Scope Required:
API scopes are not used for CRM endpoints.
Description: Create a lead in CRM given basic contact information.

Request Body:
Parameter
Data Type
Description
Required
APIKEY
String
CRM-generated persistent auth token (account-level)
Yes
SNIPPETID
String
CRM-generated linking ID to route new leads to a given location within the account
Yes
SOURCE_NAME
String
Displayed on the lead as “Added From” - e.g. the name of your app
Yes
inquiringFor
String
MUST be one of “lovedOne” or “myself”. Controls interpretation of some fields below.
Yes
FIRST_NAME
String
Saved as the contact’s first name when inquiringFor = “lovedOne”. Saved as the prospective resident’s first name when inquiringFor = “myself”.
Yes
LAST_NAME
String
Saved as the contact’s last name when inquiringFor = “lovedOne”. Saved as the prospective resident’s last name when inquiringFor = “myself”.
No
PHONE
String
Saved on the contact record when inquiringFor = “lovedOne”. Saved on the prospective resident record when inquiringFor = “myself”. Send as 10 sequential digits, i.e. “8658675309”.
PHONE or EMAIL required.
EMAIL
String
Saved on the contact record when inquiringFor = “lovedOne”. Saved on the prospective resident record when inquiringFor = “myself”.
PHONE or EMAIL required.
LOVED_ONE_FIRST_NAME
String
First name of the prospective resident. Ignored if inquiringFor is not “lovedOne”.
Required when inquiringFor = "lovedOne"
LOVED_ONE_LAST_NAME
String
Last name of the prospective resident. Ignored if inquiringFor is not “lovedOne”.
Required when inquiringFor = "lovedOne"
REASON_FOR_INQUIRY
String
Short text saved to a dedicated field on the lead
Yes
PREFERRED_METHOD
String
MUST be one of “Phone”, “Text”, or “Email”. Saved on the contact record when inquiring for a loved one. Saved on the prospective resident record when inquiring for self.
No
TRANSCRIPT
String
Saved as a new Note on the newly created lead. Not frequently used.
No
INTEGRATION_TRAFFIC_SOURCE
String
Displayed in lead sourcing info - e.g., the referer [sic] before your app converted the lead
No
INTEGRATION_SUBMISSION_LOCATION
String
Displayed in lead sourcing info - e.g., the particular page in your app where the lead converted
No
LEAD_MESSAGE
String
Saved as a new Note on the newly created lead
No
REQUESTED_TOUR_DATE
String
Added as context on the auto-created first followup task for the lead. Not frequently used.
No
Response:
Note:
You'll get a 200 in all cases, success or failure.
Parameter Data Type Description Required
success
Integer
1 when the lead was successfully created. 0 when the lead was not. This is the primary result you should key off of.
Yes
message
String
Human-readable status message
Yes
LEAD_ID
Integer
Internal ID of lead. Useful for constructing URLs etc.
No
errors
Object
Key/value pairs describing some errors that may have been encountered.
No
NEW_LEAD_DATA
Object in Array
A full representation of the newly created lead object
No
Request Body Sample #1:
When the person in question is the prospective resident themselves (minimum required payload). In this example, the lead John Public will get created with no linked contacts.
Key Value
SNIPPETID
99
APIKEY
12345-ABC-DEF-67890
inquiringFor
myself
FIRST_NAME
John
LAST_NAME
Public
EMAIL
john@email.com
PHONE
8658675309
REASON_FOR_INQUIRY
Looking for more help during the day
SOURCE_NAME
Postman
Request Body Sample #2:
When the person in question is a family member of the prospective resident (minimum required payload). In this example, The lead Frank Public will get created with a linked primary contact for John Public.
Key Value
SNIPPETID 99
APIKEY 12345-ABC-DEF-67890
inquiringFor lovedOne
FIRST_NAME John
LAST_NAME Public
EMAIL john@email.com
PHONE 8658675309
REASON_FOR_INQUIRY Looking for more help during the day
SOURCE_NAME Postman
LOVED_ONE_FIRST_NAME Frank
LOVED_ONE_LAST_NAME Public

 

ECP Integration partners

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.