This quick start guide details how to access the Resident Management API and use each endpoint to manage residents within Site Manager sites. For detailed reference about how Site Manager functions and interacts with the Resident Management API, see Resident Management API - Overview.
We have created a Postman collection for your convenience. You can download the collection from the Resident Management API - Postman Collection article.
All of the examples in this guide use a service account with the staff user type and non-elevated permissions. Please see the Resident Management API - Access and Permissions guide for more information on creating a service account and the permissions that best fit your needs.
Change Log
Date | Changes Made |
---|---|
11/11/2021 | -Initial release |
06/08/2022 | -Edit article for grammar and spelling errors |
Base URL
All requests must use the following base URL:
https://api.11os.com/v2
Authorization
To interact with the Resident Management API, you must first obtain an access token and use it in the Authorization
header of all requests. You can obtain your access token using the following endpoint:
POST /oauth/token
The easiest way to generate your access token is by Base64-encoding your Site Manager user email and password and putting it into the Authorization
header.
Your Base64-encoded credentials should look something like this:example@email.com:ElevenIsAwesome!
= YmlsbHlib2JAZ21haWwuY29tOlBhbmNha2VzNDIwNjk=
The Authorization
header will look like this:Authorization: Password YmlsbHlib2JAZ21haWwuY29tOlBhbmNha2VzNDIwNjk=
This endpoint returns a JSON object containing the access token you must use in all subsequent requests.
Request Examples
curl --location --request \
POST 'https://api.11os.com/v2/oauth/token' \
--header 'Authorization: Password YmlsbHlib2JAZ21haWwuY29tOlBhbmNha2VzNDIwNjk='
import requests
url = "https://api.11os.com/v2/oauth/token"
payload={}
headers = {
'Authorization': 'Password YmlsbHlib2JAZ21haWwuY29tOlBhbmNha2VzNDIwNjk='
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Example Response
Status: 200
Successful operation
{
"access_token": "your-bearer-token",
"expires_in": 43200,
"refresh_token": "your-refresh-token",
"roles": "your-roles",
"scope": "sitemanager",
"token_type": "Bearer"
}
Use the access_token
value as your bearer token for all subsequent requests to the Resident Management API.
Find a Team ID
Now that you have an access token, you can start using the Resident Management API. First, you need to obtain a Team ID. A Team ID uniquely identifies each team within Site Manager and is required for all endpoints with the TeamId
parameter.
To find your Team ID, use the following endpoint:
GET /team
This endpoint returns all of the teams that the account used to make the request is a member of. If your account is only on one team, then the Teams
array in the response will only contain one team. If your account is on multiple teams, ensure that you use the correct Team ID of the sites within it.
Request Examples
curl --location --request \
GET 'https://api.11os.com/v2/team' \
--header 'Authorization: Bearer your_bearer_token-here'
import requests
url = "https://api.11os.com/v2/team"
payload={}
headers = {
'Authorization': 'Bearer your_bearer_token-here'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
Response
Status: 200
Successful operation
{
"Error": null,
"Teams": [
{
"Config": {
"enablePasspoint": true,
"hideUnbrandedSites": false
},
"LastTeam": "true",
"Name": "Your Team Name",
"TeamId": "t-bmy8nwpe4gwn7alqrvds1473190764",
"TeamEmail": "example@email.com"
}
]
}
Save the TeamId
value as the TeamId
parameter in endpoints that require it.
Find a Site ID
To start managing residents, you need the Site ID of the site you wish to manage residents. A Site ID is required for all endpoints that require the SiteId
parameter.
To find your Site ID, use the following endpoint:
GET /team/{TeamId}/site
This endpoint returns a list of all sites on the specified team that the account has access to. If your account has access to only one site, then the Sites
array in the response will only contain one site. If your account has access to multiple sites, ensure that you use the correct Site ID of the site you want to manage residents.
Request Examples
curl --location --request \
GET 'https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site' \
--header 'your-bearer-token-here'
import requests
url = "https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site"
payload={}
headers = {
'Authorization': 'Bearer your-bearer-token-here'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
Response
Status: 200
Successful operation
{
"Error": null,
"Sites": [
{
"s-x9jfuwtopv6k3s7mdyj91578962651": {
"Brand": "portfolio-name-here",
"BrandConfig": {
"enableTerminateAndPurge": true
},
"BrandId": "b-xf0gojxylyef949ujawy1571447142",
"Config": "{\"reports\":true,\"conferences\":true,\"portals\":true,\"portalsAdmin\":\"adminOnly\",\"EnterpriseDevices\":false,\"accessCodes\":true}",
"CurrencyCode": "USD",
"DashboardId": "DEMO",
"ExtPropId": "RE-833-87",
"GlobalReportCollectionId": null,
"Name": "Wraeclast Heights",
"Number": "RE-833-87",
"PortalUrl": "https://secure.guestinternet.com/portal/juno/brands/charter/keysmith/index.html?api_domain=https://secure.11os.com",
"ReportCollectionId": "DEMO",
"SiteId": "s-x9jfuwtopv6k3s7mdyj91578962651",
"SmsDelivery": true,
"Sources": [],
"TeamId": "t-bmy8nwpe4gwn7alqrvds1473190764",
"TeamName": "your-team-name-here",
"ThemeColors": {
"mainColor": "rgba(247, 136, 47, 1)",
"mainColor__hover": "rgba(255, 249, 245, 0.7)",
"submitButton": "rgba(255, 193, 7, 1)",
"submitButton__hover": "rgba(255, 245, 217, 0.8)"
},
"Timezone": "America/Los_Angeles",
"UserCount": 3,
"VerticalType": "DPSK"
}
}
]
}
Save the SiteId
value as the SiteId
parameter in endpoints that require it.
Get PAN Mappings
Now that you have a Team and Site ID, you may want to manage residents right away. However, before you start managing residents, you will also need to know the available PAN Mapping configuration of the site in Site Manager.
When managing an individual resident or multiple residents at once, the Building, Floor, and Unit values sent in the POST request must match available values returned from the GET /team/{TeamId}/site/{SiteId}/mappings
endpoint.
To get a list of PAN Mappings at a site, use the following endpoint:
GET /team/{TeamId}/site/{SiteId}/mappings
Request Examples
curl --location --request \
GET 'https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/mappings' \
--header 'Authorization: Bearer your-bearer-token-here'
import requests
url = "https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/mappings"
payload={}
headers = {
'Authorization': 'Bearer your-bearer-token-here'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
Response
Status: 200
Successful operation
{
"Error": null,
"Mappings": [
{
"Building": "Hudson",
"Floor": "1",
"Passphrase": null,
"Ssid": "Wraeclast Heights",
"Unit": "100",
"Vlan": 401
},
{
"Building": "Hudson",
"Floor": "1",
"Passphrase": null,
"Ssid": "Wraeclast Heights",
"Unit": "101",
"Vlan": 402
},
{
"Building": "Hudson",
"Floor": "1",
"Passphrase": null,
"Ssid": "Wraeclast Heights",
"Unit": "102",
"Vlan": 403
},
{
"Building": "Hudson",
"Floor": "1",
"Passphrase": null,
"Ssid": "Wraeclast Heights",
"Unit": "103",
"Vlan": 404
},
...remaining mappings omitted for brevity
]
}
Use the returned values from the Mappings
array to fill out the Building
, Floor
, and Unit
values in the ResidentObject
object for adding individual residents or the ResidentImportObject
object when adding multiple residents. The Passphrase
, SSID
, and Vlan
items are not required for adding residents.
Add Residents
Now that you have a Team ID, Site ID, and PAN Mapping values, you can start adding residents to the desired site. You can add residents individually or bulk import multiple residents.
Keep in mind the following requirements when adding residents:
- Only one resident can occupy a unit on any given date or date range.
Add Individual Residents
First, add a single resident to the site using the Team ID and Site ID you received from the previous requests.
To add residents individually, use the following endpoint, which imports a JSON object containing the one resident you want to add:
POST /team/{TeamId}/site/{SiteId}/resident
In the body of the /team/{TeamId}/site/{SiteId}/resident
request, you must include the ResidentObject
object.
The ResidentObject
contains all the necessary information to create a resident. If any of this information needs to change in the future, please use the endpoint for updating a resident.
Example Request Body
{
"Email": "cwilson@email.com",
"FirstName": "Chris",
"LastName": "Wilson",
"PhoneNumber": "543-678-9012",
"Building": "Hudson",
"Floor": "1",
"Unit": "105",
"ActivationDateUTC": "2021-11-05T19:00:00.000Z",
"DecactivationDateUTC": "2022-11-06T19:00:00.000Z"
}
Request Examples
curl --location --request \
POST 'https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-jgsa8ue91p0r4tn0w9d71499972357/resident' \
--header 'Authorization: Bearer your-bearer-token-here' \
--header 'Content-Type: application/json' \
--data-raw '{
"Email": "cwilson@email.com",
"FirstName": "Chris",
"LastName": "Wilson",
"PhoneNumber": "543-678-9012",
"Building": "Hudson",
"Floor": "1",
"Unit": "105",
"ActivationDateUTC": "2021-11-05T19:00:00.000Z",
"DecactivationDateUTC": "2022-11-06T19:00:00.000Z"
}'
import requests
import json
url = "https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-jgsa8ue91p0r4tn0w9d71499972357/resident"
payload = json.dumps({
"Email": "cwilson@email.com",
"FirstName": "Chris",
"LastName": "Wilson",
"PhoneNumber": "543-678-9012",
"Building": "Hudson",
"Floor": "1",
"Unit": "105",
"ActivationDateUTC": "2021-11-05T19:00:00.000Z",
"DecactivationDateUTC": "2022-11-06T19:00:00.000Z"
})
headers = {
'Authorization': 'Bearer your-bearer-token-here',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Response
Status: 200
Successful operation
{
"Error": null,
"Status": [
"current",
"pending"
]
}
A JSON object is returned with the new resident's status. Save the ResidentId
value as the ResidentId
parameter in endpoints that require it.
Add Multiple Residents
To add multiple residents at once, use the following endpoint, which imports a JSON object containing all residents you want to add:
POST /team/{TeamId}/site/{SiteId}/resident/import
Request Body Example
In the body of the POST
request, you must include the ResidentImportObject
request body object payload.
[
{
"Email": "cwilson@email.com",
"FirstName": "Chris",
"LastName": "Wilson",
"PhoneNumber": "543-678-9012",
"Building": "Highgate",
"Floor": "1",
"Unit": "105",
"ActivationDateUTC": "2021-11-05T19:00:00.000Z",
"DeactivationDateUTC": "2022-11-06T19:00:00.000Z"
},
{
"Email": "astark@email.com",
"First Name": "Anthony",
"Last Name": "Stark",
"Phone Number": "543-678-9013",
"Building": "Highgate",
"Floor": "2",
"Unit": "201",
"ActivationDateUTC": "2021-12-04T19:00:00.000Z",
"DeactivationDateUTC": "2022-12-05T19:00:00.000Z"
},
{
"Email": "srodgers@email.com",
"First Name": "Steve",
"Last Name": "Rodgers",
"Phone Number": "543-678-9014",
"Building": "Highgate",
"Floor": "2",
"Unit": "209",
"ActivationDateUTC": "2021-10-01T19:00:00.000Z",
"DeactivationDateUTC": ""
},
{
"Email": "hpym@email.com",
"First Name": "Hank",
"Last Name": "Pym",
"Phone Number": "543-678-9015",
"Building": "Highgate",
"Floor": "3",
"Unit": "303",
"ActivationDateUTC": "2022-01-01T19:00:00.000Z",
"DeactivationDateUTC": "2023-01-01T19:00:00.000Z"
}
]
Request Examples
curl --location --request \
POST 'https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/import' \
--header 'Authorization: Bearer your-bearer-token-here' \
--header 'Content-Type: application/json' \
--data-raw '[
{
"Email": "cwilson@email.com",
"First Name": "Chris",
"Last Name": "Wilson",
"Phone Number": "543-678-9012",
"Building": "Hudson",
"Floor": "1",
"Unit": "105",
"ActivationDateUTC": "2021-11-05T19:00:00.000Z",
"DeactivationDateUTC": "2022-11-06T19:00:00.000Z"
},
{
"Email": "astark@email.com",
"First Name": "Anthony",
"Last Name": "Stark",
"Phone Number": "543-678-9013",
"Building": "Hudson",
"Floor": "2",
"Unit": "201",
"ActivationDateUTC": "2021-12-04T19:00:00.000Z",
"DeactivationDateUTC": "2022-12-05T19:00:00.000Z"
},
{
"Email": "srodgers@email.com",
"First Name": "Steve",
"Last Name": "Rodgers",
"Phone Number": "543-678-9014",
"Building": "Hudson",
"Floor": "2",
"Unit": "209",
"ActivationDateUTC": "2021-10-01T19:00:00.000Z",
"DeactivationDateUTC": ""
},
{
"Email": "hpym@email.com",
"First Name": "Hank",
"Last Name": "Pym",
"Phone Number": "543-678-9015",
"Building": "Hudson",
"Floor": "3",
"Unit": "303",
"Access Start": "01/01/2022",
"Access End": "01/01/2023"
}
]'
import requests
import json
url = "https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/import"
payload = json.dumps([
{
"Email": "cwilson@email.com",
"First Name": "Chris",
"Last Name": "Wilson",
"Phone Number": "543-678-9012",
"Building": "Hudson",
"Floor": "1",
"Unit": "105",
"ActivationDateUTC": "2021-11-05T19:00:00.000Z",
"DeactivationDateUTC": "2022-11-06T19:00:00.000Z"
},
{
"Email": "astark@email.com",
"First Name": "Anthony",
"Last Name": "Stark",
"Phone Number": "543-678-9013",
"Building": "Hudson",
"Floor": "2",
"Unit": "201",
"ActivationDateUTC": "2021-12-04T19:00:00.000Z",
"DeactivationDateUTC": "2022-12-05T19:00:00.000Z"
},
{
"Email": "srodgers@email.com",
"First Name": "Steve",
"Last Name": "Rodgers",
"Phone Number": "543-678-9014",
"Building": "Hudson",
"Floor": "2",
"Unit": "209",
"ActivationDateUTC": "2021-10-01T19:00:00.000Z",
"DeactivationDateUTC": ""
},
{
"Email": "hpym@email.com",
"First Name": "Hank",
"Last Name": "Pym",
"Phone Number": "543-678-9015",
"Building": "Hudson",
"Floor": "3",
"Unit": "303",
"ActivationDateUTC": "2022-01-01T19:00:00.000Z",
"DeactivationDateUTC": "2023-01-01T19:00:00.000Z"
}
])
headers = {
'Authorization': 'Bearer your-bearer-token-here',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Response
Status: 200
Successful operation
{
"Error": null,
"job_id": "9d4c9436-2357-4e39-9979-5cb842b03bfa"
}
A JSON object is returned containing the Job ID of the import job. Save the job_id
value as the job_id
parameter in endpoints that require it. This endpoint only returns a Job ID and does not indicate whether the job has failed or succeeded. If any errors were present in the import job, the following endpoint describes how to find them.
Additionally, Site Manager sends an email to the account associated with the access token that made the call. This email provides the same breakdown available in the next endpoint. Example email:
Get Import Job Status
After importing residents and receiving the Job ID, you can check the status of the import job using the following endpoint:
GET /team/{TeamId}/site/{SiteId}/resident/import/{import_job_id}
Request Examples
curl --location --request \
GET 'https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/import/9d4c9436-2357-4e39-9979-5cb842b03bfa' \
--header 'Authorization: Bearer your-bearer-token-here'
import requests
url = "https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/import/9d4c9436-2357-4e39-9979-5cb842b03bfa"
payload={}
headers = {
'Authorization': 'Bearer your-bearer-token-here'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
Response
An incomplete job will not display the result
field because the job has not finished yet. Once a job is complete, the result
field displays each resident that was successfully added or failed. Errors found during the import contain the value where the error occurred for each resident.
Table-3 below contains the fields and their descriptions that are returned from this endpoint:
Field Name | Description |
---|---|
|
The number of residents that failed to import. |
|
The percentage of job completion. |
|
An array containing arrays of residents and their details that were successfully imported (success) or failed to import (failed). Errors are indicated in the failed array. |
|
The status of the job ( |
|
The number of residents successfully imported. |
|
The sum of success and failed residents attempted to import.
|
Below are three example responses; an incomplete job's response, a complete job's response that succeeded in importing, and a complete job's response that failed to import.
Status: 200
Successful operation
{
"failed": 0,
"progress": 50,
"status": "started",
"success": 2,
"total": 4
}
{
"failed": 0,
"progress": 100,
"result": {
"failed": [],
"success": [
{
"Access End": "2022-11-06T11:00:00",
"Access Start": "2021-11-08T21:19:18",
"ActivationDateUTC": "2021-11-05T19:00:00.000Z",
"Building": "Hudson",
"DeactivationDateUTC": "2022-11-06T19:00:00.000Z",
"Email": "cwilson@email.com",
"First Name": "Chris",
"Floor": "1",
"Last Name": "Wilson",
"Phone Number": "543-678-9012",
"Unit": "105",
"email": "cwilson@email.com",
"givenname": "Chris",
"row_id": 1
},
{
"Access End": "2022-12-05T11:00:00",
"Access Start": "2021-12-04T11:00:00",
"ActivationDateUTC": "2021-12-04T19:00:00.000Z",
"Building": "Hudson",
"DeactivationDateUTC": "2022-12-05T19:00:00.000Z",
"Email": "astark@email.com",
"First Name": "Anthony",
"Floor": "2",
"Last Name": "Stark",
"Phone Number": "543-678-9013",
"Unit": "201",
"email": "astark@email.com",
"givenname": "Anthony",
"row_id": 2
},
{
"Access End": "",
"Access Start": "2021-11-08T21:19:18",
"ActivationDateUTC": "2021-10-01T19:00:00.000Z",
"Building": "Hudson",
"DeactivationDateUTC": "",
"Email": "srodgers@email.com",
"First Name": "Steve",
"Floor": "2",
"Last Name": "Rodgers",
"Phone Number": "543-678-9014",
"Unit": "209",
"email": "srodgers@email.com",
"givenname": "Steve",
"row_id": 3
},
{
"Access End": "2023-01-01T11:00:00",
"Access Start": "2022-01-01T11:00:00",
"ActivationDateUTC": "2022-01-01T19:00:00.000Z",
"Building": "Hudson",
"DeactivationDateUTC": "2023-01-01T19:00:00.000Z",
"Email": "hpym@email.com",
"First Name": "Hank",
"Floor": "3",
"Last Name": "Pym",
"Phone Number": "543-678-9015",
"Unit": "303",
"email": "hpym@email.com",
"givenname": "Hank",
"row_id": 4
}
]
},
"status": "finished",
"success": 4,
"total": 4
}
{
"failed": 4,
"progress": 100,
"result": {
"failed": [
{
"Access End": "2022-11-06T11:00:00",
"Access Start": "2021-11-09T13:10:25",
"ActivationDateUTC": "2021-11-05T19:00:00.000Z",
"Building": "Hudson",
"DeactivationDateUTC": "2022-11-06T19:00:00.000Z",
"Email": "cwilson@email.com",
"Error": "Email address already exists at this site.",
"First Name": "Chris",
"FirstName": "Chris",
"Floor": "1",
"Last Name": "Wilson",
"LastName": "Wilson",
"Phone Number": "543-678-9012",
"Unit": "105",
"email": "cwilson@email.com",
"error_msg": "Email address already exists at this site.",
"givenname": "Chris",
"row_id": 1,
"surname": "Wilson"
},
{
"Access End": "2022-12-05T11:00:00",
"Access Start": "2021-12-04T11:00:00",
"ActivationDateUTC": "2021-12-04T19:00:00.000Z",
"Building": "Hudson",
"DeactivationDateUTC": "2022-12-05T19:00:00.000Z",
"Email": "astark@email.com",
"Error": "Email address already exists at this site.",
"First Name": "Anthony",
"FirstName": "",
"Floor": "2",
"Last Name": "Stark",
"LastName": "",
"Phone Number": "543-678-9013",
"Unit": "201",
"email": "astark@email.com",
"error_msg": "Email address already exists at this site.",
"givenname": "Anthony",
"row_id": 2,
"surname": "Stark"
},
{
"Access End": "",
"Access Start": "2021-11-09T13:10:25",
"ActivationDateUTC": "2021-10-01T19:00:00.000Z",
"Building": "Hudson",
"DeactivationDateUTC": "",
"Email": "srodgers@email.com",
"Error": "Email address already exists at this site.",
"First Name": "Steve",
"FirstName": "",
"Floor": "2",
"Last Name": "Rodgers",
"LastName": "",
"Phone Number": "543-678-9014",
"Unit": "209",
"email": "srodgers@email.com",
"error_msg": "Email address already exists at this site.",
"givenname": "Steve",
"row_id": 3,
"surname": "Rodgers"
},
{
"Access End": "2023-01-01T11:00:00",
"Access Start": "2022-01-01T11:00:00",
"ActivationDateUTC": "2022-01-01T19:00:00.000Z",
"Building": "Hudson",
"DeactivationDateUTC": "2023-01-01T19:00:00.000Z",
"Email": "hpym@email.com",
"Error": "Email address already exists at this site.",
"First Name": "Hank",
"FirstName": "Hank",
"Floor": "3",
"Last Name": "Pym",
"LastName": "Pym",
"Phone Number": "543-678-9015",
"Unit": "303",
"email": "hpym@email.com",
"error_msg": "Email address already exists at this site.",
"givenname": "Hank",
"row_id": 4,
"surname": "Pym"
}
],
"success": []
},
"status": "finished",
"success": 0,
"total": 4
}
Get All Residents
Now that you've added some residents to the site, you can now view all residents at the site.
To get all residents at a site, use the following endpoint:
GET /team/{TeamId}/site/{SiteId}/resident
Request Examples
curl --location --request GET 'https://api.11os.com/v2/team/t-ydb4ewne7kgn6aldienvyd195648365/site/s-jgsa8ue91p0r4tn0w9d71444972357/resident/' \
--header 'Authorization: Bearer your-bearer-token-here'
import requests
url = "https://api.11os.com/v2/team/t-ydb4ewne7kgn6aldienvyd195648365/site/s-jgsa8ue91p0r4tn0w9d71444972357/resident/"
payload={}
headers = {
'Authorization': 'Bearer your-bearer-token-here'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
Response
A JSON object is returned with all of the residents at a site. Save the ResidentId
value for desired residents you want to manage as the ResidentId
parameter in endpoints that require it.
Status: 200
Successful operation
{
"Error": null,
"Residents": [
{
"ActivationDate": "2021-11-09T13:08:49",
"ActivationDateUTC": "2021-11-09T21:08:49.742291+00:00",
"Building": "Hudson",
"DeactivationDate": "2022-11-06T11:00:00",
"DeactivationDateUTC": "2022-11-06T19:00:00+00:00",
"Email": "cwilson@email.com",
"FirstName": "Chris",
"Floor": "1",
"LastName": "Wilson",
"Mobile": null,
"OnboardedAt": "2021-11-09T21:08:56",
"Phone": "543-678-9012",
"ResidentId": "94adae3b-9eb8-4f1a-a64c-9065caba22c8",
"ServiceAreaNumber": "OD-808-78",
"Status": [
"current",
"pending"
],
"UUID": "94adae3b-9eb8-4f1a-a64c-9065caba22c8",
"Unit": "105"
},
{
"ActivationDate": "2021-12-04T11:00:00",
"ActivationDateUTC": "2021-12-04T19:00:00+00:00",
"Building": "Hudson",
"DeactivationDate": "2022-12-05T11:00:00",
"DeactivationDateUTC": "2022-12-05T19:00:00+00:00",
"Email": "astark@email.com",
"FirstName": "Anthony",
"Floor": "2",
"LastName": "Stark",
"Mobile": null,
"OnboardedAt": null,
"Phone": "543-678-9013",
"ResidentId": "711c131b-4862-43fd-9008-04125597e26a",
"ServiceAreaNumber": "OD-808-78",
"Status": [
"scheduled"
],
"UUID": "711c131b-4862-43fd-9008-04125597e26a",
"Unit": "201"
},
{
"ActivationDate": "2021-11-09T13:08:49",
"ActivationDateUTC": "2021-11-09T21:08:49.742291+00:00",
"Building": "Hudson",
"DeactivationDate": null,
"DeactivationDateUTC": null,
"Email": "srodgers@email.com",
"FirstName": "Steve",
"Floor": "2",
"LastName": "Rodgers",
"Mobile": null,
"OnboardedAt": "2021-11-09T21:09:03",
"Phone": "543-678-9014",
"ResidentId": "bf22914a-2bb6-401a-b0a9-016ad6ccac98",
"ServiceAreaNumber": "OD-808-78",
"Status": [
"current",
"pending"
],
"UUID": "bf22914a-2bb6-401a-b0a9-016ad6ccac98",
"Unit": "209"
},
{
"ActivationDate": "2022-01-01T11:00:00",
"ActivationDateUTC": "2022-01-01T19:00:00+00:00",
"Building": "Hudson",
"DeactivationDate": "2023-01-01T11:00:00",
"DeactivationDateUTC": "2023-01-01T19:00:00+00:00",
"Email": "hpym@email.com",
"FirstName": "Hank",
"Floor": "3",
"LastName": "Pym",
"Mobile": null,
"OnboardedAt": null,
"Phone": "543-678-9015",
"ResidentId": "eb196140-d804-461a-9b40-b978df6fdc2e",
"ServiceAreaNumber": "OD-808-78",
"Status": [
"scheduled"
],
"UUID": "eb196140-d804-461a-9b40-b978df6fdc2e",
"Unit": "303"
}
]
}
Get an Individual Resident
After getting the list of all residents at a site from the previous endpoint, you can use the ResidentId
of specific residents to see the details of each resident individually.
To get details about a specific resident at a site, use the following endpoint:
GET /team/{TeamId}/site/{SiteId}/resident/{ResidentId}
Request Examples
curl --location --request \
GET 'https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/94adae3b-9eb8-4f1a-a64c-9065caba22c8' \
--header 'Authorization: Bearer your-bearer-token-here'
import requests
url = "https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/94adae3b-9eb8-4f1a-a64c-9065caba22c8"
payload={}
headers = {
'Authorization': 'Bearer your-bearer-token-here'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
Response
Status: 200
Successful operation
{
"Error": null,
"Residents": [
{
"ActivationDate": "2021-11-09T13:08:49",
"ActivationDateUTC": "2021-11-09T21:08:49.742291+00:00",
"Building": "Hudson",
"DeactivationDate": "2022-11-06T11:00:00",
"DeactivationDateUTC": "2022-11-06T19:00:00+00:00",
"Email": "cwilson@email.com",
"FirstName": "Chris",
"Floor": "1",
"LastName": "Wilson",
"Mobile": null,
"OnboardedAt": "2021-11-09T21:08:56",
"Phone": "543-678-9012",
"ResidentId": "94adae3b-9eb8-4f1a-a64c-9065caba22c8",
"SSID": "Wraeclast Heights",
"ServiceAreaNumber": "OD-808-78",
"Status": [
"current",
"pending"
],
"UUID": "94adae3b-9eb8-4f1a-a64c-9065caba22c8",
"Unit": "105"
}
]
}
Update a Resident
To update a resident, use the following endpoint:
PUT /team/{TeamId}/site/{SiteId}/resident/{ResidentId}
In the body of the /team/{TeamId}/site/{SiteId}/resident/{ResidentId}
request, you must include the ResidentObject
object.
The ResidentObject
contains the editable fields for each resident.
Example Request Body
Using the same resident from the example in the GET /team/{{TeamId}}/site/{{SiteId}}/resident
response, for this example, the request body below contains a change to the resident's name in the ResidentObject
.
{
"Email": "cwilson@email.com",
"First Name": "Christopher",
"Last Name": "Wilson",
"Building": "Hudson",
"Floor": "1",
"Unit": "105",
"ActivationDateUTC": "2021-11-05T19:00:00.000Z",
"DeactivationDateUTC": "2022-11-06T19:00:00.000Z"
}
Request Examples
curl --location --request \
PUT 'https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/94adae3b-9eb8-4f1a-a64c-9065caba22c8' \
--header 'Authorization: Bearer your-bearer-token-here' \
--header 'Content-Type: application/json' \
--data-raw '{
"Email": "cwilson@email.com",
"FirstName": "Christopher",
"LastName": "Wilson",
"Building": "Hudson",
"Floor": "1",
"Unit": "105",
"ActivationDateUTC": "2021-11-05T19:00:00.000Z",
"DeactivationDateUTC": "2022-11-06T19:00:00.000Z"
}'
import requests
import json
url = "https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/94adae3b-9eb8-4f1a-a64c-9065caba22c8"
payload = json.dumps({
"Email": "cwilson@email.com",
"FirstName": "Christopher",
"LastName": "Wilson",
"Building": "Hudson",
"Floor": "1",
"Unit": "105",
"ActivationDateUTC": "2021-11-05T19:00:00.000Z",
"DeactivationDateUTC": "2022-11-06T19:00:00.000Z"
})
headers = {
'Authorization': 'Bearer your-bearer-token-here',
'Content-Type': 'application/json'
}
response = requests.request("PUT", url, headers=headers, data=payload)
print(response.text)
Response
A successful response includes the same information as the GET /team/{{TeamId}}/site/{{SiteId}}/resident
response but with the updated information that you sent in the ResidentObject
.
Status: 200
Successful operation
{
"ActivationDate": "2021-11-09",
"ActivationDateUTC": "2021-11-09T21:08:49.742291+00:00",
"Building": "Hudson",
"DeactivationDate": null,
"DeactivationDateUTC": null,
"Email": "cwilson@email.com",
"Error": null,
"FirstName": "Christopher",
"Floor": "1",
"LastName": "Wilson",
"Mobile": null,
"Phone": "543-678-9666",
"SSID": "DPSK Retirement Home",
"ServiceAreaNumber": "RE-833-87",
"Status": [
"current",
"pending"
],
"UUID": "94adae3b-9eb8-4f1a-a64c-9065caba22c8",
"Unit": "105"
}
Terminate a Resident
To terminate a resident, use the following endpoint:
DELETE /team/{TeamId}/site/{SiteId}/resident/{ResidentId}
When you terminate a resident, their account remains in Site Manager in the Expired status for a 31-day grace period before being automatically purged and completely removed. During the 31-day grace period, the resident no longer occupies the unit, and you can add new residents to this unit.
Terminating a resident changes their Deactivation Date to the day before you terminated them. For example, if you terminate a resident on Nov 10th, their Deactivation Date is set to Nov 9th.
You cannot add residents in the Expired status as they still exist in Site Manager. To reactivate service for a resident in Expired status, you must use the endpoint for updating a resident.
Request Examples
curl --location --request \
DELETE 'https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/94adae3b-9eb8-4f1a-a64c-9065caba22c8' \
--header 'Authorization: Bearer your-bearer-token-here'
import requests
url = "https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/94adae3b-9eb8-4f1a-a64c-9065caba22c8"
payload={}
headers = {
'Authorization': 'Bearer your-bearer-token-here'
}
response = requests.request("DELETE", url, headers=headers, data=payload)
print(response.text)
Response
The response returned contains a JSON object that indicates if an error occurred and the result of the termination. A Result
value of Terminated
means you successfully terminated the resident.
Status: 200
Successful operation
{
"Error": null,
"Result": "Terminated"
}
Terminate and Purge a Resident
To terminate and purge a resident, use the following endpoint:
DELETE /team/{TeamId}/site/{SiteId}/resident/{ResidentId}/purge
Terminating and purging a resident bypasses the 31-day grace period and immediately removes their account from Site Manager. Therefore, residents you terminate and purge cannot be updated because this completely removes them from Site Manager. If you accidentally terminated and purged a resident, you can add the resident as a brand new resident.
Terminating and purging residents can also be a helpful troubleshooting step if issues arise with a resident account.
Request Examples
curl --location --request \
DELETE 'https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/94adae3b-9eb8-4f1a-a64c-9065caba22c8/purge' \
--header 'Authorization: Bearer your-bearer-token-here'
import requests
url = "https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/94adae3b-9eb8-4f1a-a64c-9065caba22c8/purge"
payload={}
headers = {
'Authorization': 'Bearer your-bearer-token-here'
}
response = requests.request("DELETE", url, headers=headers, data=payload)
print(response.text)
Response
The response returned contains a JSON object that indicates if an error occurred and the result of the termination. A Result
value of Deleted
means you successfully terminated and purged the resident from Site Manager.
Status: 200
Successful operation
{
"Error": "null",
"Result": "Deleted"
}
Resend Invitation Email or WiFi Details
To resend an invitation email to residents in Pending status or send the WiFi details to residents in non-Pending status, use the following endpoint:
POST /team/{TeamId}/site/{SiteId}/resident/{ResidentId}/invite
This endpoint has two main functions based on the status of a resident:
- Pending Residents - Resend the invitation email sent to residents on the Activation Date of their service. Note that subsequent invitation emails contain a new link different from the link sent in the first invitation email. However, all links sent remain valid until the resident has completed the onboarding process.
- Non-Pending Residents - Send the WiFi details (WiFi Network Name and Passphrase) in an email. WiFi details are only sent once a resident has completed the onboarding process.
Request Examples
curl --location --request \
POST 'https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/94adae3b-9eb8-4f1a-a64c-9065caba22c8/invite' \
--header 'Authorization: Bearer your-bearer-token-here'
import requests
url = "https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/94adae3b-9eb8-4f1a-a64c-9065caba22c8/invite"
payload={}
headers = {
'Authorization': 'Bearer your-bearer-token-here'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Response
Regardless of the
Status: 200
Successful operation
{
"Error": null
}
Reset a Resident's Pre-Shared Key
To reset a resident's pre-shared key, use the following endpoint:
POST /team/{TeamId}/site/{SiteId}/resident/{ResidentId}/pskreset
This endpoint sends an email to the resident containing a link redirecting them to the ElevenOS portal. On the ElevenOS portal page, the resident confirms that they want to reset their PSK, and after a few moments, the resident is sent another email containing their new PSK.
Request Examples
curl --location --request \
POST 'https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/94adae3b-9eb8-4f1a-a64c-9065caba22c8/pskreset' \
--header 'Authorization: Bearer your-bearer-token-here'
import requests
url = "https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/94adae3b-9eb8-4f1a-a64c-9065caba22c8/pskreset"
payload={}
headers = {
'Authorization': 'Bearer your-bearer-token-here'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Response
Status: 200
Successful operation
{
"Error": null
}
Suspend a Residents Status (Change Status)
To suspend or unsuspend a resident, use the following endpoint:
PATCH /team/{TeamId}/site/{SiteId}/resident/{ResidentId}/status
This endpoint can only suspend or unsuspend residents. You can only suspend residents in a Current non-Pending status or unsuspend residents in a Current and Suspended status. If you attempt a suspend a resident that is not in Current non-Pending status, the state of that resident will remain unchanged, and the response returned will indicate no error occurred.
You must include the ResidentStatus
object in the request body, which can only contain the following values for the Status
field:
Active
- Changes a resident's status to Current non-Pending in the Site Manager UI.Disabled
- Change a resident's status to Suspended and Current in the Site Manager UI.
If you attempt to send any other status in ResidentStatus
object, this endpoint returns an error.
Example Request Body
{
"Status": "disabled"
}
{
"Status": "active"
}
Request Examples
curl --location --request \
PATCH 'https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/94adae3b-9eb8-4f1a-a64c-9065caba22c8/status' \
--header 'Authorization: Bearer your-bearer-token-here' \
--header 'Content-Type: application/json' \
--data-raw '{
"Status": "disabled or active"
}'
import requests
import json
url = "https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/94adae3b-9eb8-4f1a-a64c-9065caba22c8/status"
payload = json.dumps({
"Status": "disabled or active"
})
headers = {
'Authorization': 'Bearer your-bearer-token-here',
'Content-Type': 'application/json'
}
response = requests.request("PATCH", url, headers=headers, data=payload)
print(response.text)
Response
Status: 200
Successful operation
{
"Error": null
}
Perform Bulk Action on Multiple Residents
To perform bulk actions on residents, use the following endpoint:
POST /team/{TeamId}/site/{SiteId}/resident/bulkaction
This endpoint allows you to perform the following actions in bulk by sending the ResidentBulkAction
object.
If you attempt to send any other status in ResidentBulkAction
object, this endpoint returns an error.
Example Request Body
In the body of the POST
request, you must include the ResidentBulkAction
request body object payload.
Table-4 below contains the allowed values for the Action
field in the ResidentBulkAction
endpoint:
Action Field Value | Description |
---|---|
|
Suspends all residents in Current non-Pending status. |
|
Unsuspends all residents in Current and Suspended status. |
|
Terminates all residents in Current, Current and Pending, and Scheduled statuses. |
|
Terminates and purges all residents in Current, Current and Pending, and Scheduled statuses. |
|
Resends invitation emails to all residents in Current and Pending statuses. |
|
Triggers the onboarding process and sends the first invitation email to all Scheduled residents. |
{
"Residents": [
{
"Email": "cwilson@email.com",
"ResidentId": "94adae3b-9eb8-4f1a-a64c-9065caba22c8"
},
{
"Email": "astark@email.com",
"ResidentId": "711c131b-4862-43fd-9008-04125597e26a"
},
{
"Email": "srodgers@email.com",
"ResidentId": "bf22914a-2bb6-401a-b0a9-016ad6ccac98"
},
{
"Email": "hpym@email.com",
"ResidentId": "eb196140-d804-461a-9b40-b978df6fdc2e"
}
],
"Action": "resend-invites"
}
Request Examples
curl --location --request \
POST 'https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/bulkaction' \
--header 'Authorization: Bearer your-bearer-token-here' \
--header 'Content-Type: application/json' \
--data-raw '{
"Residents": [
{
"Email": "cwilson@email.com",
"ResidentId": "94adae3b-9eb8-4f1a-a64c-9065caba22c8"
},
{
"Email": "astark@email.com",
"ResidentId": "711c131b-4862-43fd-9008-04125597e26a"
},
{
"Email": "srodgers@email.com",
"ResidentId": "bf22914a-2bb6-401a-b0a9-016ad6ccac98"
},
{
"Email": "hpym@email.com",
"ResidentId": "eb196140-d804-461a-9b40-b978df6fdc2e"
}
],
"Action": "resend-invites"
}'
import requests
import json
url = "https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/bulkaction"
payload = json.dumps({
"Residents": [
{
"Email": "cwilson@email.com",
"ResidentId": "94adae3b-9eb8-4f1a-a64c-9065caba22c8"
},
{
"Email": "astark@email.com",
"ResidentId": "711c131b-4862-43fd-9008-04125597e26a"
},
{
"Email": "srodgers@email.com",
"ResidentId": "bf22914a-2bb6-401a-b0a9-016ad6ccac98"
},
{
"Email": "hpym@email.com",
"ResidentId": "eb196140-d804-461a-9b40-b978df6fdc2e"
}
],
"Action": "resend-invites"
})
headers = {
'Authorization': 'Bearer your-bearer-token-here',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Response
Status: 200
Successful operation
{
"Error": null,
"job_id": "b89db9d1-9cb0-43f1-bba8-b5ea43545cfb"
}
A JSON object is returned containing the Job ID of the bulk action job. Save the job_id
value as the job_id
parameter in endpoints that require it. This endpoint only returns a Job ID and does not indicate whether the job has failed or succeeded. If any errors were present in the import job, the next endpoint describes how to find them.
Additionally, Site Manager sends an email to the account associated with the access token that made the call. This email provides the same breakdown available in the next endpoint.
Get Bulk Action Job Status
After performing a bulk action on residents and receiving the Job ID, you can check the status of the bulk action job using the following endpoint:
GET /team/{TeamId}/site/{SiteId}/resident/bulkaction/{job_id}
Request Examples
curl --location --request \
GET 'https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/bulkaction/b89db9d1-9cb0-43f1-bba8-b5ea43545cfb' \
--header 'Authorization: Bearer your-bearer-token-here'
import requests
url = "https://api.11os.com/v2/team/t-bmy8nwpe4gwn7alqrvds1473190764/site/s-x9jfuwtopv6k3s7mdyj91578962651/resident/bulkaction/b89db9d1-9cb0-43f1-bba8-b5ea43545cfb"
payload={}
headers = {
'Authorization': 'Bearer your-bearer-token-here'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
Response
An incomplete job will not display the result
field because the job has not finished yet. Once a job is complete, the result
field displays each resident that was successfully added or failed. Errors found during the import contain the value where the error occurred for each resident.
Table-5 below contains the fields and their descriptions that are returned from this endpoint:
Field Name | Description |
---|---|
|
The number of residents that failed to import. |
|
The percentage of job completion. |
|
An array containing arrays of residents and their details that were successfully imported (success) or failed to import (failed). Errors are indicated in the failed array. The result array also includes the action field which contains the bulk action performed or the action_invite indicating invitation emails or WiFi details were sent to residents. |
|
The status of the job ( |
|
The number of residents successfully imported. |
|
The sum of success and failed residents attempted to import.
|
Like the import multiple residents job, errors are presented in line with the item that caused an error.
Below are three example responses; an incomplete job's response, a complete job's response that succeeded in importing, and a complete job's response that failed to import.
Status: 200
Successful operation
{
"failed": 0,
"progress": 100,
"result": {
"action_invite": "Sent invitations",
"failed": [],
"success": [
{
"ActivationDate": "2021-11-05",
"ActivationDateUTC": "2021-11-05T19:00:00+00:00",
"Building": "Hudson",
"DeactivationDate": null,
"DeactivationDateUTC": null,
"Email": "cwilson@email.com",
"FirstName": "Christopher",
"Floor": "1",
"LastName": "Wilson",
"Mobile": null,
"Phone": "543-678-9666",
"Result": "Sent",
"ServiceAreaNumber": "RE-833-87",
"Status": [
"current",
"pending"
],
"UUID": "94adae3b-9eb8-4f1a-a64c-9065caba22c8",
"Unit": "105"
},
{
"Access End": "2022-12-05T11:00:00",
"Access Start": "2021-12-04T11:00:00",
"ActivationDateUTC": "2021-12-04T19:00:00.000Z",
"Building": "Hudson",
"DeactivationDateUTC": "2022-12-05T19:00:00.000Z",
"Email": "astark@email.com",
"FirstName": "Anthony",
"Floor": "2",
"Mobile": null,
"LastName": "Stark",
"Phone": "543-678-9013",
"Result": "Sent",
"ServiceAreaNumber": "RE-833-87",
"Status": [
"current",
"pending"
],
"UUID": "711c131b-4862-43fd-9008-04125597e26a",
"Unit": "201"
},
{
"Access End": "",
"Access Start": "2021-11-08T21:19:18",
"ActivationDateUTC": "2021-10-01T19:00:00.000Z",
"Building": "Hudson",
"DeactivationDateUTC": "",
"Email": "srodgers@email.com",
"FirstName": "Steve",
"Floor": "2",
"LastName": "Rodgers",
"Phone": "543-678-9014",
"Result": "Sent",
"ServiceAreaNumber": "RE-833-87",
"Status": [
"current",
"pending"
],
"UUID": "bf22914a-2bb6-401a-b0a9-016ad6ccac98",
"Unit": "209"
},
{
"Access End": "2023-01-01T11:00:00",
"Access Start": "2022-01-01T11:00:00",
"ActivationDateUTC": "2022-01-01T19:00:00.000Z",
"Building": "Hudson",
"DeactivationDateUTC": "2023-01-01T19:00:00.000Z",
"Email": "hpym@email.com",
"FirstName": "Hank",
"Floor": "3",
"LastName": "Pym",
"PhoneNumber": "543-678-9015",
"Result": "Sent",
"ServiceAreaNumber": "RE-833-87",
"Status": [
"current",
"pending"
],
"UUID": "eb196140-d804-461a-9b40-b978df6fdc2e",
"Unit": "303"
}
]
},
"status": "finished",
"success": 4,
"total": 4
}
Each success or failed resident in the result
array contains the result
field which describes the action taken indicating its success or failure.
Related Links
- Resident Management API - Overview
- Resident Management API - Access and Permissions
- Resident Management API - Postman Collection
Comments
0 comments
Please sign in to leave a comment.