Intellimter Canada Inc. Official REST API (Beta)

Overview

Welcome to the Intellimeter Canada Inc. Official REST API!

This API allows you programmatic access to all your data, and billing information so you can seamlessly integrate our system into yours.

If you encounter any issues using our API, please see the Help and Support section.

Authentication

OAuth 2.0

This API uses the Open Authentication 2.0 protocol for authorization. To learn more about OAuth2.0, please see the Official OAuth 2.0 Website.

In order to acquire the Client ID and Client Secret codes, which are required to authenticate, please create a new application in the Application section of your Intellimter Cloud Portal.

Client Credentials

This flow of the API allows you to access your own data from our API. You will only be able to access scopes you have enabled your application access to, and you will only have access to admin scopes if the user you are authenticating is an admin.

Request

This can be achieved by sending a POST request to http://134.122.43.196:5000/api/v1/auth along with the following request JSON:

Name Type Description
grant_type string Must be client_credentials
client_id string The Client ID given to you when you created your application
client_secret string The Client Secret given to you when you created your application
scope string A space separated list of scopes you wish to access. For a full list, please see the Scopes section
curl --location --request POST 'http://134.122.43.196:5000/api/v1/auth' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "client_id": "[client_id]", "client_secret": "[client_secret]", "grant_type": "client_credentials", "scope": "[requested_scope]" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/auth"

payload = json.dumps({
    "client_id": "[client_id]",
    "client_secret": "[client_secret]",
    "grant_type": "client_credentials",
    "scope": "[requested_scope]"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("POST", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "client_id": "[client_id]",
    "client_secret": "[client_secret]",
    "grant_type": "client_credentials",
    "scope": "[requested_scope]"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("POST", "http://134.122.43.196:5000/api/v1/auth"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"client_id\": \"[client_id]\",\r\n    \"client_secret\": \"[client_secret]\",\r\n    \"grant_type\": \"client_credentials\",\r\n    \"scope\": \"[requested_scope]\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/auth") .method("POST", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/auth");
client.Timeout = -1;

var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"client_id\": \"[client_id]\",\r\n    \"client_secret\": \"[client_secret]\",\r\n    \"grant_type\": \"client_credentials\",\r\n    \"scope\": \"[requested_scope]\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);

Response

Name Type Description
access_token string The token to use in subsequent requests which require authorization
expires_in time The time until the token expires in the format HH:MM:SS - This will almost always be 1:00:00 (1 hour)
refresh_token string The token to use to refresh the access token when it expires. See the Refresh Token for more information
scope string The scopes you have been authenticated to use. This may not match the scopes you have requested due to application configuration, and admin status of your account
token_type string Will always be bearer
{
    "access_token": "[access_token]",
    "expires_in": "1:00:00",
    "refresh_token": "[refresh_token]",
    "scope": "[approved_scopes]",
    "token_type": "bearer"
}

Refresh Token

When your access token expires (regardless of the flow used to acquire the token), this flow grants you a new token which you may continue using. Once your old token expires, it will become invalid and no longer useful, which is an additional security feature of the API.

Request

This can be achieved by sending a POST request to http://134.122.43.196:5000/api/v1/auth along with the following request JSON:

Name Type Description
grant_type string Must be refresh_token
access_token string The access token you wish to refresh
refresh_token string The refresh token which was issued to you when you when you were issued your access token
curl --location --request POST 'http://134.122.43.196:5000/api/v1/auth' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "access_token": "[access token]", "grant_type": "refresh_token", "refresh_token": "[refresh token]" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/auth"

payload = json.dumps({
    "access_token": "[access token]",
    "grant_type": "refresh_token",
    "refresh_token": "[refresh token]"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("POST", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "access_token": "[access token]",
    "grant_type": "refresh_token",
    "refresh_token": "[refresh token]"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("POST", "http://134.122.43.196:5000/api/v1/auth"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"access_token\": \"[access token]\",\r\n    \"grant_type\": \"refresh_token\",\r\n    \"refresh_token\": \"[refresh token]\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/auth") .method("POST", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/auth");
client.Timeout = -1;

var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"access_token\": \"[access token]\",\r\n    \"grant_type\": \"refresh_token\",\r\n    \"refresh_token\": \"[refresh token]\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);

Response

Name Type Description
access_token string The new token to use in subsequent requests which require authorization
expires_in time The time until the token expires in the format HH:MM:SS - This will almost always be 1:00:00 (1 hour)
refresh_token string The token to use to refresh your new access token when it expires
token_type string Will always be bearer
{
    "access_token": "[access_token]",
    "expires_in": "1:00:00",
    "refresh_token": "[refresh_token]",
    "token_type": "bearer"
}

Authorization Code

This flow of the API allows you to access data from another user's account if they grant you access. This flow will only work on a website, or any application which runs in the web browser. You will only be able to access scopes you have enabled your application access to, and you will only have access to admin scopes if the user you are authenticating is an admin.

To begin, start by redirecting the user to the URL http://134.122.43.196:5000/api/v1/auth/authorization with the following query parameters

Name Type Description
client_id string The Client ID given to you when you created your application
redirect_uri string The URL the user should be redirected to after they allow access to their account. This should be an endpoint on your web application. The user will be redirected with important information in the request parameters which will be needed to complete the request. Do not forget to URL Encode this first!
response_type string Must be code

The user will then be presented with a screen where they can view each of the requested scopes, and can accept or deny the request. If they have already accepted, they will immediately be redirected to the redirect_uri URL.

The user will be redirected with the following query parameter.

Name Type Description
code string The authorization code which will be used to complete the request

Request

From here, send a POST request to http://134.122.43.196:5000/api/v1/auth along with the following request JSON to complete the validation (the access code is useless without this step):

Name Type Description
grant_type string Must be authorization_code
client_id string The Client ID given to you when you created your application
client_secret string The Client Secret given to you when you created your application
code string The code received in the previous step when the user was redirected back to your application
curl --location --request POST 'http://134.122.43.196:5000/api/v1/auth' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "client_id": "[client id]", "client_secret": "[client secret]", "code": "[code]", "grant_type": "authorization_code" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/auth"

payload = json.dumps({
    "client_id": "[client id]",
    "client_secret": "[client secret]",
    "code": "[code]",
    "grant_type": "authorization_code"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("POST", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "client_id": "[client id]",
    "client_secret": "[client secret]",
    "code": "[code]",
    "grant_type": "authorization_code"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("POST", "http://134.122.43.196:5000/api/v1/auth"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"client_id\": \"[client id]\",\r\n    \"client_secret\": \"[client secret]\",\r\n    \"code\": \"[code]\",\r\n    \"grant_type\": \"authorization_code\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/auth") .method("POST", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/auth");
client.Timeout = -1;

var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"client_id\": \"[client id]\",\r\n    \"client_secret\": \"[client secret]\",\r\n    \"code\": \"[code]\",\r\n    \"grant_type\": \"authorization_code\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);

Response

Name Type Description
access_token string The token to use in subsequent requests which require authorization
expires_in time The time until the token expires in the format HH:MM:SS - This will almost always be 1:00:00 (1 hour)
refresh_token string The token to use to refresh the access token when it expires. See the Refresh Token for more information
scope string The scopes you have been authenticated to use. This may not match the scopes you have requested due to application configuration, and admin status of your account
token_type string Will always be bearer
{
    "access_token": "[access_token]",
    "expires_in": "1:00:00",
    "refresh_token": "[refresh_token]",
    "scope": "[approved_scopes]",
    "token_type": "bearer"
}

Device Code

This flow of the API allows you to access data from another user's account if they grant you access. This flow will work applications not in a browser. This flow can even work on devices without a screen! You will only be able to access scopes you have enabled your application access to, and you will only have access to admin scopes if the user you are authenticating is an admin.

Request

To begin, send a POST request to http://134.122.43.196:5000/api/v1/auth along with the following request JSON:

Name Type Description
grant_type string Must be device_code
client_id string The Client ID given to you when you created your application
client_secret string The Client Secret given to you when you created your application
curl --location --request POST 'http://134.122.43.196:5000/api/v1/auth' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "client_id": "[client id]", "client_secret": "[client secret]", "grant_type": "device_code" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/auth"

payload = json.dumps({
    "client_id": "[client id]",
    "client_secret": "[client secret]",
    "grant_type": "device_code"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("POST", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "client_id": "[client id]",
    "client_secret": "[client secret]",
    "grant_type": "device_code"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("POST", "http://134.122.43.196:5000/api/v1/auth"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"client_id\": \"[client id]\",\r\n    \"client_secret\": \"[client secret]\",\r\n    \"grant_type\": \"device_code\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/auth") .method("POST", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/auth");
client.Timeout = -1;

var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"client_id\": \"[client id]\",\r\n    \"client_secret\": \"[client secret]\",\r\n    \"grant_type\": \"device_code\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);

Response

Name Type Description
device_code string This is the code you will use to poll the API to check the status of the authorization process
user_code string The code which the user should enter when they visit verification_uri
verification_uri string The URL to instruct the user to visit
interval time The interval at which you may poll this endpoint. This will be in the format HH:MM:SS - This will almost always be 0:00:05 (5 Seconds)
expires_in time The amount of time until the code expires, at which point, you will need to start from the beginning. This will be in the format HH:MM:SS - This will almost always be 0:10:00 (10 Minutes)
{
    "device_code": "[device code]",
    "expires_in": "0:10:00",
    "interval": "0:00:05",
    "user_code": "[user code]",
    "verification_uri": "[verification uri]"
}

If you can, and you wish to help the user out, you can always open a browser window (if, for example, you are on a mobile or desktop application) to the verification_uri with a single query parameter of user_code which has a value of the user code. It will save the user needing to enter the URL and code themselves which will make for a better overall experience.

Request

At this point, polling may begin! Simply send a POST request to http://134.122.43.196:5000/api/v1/auth along with the following request JSON at a rate no faster than interval:

Name Type Description
grant_type string Must be device_code
device_code string The device code issued to you in the previous step
client_id string The Client ID given to you when you created your application
client_secret string The Client Secret given to you when you created your application
curl --location --request POST 'http://134.122.43.196:5000/api/v1/auth' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "client_id": "[client id]", "client_secret": "[client secret]", "device_code": "[device_code]", "grant_type": "device_code" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/auth"

payload = json.dumps({
    "client_id": "[client id]",
    "client_secret": "[client secret]",
    "device_code": "[device_code]",
    "grant_type": "device_code"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("POST", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "client_id": "[client id]",
    "client_secret": "[client secret]",
    "device_code": "[device_code]",
    "grant_type": "device_code"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("POST", "http://134.122.43.196:5000/api/v1/auth"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"client_id\": \"[client id]\",\r\n    \"client_secret\": \"[client secret]\",\r\n    \"device_code\": \"[device_code]\",\r\n    \"grant_type\": \"device_code\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/auth") .method("POST", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/auth");
client.Timeout = -1;

var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"client_id\": \"[client id]\",\r\n    \"client_secret\": \"[client secret]\",\r\n    \"device_code\": \"[device_code]\",\r\n    \"grant_type\": \"device_code\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);

Responses

When polling this endpoint, there are 5 possible responses you could receive. Each are listed below with an explanation.

If the user has authorized the request, you will receive the following response

Name Type Description
access_token string The token to use in subsequent requests which require authorization
expires_in time The time until the token expires in the format HH:MM:SS - This will almost always be 1:00:00 (1 hour)
refresh_token string The token to use to refresh the access token when it expires. See the Refresh Token for more information
scope string The scopes you have been authenticated to use. This may not match the scopes you have requested due to application configuration, and admin status of your account
token_type string Will always be bearer
{
    "access_token": "[access_token]",
    "expires_in": "1:00:00",
    "refresh_token": "[refresh_token]",
    "scope": "[approved_scopes]",
    "token_type": "bearer"
}

If the user has denied the request, you will receive the following response

{
    "error": "access_denied",
    "error_description": "The client has rejected the request. Stop polling."
}
The response will also come with an HTTP status code of 400 - Bad Request

If the user has neither denied or accepted the request yet, you will receive the following response

{
    "error": "authorization_pending",
    "error_description": "The client has neither accepted nor rejected the request. Keep polling."
}
The response will also come with an HTTP status code of 400 - Bad Request

If the token has expired, you will receive the following response

{
    "error": "expired_token",
    "error_description": "The device code you have requested either does not exist, or is expired."
}
The response will also come with an HTTP status code of 400 - Bad Request

Finally, if you have surpassed the specified rate limit (sent requests more frequently than interval), you will receive the following response

{
    "error": "slow_down",
    "error_description": "DESC"
}
The response will also come with an HTTP status code of 400 - Bad Request

Scopes

When authenticating, you are required to provide the scopes you would like to access. Scopes should be formatted in a space separated string. The asterisks (*) can be used as a wildcard to select many scopes with one query.

For example, to access the scope to read account information (uac:user:read), and update account information (uac:user:update), the following string could be used as the scope string:

"uac:user:read uac:user:update"

Alternatively, you could use the following string to authenticate all operations of the signed in user

"uac:user:*"

In lieu of that, you could use the following string to authenticate all operations of any user

"uac:*:*"

Finally, you could use the following string to authenticate all operations

"*:*:*"

Some of these scopes require admin privledges to access. In the event the user is not an admin, the admin scopes will simply be omitted from the list.

List of Scopes

The following is a list of all scopes, if they are for admin users only, and a brief description of what it does (the same description the user will see when choosing to authenticate in the Authorization or Device Code flows

Scope Admin Description
auth:app:create No Create API applications
auth:app:delete No Delete API applications
auth:app:read No View API applications
auth:app:update No Update API applications
billing:constant:read No View billing constants
billing:constant:update No Update billing constants
billing:fee:delete No Delete billing fees
billing:fee:read No View billing fees
billing:fee:update No Update billing fees
billing:fee:write No Create a new billing fee
billing:invoice:generate No Generate past invoices
billing:invoice:read No View generated invoice history
billing:invoice:update No Mark invoices as paid
billing:invoice:view No Read generated invoice file
billing:service:create No Create billing services
billing:service:delete No Delete billing services
billing:service:read No View billing services
billing:service:update No Update billing services
billing:suite:create No Create a new suite
billing:suite:delete No Delete a suite
billing:suite:read No View property suites
billing:suite:update No Update a suite
billing:template:update No Update your invoice template
billing:tenant-suite:create No Create a tenant suite binding
billing:tenant-suite:delete No Delete a tenant suite binding
billing:tenant-suite:read No View tenant suite bindings
billing:tenant:create No Create a new tenant
billing:tenant:delete No Delete a tenant
billing:tenant:read No View tenants
billing:tenant:update No Update a tenant
company:info:read No View company info
company:info:update Yes Update company info
company:permission:read No View company permissions
file:ftps:disable Yes Disable FTPS file upload
file:ftps:read Yes View FTPS file upload settings
file:ftps:write Yes Update FTPS file upload settings
file:http:disable Yes Disable HTTP file upload
file:http:read Yes View HTTP file upload settings
file:http:write Yes Update HTTP file upload settings
meter:meters:read No View meter info
meter:meters:update Yes Update meter information
meter:reads:read No View meter reads
property:info:read No View property info
property:info:update Yes Update property information
report:general:count No View the overall counts of the entire company
report:reading:daily No View the Daily Grand Total Consumption report
report:reading:interval No View reports of data at the specified interval
report:reading:period No View the Period Consumption report
report:reading:single No View the Single Grand Total Consumption report
report:schedule:create No Create a new scheduled report
report:schedule:delete No Delete a scheduled report
report:schedule:generate No Run scheduled reports
report:schedule:read No View list of scheduled reports
report:schedule:update No Update a scheduled report
uac:user:read No Read account information
uac:user:update No Update account information
uac:users:create Yes Create new users
uac:users:delete Yes Delete any user
uac:users:read Yes View all users
uac:users:update Yes Update any user

Endpoints

These are general purpose endpoints which allow you to manage data about your Intellimter account.

Read

This endpoint allows you to retrieve your meter reads. It can be accessed at http://134.122.43.196:5000/api/v1/read

GET (meter:reads:read)

Retrieves your most recent reads

Request
URL Parameters:
Name Type Description
by string The entity to group your meter reads by. Can be suite, property, or meter
limit_quantity int The filter for the start time of the data. This is used with the limit_unit property to create the filter. Default is 0 (AKA only include the most recent reads)
limit_unit string The unit of measure to go back for filtering the data. Can be Second, Minute, Hour, Day, or Week. Default is Hour.
property string An optional filter to only retrieve reads from this property
Response
Note that not all of these parameters are included in each response type. See the response data for the data included in each request.
Name Type Description
suite string The ID of the suite
suite_name string The name of the suite
time_stamping datetime The time and date when the read was taken in the format YYYY-MM-DDTHH:MM:SS
address string The address where the property is located
display_name string The display name of the property
job_name string The Intellimeter Canada Inc. job name
job_number string The Intellimeter Canada Inc. job number
property string The ID of the property the read belongs to
floor string The floor the meter is located on
meter string The ID of the meter which captured the read
name string The name of the meter which captured the read
panel string The panel the meter is located
serial_number string The serial number of the meter which captured the read
units string The unit of measure associated with the meter. Can be kwh (electricity), or m3 (water/gas)
utility string The utility which the meter measures. Can be E (electricity), W (water), or G (gas)
Note that the metering points which are returned may vary depending on your unique building setup
Suite Request:
curl --location --request GET 'http://134.122.43.196:5000/api/v1/read?by=suite' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/read?by=suite"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/read?by=suite");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/read?by=suite")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/read?by=suite");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
{
    "[property id]": [
        {
            "kwh": 1258.265,
            "kwh_interval": 0.5,
            "suite": "8b70ac80",
            "suite_name": "Test Suite",
            "time_stamping": "2021-04-09T10:20:00"
        }
    ]
}
Property Request:
curl --location --request GET 'http://134.122.43.196:5000/api/v1/read?by=property' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/read?by=property"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/read?by=property");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/read?by=property")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/read?by=property");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
[
    {
        "address": "123 Main St.",
        "display_name": "My Property",
        "job_name": "My Job",
        "job_number": "12-345-6789",
        "kwh": 3269.391,
        "kwh_interval": 0.02,
        "property": "8b70ac80",
        "time_stamping": "2021-04-09T07:20:00"
    }
]
Meter Request:
curl --location --request GET 'http://134.122.43.196:5000/api/v1/read?by=meter' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/read?by=meter"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/read?by=meter");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/read?by=meter")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/read?by=meter");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
{
    "[property id]": [
        {
            "floor": null,
            "kwh": 24263.301,
            "kwh_interval": 0.005,
            "meter": "5754eba3",
            "name": "My Suite 1 Electricity",
            "panel": null,
            "serial_number": "12-345-6789-S5301-1-Meter-01",
            "suite": "2fbac398",
            "time_stamping": "2021-04-09T10:20:00",
            "units": "kWh",
            "utility": "E"
        }
    ]
}

Meter

This endpoint allows the viewing and management of the meters installed on a property. It can be accessed at http://134.122.43.196:5000/api/v1/meter

GET (meter:meters:read)

Returns the list of meters available at the specified property

Request
URL Parameters:
Name Type Description
property string The ID of the property to retrieve the data of
curl --location --request GET 'http://134.122.43.196:5000/api/v1/meter?property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/meter?property=8b70ac80"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/meter?property=8b70ac80");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/meter?property=8b70ac80")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/meter?property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
floor string The floor the meter is located on
id string The ID of the meter
name string The name of the meter
panel string The panel where the meter is located
property string The ID of the property where the meter is located
serial_number string The meter's serial number
suite string The ID of the suite the meter is located in
suite_name string The name of the suite the meter is located in
units string The unit of measure associated with the meter. Can be kwh (electricity), or m3 (water/gas)
utility string The utility which the meter measures. Can be E (electricity), W (water), or G (gas)
[
    {
        "floor": null,
        "id": "2fbac398",
        "name": "My Suite 1 Electricity",
        "panel": null,
        "property": "8b70ac80",
        "serial_number": "12-345-6789-S5301-1-Meter-01",
        "suite": "8b70ac80",
        "suite_name": "Test Suite",
        "units": "kwh",
        "utility": "E"
    }
]

PUT (meter:meters:update)

Updates information about your meters

Request
URL Parameters:
Name Type Description
property string The ID of the property of the meter to update
id string The ID of the meter to update
Request JSON:
Name Type Description
panel string The panel where the meter is located
suite string The ID of the suite the meter is located in
floor string The floor the meter is located on
curl --location --request PUT 'http://134.122.43.196:5000/api/v1/meter?id=2fbac398&property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "floor": "3", "panel": "5", "suite": "8b70ac80" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/meter?id=2fbac398&property=8b70ac80"

payload = json.dumps({
    "floor": "3",
    "panel": "5",
    "suite": "8b70ac80"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("PUT", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "floor": "3",
    "panel": "5",
    "suite": "8b70ac80"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("PUT", "http://134.122.43.196:5000/api/v1/meter?id=2fbac398&property=8b70ac80"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"floor\": \"3\",\r\n    \"panel\": \"5\",\r\n    \"suite\": \"8b70ac80\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/meter?id=2fbac398&property=8b70ac80") .method("PUT", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/meter?id=2fbac398&property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.PUT);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"floor\": \"3\",\r\n    \"panel\": \"5\",\r\n    \"suite\": \"8b70ac80\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
Name Type Description
floor string The floor the meter is located on
id string The ID of the meter
name string The name of the meter
panel string The panel where the meter is located
property string The ID of the property where the meter is located
serial_number string The meter's serial number
suite string The ID of the suite the meter is located in
suite_name string The name of the suite the meter is located in
units string The unit of measure associated with the meter. Can be kwh (electricity), or m3 (water/gas)
utility string The utility which the meter measures. Can be E (electricity), W (water), or G (gas)
[
    {
        "floor": null,
        "id": "2fbac398",
        "name": "My Suite 1 Electricity",
        "panel": null,
        "property": "8b70ac80",
        "serial_number": "12-345-6789-S5301-1-Meter-01",
        "suite": "8b70ac80",
        "suite_name": "Test Suite",
        "units": "kwh",
        "utility": "E"
    }
]

Property

This endpoint allows the viewing and management of your properties. It can be accessed at http://134.122.43.196:5000/api/v1/property

GET (property:info:read)

Returns information about a single property, or all properties

Request
URL Parameters:
Name Type Description
property string The ID of the property of the meter to retrieve. Default is to return all properties
curl --location --request GET 'http://134.122.43.196:5000/api/v1/property' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/property"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/property");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/property")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/property");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
address string The address of the property
company string The ID of the company the property belongs to
created datetime The date and time the property was created
display_name string The display name of the property
id string The ID of the property
job_name string The job name of the property
job_number string The job number of the property
updated datetime The date and time the property was last updated
[
    {
        "address": "123 Main St.",
        "company": "8b70ac80",
        "created": "2021-03-29T17:15:15",
        "display_name": "My Property",
        "id": "8b70ac80",
        "job_name": "Example Job",
        "job_number": "12-345-6789",
        "updated": "2021-04-09T10:44:43"
    }
]

PUT (property:info:update)

Updates information about a single property

Request
URL Parameters:
Name Type Description
property string The ID of the property of the meter to update.
Request JSON:
Name Type Description
job_name string The name of the Intellimeter Inc. job
address string The address the property is located
display_name string The display name of the property
curl --location --request PUT 'http://134.122.43.196:5000/api/v1/property?property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "address": "New Address", "display_name": "New Display Name", "job_name": "New Name" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/property?property=8b70ac80"

payload = json.dumps({
    "address": "New Address",
    "display_name": "New Display Name",
    "job_name": "New Name"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("PUT", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "address": "New Address",
    "display_name": "New Display Name",
    "job_name": "New Name"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("PUT", "http://134.122.43.196:5000/api/v1/property?property=8b70ac80"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"address\": \"New Address\",\r\n    \"display_name\": \"New Display Name\",\r\n    \"job_name\": \"New Name\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/property?property=8b70ac80") .method("PUT", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/property?property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.PUT);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"address\": \"New Address\",\r\n    \"display_name\": \"New Display Name\",\r\n    \"job_name\": \"New Name\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
Name Type Description
address string The address of the property
company string The ID of the company the property belongs to
created datetime The date and time the property was created
display_name string The display name of the property
id string The ID of the property
job_name string The job name of the property
job_number string The job number of the property
updated datetime The date and time the property was last updated
{
    "address": "123 Main St.",
    "company": "8b70ac80",
    "created": "2021-03-29T17:15:15",
    "display_name": "My Property",
    "id": "8b70ac80",
    "job_name": "Example Job",
    "job_number": "12-345-6789",
    "updated": "2021-04-09T10:44:43"
}

Company

This endpoint allows you to view and update information about the company. It can be accessed at http://134.122.43.196:5000/api/v1/company

GET (company:info:read)

Returns information about your company

Request
curl --location --request GET 'http://134.122.43.196:5000/api/v1/company' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/company"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/company");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/company")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/company");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
created datetime The date and time the company was created
id datetime The ID of the company
name string The name of the company
updated datetime The date and time the company was updated
{
    "created": "2021-03-29T17:13:19",
    "id": "8b70ac80",
    "name": "Company Name",
    "updated": "2021-04-14T11:19:42"
}

PUT (company:info:update)

Returns information about your company

Request
Request JSON:
Name Type Description
name string The new name of the company
curl --location --request PUT 'http://134.122.43.196:5000/api/v1/company' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "name": "New Name" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/company"

payload = json.dumps({
    "name": "New Name"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("PUT", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "name": "New Name"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("PUT", "http://134.122.43.196:5000/api/v1/company"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"name\": \"New Name\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/company") .method("PUT", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/company");
client.Timeout = -1;

var request = new RestRequest(Method.PUT);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"name\": \"New Name\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
HTTP: 204 - No Content

OAuth2.0 Application

This endpoint allows you to manage your OAuth2.0 applications. It can be accessed at http://134.122.43.196:5000/api/v1/application

GET (auth:app:read)

Returns information about a single application, or all applications

Request
URL Parameters:
Name Type Description
id string The ID of the application to retrieve. Default is to return all of your applications
curl --location --request GET 'http://134.122.43.196:5000/api/v1/application?id=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/application?id=8b70ac80"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/application?id=8b70ac80");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/application?id=8b70ac80")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/application?id=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
client_id string The Client ID you use to authenticate requests.
(Client Secret is never returned)
created datetime The date and time the application was created
id string The ID of the application
name string The name of the application
updated datetime The date and time the application was last updated
user string Your account ID
[
    {
        "client_id": "id",
        "created": "2021-04-08T12:00:17",
        "id": "8b70ac80",
        "name": "My Application",
        "updated": "2021-04-08T12:00:17",
        "user": "8b70ac80"
    }
]

POST (auth:app:create)

Creates a new application

Request
Request JSON:
Name Type Description
name string The name of the new application
scopes string A space separated list of scopes you would like to access
curl --location --request POST 'http://134.122.43.196:5000/api/v1/application' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "name": "My New App", "scopes": "uac:user:* uac:users:*" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/application"

payload = json.dumps({
    "name": "My New App",
    "scopes": "uac:user:* uac:users:*"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("POST", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "name": "My New App",
    "scopes": "uac:user:* uac:users:*"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("POST", "http://134.122.43.196:5000/api/v1/application"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"name\": \"My New App\",\r\n    \"scopes\": \"uac:user:* uac:users:*\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/application") .method("POST", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/application");
client.Timeout = -1;

var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"name\": \"My New App\",\r\n    \"scopes\": \"uac:user:* uac:users:*\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
Name Type Description
client_id string The Client ID you use to authenticate requests
client_secret string The Client Secret you use to authenticate requests. Note that this is the only time you will be shown the Client Secret
created datetime The date and time the application was created
id string The ID of the application
name string The name of the application
updated datetime The date and time the application was last updated
user string Your account ID
{
    "client_id": "[client id]",
    "client_secret": "[client secret]",
    "created": "2021-04-14T11:39:38",
    "id": "1088852e",
    "name": "My New App",
    "scopes": "uac:user:read uac:user:update uac:users:create uac:users:delete uac:users:read uac:users:update",
    "updated": "2021-04-14T11:39:38",
    "user": "8b70ac80"
}

PUT (auth:app:update)

Updates an existing application

Request
URL Parameters:
Name Type Description
id string The ID of the application to update
Request JSON:
Name Type Description
name string The name of the new application
scopes string A space separated list of scopes you would like to access
client_secret boolean If set to true, the Client Secret will be regenerated and returned. This will cause the old Client Secret to no longer be valid. Default is false
curl --location --request PUT 'http://134.122.43.196:5000/api/v1/application?id=1088852e' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "name": "My New App", "scopes": "uac:user:* uac:users:*" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/application?id=1088852e"

payload = json.dumps({
    "name": "My New App",
    "scopes": "uac:user:* uac:users:*"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("PUT", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "name": "My New App",
    "scopes": "uac:user:* uac:users:*"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("PUT", "http://134.122.43.196:5000/api/v1/application?id=1088852e"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"name\": \"My New App\",\r\n    \"scopes\": \"uac:user:* uac:users:*\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/application?id=1088852e") .method("PUT", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/application?id=1088852e");
client.Timeout = -1;

var request = new RestRequest(Method.PUT);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"name\": \"My New App\",\r\n    \"scopes\": \"uac:user:* uac:users:*\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
Name Type Description
client_id string The Client ID you use to authenticate requests
client_secret string The Client Secret you use to authenticate requests. Note that this is the only time you will be shown the Client Secret
created datetime The date and time the application was created
id string The ID of the application
name string The name of the application
updated datetime The date and time the application was last updated
user string Your account ID
{
    "client_id": "[client id]",
    "client_secret": "[client secret]",
    "created": "2021-04-14T11:39:38",
    "id": "1088852e",
    "name": "My New App",
    "scopes": "uac:user:read uac:user:update uac:users:create uac:users:delete uac:users:read uac:users:update",
    "updated": "2021-04-14T11:39:38",
    "user": "8b70ac80"
}

DELETE (auth:app:delete)

Deletes an existing application

Request
URL Parameters:
Name Type Description
id string The ID of the application to update
curl --location --request DELETE 'http://134.122.43.196:5000/api/v1/application?id=1088852e' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/application?id=1088852e"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("DELETE", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("DELETE", "http://134.122.43.196:5000/api/v1/application?id=1088852e");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/application?id=1088852e")
.method("DELETE", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/application?id=1088852e");
client.Timeout = -1;

var request = new RestRequest(Method.DELETE);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
HTTP: 204 - No Content

My Account Management

This endpoint allows you to view and update information about your account. It can be accessed at http://134.122.43.196:5000/api/v1/user

GET (uac:user:read)

Returns account information of the authenticated user

Request
curl --location --request GET 'http://134.122.43.196:5000/api/v1/user' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/user"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/user");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/user")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/user");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
active boolean If the user may log into their account
admin boolean If the user has admin rights
company string The ID of the company the user is tied to
created datetime The date and time the user was created
email string The user's email address
first_name string The first name of the user
id string The user's ID
last_name string The last name of the user
{
    "active": true,
    "admin": true,
    "company": "8b70ac80",
    "created": "2021-04-08T11:22:07",
    "email": "test",
    "first_name": "John",
    "id": "8b70ac80",
    "last_name": "Smith",
    "updated": "2021-04-08T15:56:43"
}

PUT (uac:user:update)

Updates the authenticated user's account information

Request
Request JSON:
Name Type Description
first_name string The new first name of the user
last_name string The new last name of the user
email string The email address of the user
password string The new password of the user. If omitted, the password will not be updated
curl --location --request PUT 'http://134.122.43.196:5000/api/v1/user' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "email": "JaneDoe@example.com", "first_name": "Jane", "last_name": "Doe" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/user"

payload = json.dumps({
    "email": "JaneDoe@example.com",
    "first_name": "Jane",
    "last_name": "Doe"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("PUT", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "email": "JaneDoe@example.com",
    "first_name": "Jane",
    "last_name": "Doe"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("PUT", "http://134.122.43.196:5000/api/v1/user"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"email\": \"JaneDoe@example.com\",\r\n    \"first_name\": \"Jane\",\r\n    \"last_name\": \"Doe\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/user") .method("PUT", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/user");
client.Timeout = -1;

var request = new RestRequest(Method.PUT);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"email\": \"JaneDoe@example.com\",\r\n    \"first_name\": \"Jane\",\r\n    \"last_name\": \"Doe\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
Name Type Description
active boolean If the user may log into their account
admin boolean If the user has admin rights
company string The ID of the company the user is tied to
created datetime The date and time the user was created
email string The user's email address
first_name string The first name of the user
id string The user's ID
last_name string The last name of the user
{
    "active": true,
    "admin": true,
    "company": "8b70ac80",
    "created": "2021-04-08T11:22:07",
    "email": "JohnSmith@example.com",
    "first_name": "John",
    "id": "8b70ac80",
    "last_name": "Smith",
    "updated": "2021-04-08T15:56:43"
}

All Account Management

This endpoint allows you to manage users connected to your company. It can be accessed at http://134.122.43.196:5000/api/v1/users

GET (uac:users:read)

Returns account information of the requested user or all users

Request
URL Parameters:
Name Type Description
user string The ID of the user to retrieve. Default is to return all users
curl --location --request GET 'http://134.122.43.196:5000/api/v1/users?user=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/users?user=8b70ac80"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/users?user=8b70ac80");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/users?user=8b70ac80")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/users?user=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
active boolean If the user may log into their account
admin boolean If the user has admin rights
company string The ID of the company the user is tied to
created datetime The date and time the user was created
email string The user's email address
first_name string The first name of the user
id string The user's ID
last_name string The last name of the user
[
    {
        "active": true,
        "admin": true,
        "company": "8b70ac80",
        "created": "2021-04-08T11:22:07",
        "email": "JohnSmith@example.com",
        "first_name": "John",
        "id": "8b70ac80",
        "last_name": "Smith",
        "updated": "2021-04-08T15:56:43"
    }
]

POST (uac:users:create)

Creates a new user account

Request
Request JSON:
Name Type Description
active boolean If the user may log into their account. Default is true
admin boolean If the user has admin rights. Default is false
password string The password for the newly created account
email string The user's email address
first_name string The first name of the user
last_name string The last name of the user
curl --location --request POST 'http://134.122.43.196:5000/api/v1/users' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "active": true, "admin": false, "email": "JaneDoe@example.com", "first_name": "Jane", "last_name": "Doe", "password": "1234" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/users"

payload = json.dumps({
    "active": True,
    "admin": False,
    "email": "JaneDoe@example.com",
    "first_name": "Jane",
    "last_name": "Doe",
    "password": "1234"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("POST", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "active": true,
    "admin": false,
    "email": "JaneDoe@example.com",
    "first_name": "Jane",
    "last_name": "Doe",
    "password": "1234"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("POST", "http://134.122.43.196:5000/api/v1/users"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"active\": true,\r\n    \"admin\": false,\r\n    \"email\": \"JaneDoe@example.com\",\r\n    \"first_name\": \"Jane\",\r\n    \"last_name\": \"Doe\",\r\n    \"password\": \"1234\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/users") .method("POST", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/users");
client.Timeout = -1;

var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"active\": true,\r\n    \"admin\": false,\r\n    \"email\": \"JaneDoe@example.com\",\r\n    \"first_name\": \"Jane\",\r\n    \"last_name\": \"Doe\",\r\n    \"password\": \"1234\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
Name Type Description
active boolean If the user may log into their account
admin boolean If the user has admin rights
company string The ID of the company the user is tied to
created datetime The date and time the user was created
email string The user's email address
first_name string The first name of the user
id string The user's ID
last_name string The last name of the user
{
    "active": true,
    "admin": false,
    "company": "8b70ac80",
    "created": "2021-04-08T11:22:07",
    "email": "JaneDoe@example.com",
    "first_name": "Jane",
    "id": "8b70ac80",
    "last_name": "Doe",
    "updated": "2021-04-08T15:56:43"
}

PUT (uac:users:update)

Updates the account information of the requested user

Request
URL Parameters:
Name Type Description
user string The ID of the user to update
Request JSON:
Name Type Description
active boolean If the user may log into their account
admin boolean If the user has admin rights
email string The user's email address
first_name string The first name of the user
last_name string The last name of the user
curl --location --request PUT 'http://134.122.43.196:5000/api/v1/users?user=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "active": true, "admin": false, "email": "JaneDoe@example.com", "first_name": "Jane", "last_name": "Doe" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/users?user=8b70ac80"

payload = json.dumps({
    "active": True,
    "admin": False,
    "email": "JaneDoe@example.com",
    "first_name": "Jane",
    "last_name": "Doe"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("PUT", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "active": true,
    "admin": false,
    "email": "JaneDoe@example.com",
    "first_name": "Jane",
    "last_name": "Doe"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("PUT", "http://134.122.43.196:5000/api/v1/users?user=8b70ac80"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"active\": true,\r\n    \"admin\": false,\r\n    \"email\": \"JaneDoe@example.com\",\r\n    \"first_name\": \"Jane\",\r\n    \"last_name\": \"Doe\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/users?user=8b70ac80") .method("PUT", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/users?user=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.PUT);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"active\": true,\r\n    \"admin\": false,\r\n    \"email\": \"JaneDoe@example.com\",\r\n    \"first_name\": \"Jane\",\r\n    \"last_name\": \"Doe\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
Name Type Description
active boolean If the user may log into their account
admin boolean If the user has admin rights
company string The ID of the company the user is tied to
created datetime The date and time the user was created
email string The user's email address
first_name string The first name of the user
id string The user's ID
last_name string The last name of the user
{
    "active": true,
    "admin": false,
    "company": "8b70ac80",
    "created": "2021-04-08T11:22:07",
    "email": "JaneDoe@example.com",
    "first_name": "Jane",
    "id": "8b70ac80",
    "last_name": "Doe",
    "updated": "2021-04-08T15:56:43"
}

DELETE (uac:users:delete)

Deletes the selected user. We recommend setting the active attribute of a user to false instead of deleting.

Request
URL Parameters:
Name Type Description
user string The ID of the user to update
curl --location --request DELETE 'http://134.122.43.196:5000/api/v1/users?user=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/users?user=8b70ac80"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("DELETE", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("DELETE", "http://134.122.43.196:5000/api/v1/users?user=8b70ac80");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/users?user=8b70ac80")
.method("DELETE", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/users?user=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.DELETE);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
active boolean If the user may log into their account
admin boolean If the user has admin rights
company string The ID of the company the user is tied to
created datetime The date and time the user was created
email string The user's email address
first_name string The first name of the user
id string The user's ID
last_name string The last name of the user
{
    "active": true,
    "admin": false,
    "company": "8b70ac80",
    "created": "2021-04-08T11:22:07",
    "email": "JaneDoe@example.com",
    "first_name": "Jane",
    "id": "8b70ac80",
    "last_name": "Doe",
    "updated": "2021-04-08T15:56:43"
}

File Upload (HTTP/HTTPS)

This endpoint retrieves information on the instructions to send your reads to a remote HTTP server after each read is taken. For more information on file formats, please see the File Sender Formats section. It can be accessed at http://134.122.43.196:5000/api/v1/file-upload/http

GET (file:http:read)

Returns the current HTTP file upload settings

Request
URL Parameters:
Name Type Description
property string The ID of the property to retrieve the data of. Leave blank to get data on all properties you have access to
curl --location --request GET 'http://134.122.43.196:5000/api/v1/file-upload/http?property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/file-upload/http?property=8b70ac80"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/file-upload/http?property=8b70ac80");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/file-upload/http?property=8b70ac80")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/file-upload/http?property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
property string The ID of the property the settings apply to
url string The URL to send the HTTP request to
body json Additional JSON which should be included as the request body, or null to omit
header json Additional JSON which should be included as the request headers, or null to omit
method string The HTTP method to use when sending the request. Supported methods are GET, POST, PUT, PATCH, DELETE, HEAD, and OPTIONS
expected_code int The returned HTTP status code expected to indicate a success
file_type string The data format to send the data as. Supported formats are CSV, JSON, and XML
created datetime The datetime HTTP file sending was enabled
updated datetime The datetime HTTP file sending options were updated
[
    {
        "body": {},
        "created": "2021-04-14T09:22:56",
        "expected_code": 200,
        "file_type": "CSV",
        "header": {},
        "method": "POST",
        "property": "8b70ac80",
        "updated": "2021-04-14T09:22:56",
        "url": "test"
    }
]

PUT (file:http:write)

Updates (or enables if previously disabled) the HTTP file upload settings

Request
URL Parameters:
Name Type Description
property string The ID of the property to update
Request JSON:
Name Type Description
url string The URL to send the HTTP request to
body json Additional JSON which should be included as the request body, or null to omit. Default is null.
header json Additional JSON which should be included as the request headers, or null to omit. Default is null.
method string The HTTP method to use when sending the request. Supported methods are GET, POST, PUT, PATCH, DELETE, HEAD, and OPTIONS. Default is POST
expected_code int The returned HTTP status code expected to indicate a success. Default is 200
file_type string The data format to send the data as. Supported formats are CSV, JSON, and XML
curl --location --request PUT 'http://134.122.43.196:5000/api/v1/file-upload/http?property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "file_type": "CSV", "url": "test" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/file-upload/http?property=8b70ac80"

payload = json.dumps({
    "file_type": "CSV",
    "url": "test"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("PUT", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "file_type": "CSV",
    "url": "test"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("PUT", "http://134.122.43.196:5000/api/v1/file-upload/http?property=8b70ac80"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"file_type\": \"CSV\",\r\n    \"url\": \"test\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/file-upload/http?property=8b70ac80") .method("PUT", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/file-upload/http?property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.PUT);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"file_type\": \"CSV\",\r\n    \"url\": \"test\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
HTTP: 204 - No Content

DELETE (file:http:disable)

Disables the HTTP file uploader. Note that previous settings WILL be lost.

Request
URL Parameters:
Name Type Description
property string The ID of the property to disable HTTP file send
curl --location --request DELETE 'http://134.122.43.196:5000/api/v1/file-upload/http?property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/file-upload/http?property=8b70ac80"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("DELETE", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("DELETE", "http://134.122.43.196:5000/api/v1/file-upload/http?property=8b70ac80");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/file-upload/http?property=8b70ac80")
.method("DELETE", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/file-upload/http?property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.DELETE);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
HTTP: 204 - No Content

File Upload (FTPS)

This endpoint retrieves information on the instructions to send your reads to a remote FTPS server after each read is taken (Note that FTP servers are not supported with these settings). For more information on file formats, please see the File Sender Formats section. It can be accessed at http://134.122.43.196:5000/api/v1/file-upload/ftps

GET (file:ftps:read)

Returns the current HTTP file upload settings

Request
URL Parameters:
Name Type Description
property string The ID of the property to retrieve the data of. Leave blank to get data on all properties you have access to
curl --location --request GET 'http://134.122.43.196:5000/api/v1/file-upload/ftp?property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/file-upload/ftp?property=8b70ac80"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/file-upload/ftp?property=8b70ac80");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/file-upload/ftp?property=8b70ac80")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/file-upload/ftp?property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
property string The ID of the property the settings apply to
user string The username to use when authenticating with the server
host string The hostname of the FTPS server
path string The path to upload the file on the FTPS server, or null to use the root directory.
port int The port of the FTPS server. Default is 22.
file_type string The data format to send the data as. Supported formats are CSV, JSON, and XML
created datetime The datetime HTTP file sending was enabled
updated datetime The datetime HTTP file sending options were updated
[
    {
        "created": "2021-04-14T09:46:32",
        "file_type": "CSV",
        "host": "ftps.example.com",
        "path": null,
        "port": 22,
        "property": "8b70ac80",
        "updated": "2021-04-14T09:46:32",
        "user": "username"
    }
]

PUT (file:ftps:write)

Updates (or enables if previously disabled) the FTPS file upload settings

Request
URL Parameters:
Name Type Description
property string The ID of the property to update
Request JSON:
Name Type Description
host string The hostname of the FTPS server
user string The username to use when authenticating with the server
password string The password to use when authenticating with the server
port int The port of the FTPS server. Default is 22.
path string The path to upload the file on the FTPS server, or null to use the root directory.
file_type string The data format to send the data as. Supported formats are CSV, JSON, and XML
curl --location --request PUT 'http://134.122.43.196:5000/api/v1/file-upload/ftps?property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "file_type": "CSV", "host": "everywhere", "password": "1234", "user": "me" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/file-upload/ftps?property=8b70ac80"

payload = json.dumps({
    "file_type": "CSV",
    "host": "everywhere",
    "password": "1234",
    "user": "me"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("PUT", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "file_type": "CSV",
    "host": "everywhere",
    "password": "1234",
    "user": "me"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("PUT", "http://134.122.43.196:5000/api/v1/file-upload/ftps?property=8b70ac80"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"file_type\": \"CSV\",\r\n    \"host\": \"everywhere\",\r\n    \"password\": \"1234\",\r\n    \"user\": \"me\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/file-upload/ftps?property=8b70ac80") .method("PUT", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/file-upload/ftps?property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.PUT);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"file_type\": \"CSV\",\r\n    \"host\": \"everywhere\",\r\n    \"password\": \"1234\",\r\n    \"user\": \"me\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
HTTP: 204 - No Content

DELETE (file:ftps:disable)

Disables the FTPS file uploader. Note that previous settings WILL be lost.

Request
URL Parameters:
Name Type Description
property string The ID of the property to disable FTPS file send
curl --location --request DELETE 'http://134.122.43.196:5000/api/v1/file-upload/ftps?property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/file-upload/ftps?property=8b70ac80"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("DELETE", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("DELETE", "http://134.122.43.196:5000/api/v1/file-upload/ftps?property=8b70ac80");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/file-upload/ftps?property=8b70ac80")
.method("DELETE", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/file-upload/ftps?property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.DELETE);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
HTTP: 204 - No Content

Billing

These are endpoints allow the management and control of data related to invoices

Constants

This endpoint allows you to view and update constants used in bill generation. It can be accessed at http://134.122.43.196:5000/api/v1/billing/constants

GET (billing:constant:read)

Returns the constants used in generating invoices

Request
URL Parameters:
Name Type Description
property string The ID of the property of the constants to retrieve. Default is to return all properties
curl --location --request GET 'http://134.122.43.196:5000/api/v1/constants' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/constants"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/constants");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/constants")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/constants");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
days_to_pay int The number of days the tenant has to pay their bill before it becomes 'Overdue'
invoice_from string The name to include in the signature line of the invoice email
price_per_electricity float The unit rate of electricity in cents
price_per_gas float The unit rate of gas in cents
price_per_water float The unit rate of water in cents
property string The ID of the property this set of constants is tied to
tax_rate float The tax rate (as a percent - ex. 13 = 13%)
updated datetime The date and time these constants were last updated
[
    {
        "days_to_pay": 30,
        "invoice_from": "Intellimeter Canada Inc.",
        "price_per_electricity": 13.0,
        "price_per_gas": 13.0,
        "price_per_water": 13.0,
        "property": "8b70ac80",
        "tax_rate": 13.0,
        "updated": "2021-04-12T11:03:15"
    }
]

PUT (billing:constant:update)

Updates the billing constants tied to a property

Request
URL Parameters:
Name Type Description
property string The ID of the property of the constants to update
Request JSON:
Name Type Description
days_to_pay int The number of days the tenant has to pay their bill before it becomes 'Overdue'
invoice_from string The name to include in the signature line of the invoice email
price_per_electricity float The unit rate of electricity in cents
price_per_gas float The unit rate of gas in cents
price_per_water float The unit rate of water in cents
property string The ID of the property this set of constants is tied to
tax_rate float The tax rate (as a percent - ex. 13 = 13%)
curl --location --request PUT 'http://134.122.43.196:5000/api/v1/constants' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "days_to_pay": 30, "invoice_from": "Intellimeter Canada Inc.", "price_per_electricity": 13.0, "price_per_gas": 13.0, "price_per_water": 13.0, "property": "8b70ac80", "tax_rate": 13.0 }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/constants"

payload = json.dumps({
    "days_to_pay": 30,
    "invoice_from": "Intellimeter Canada Inc.",
    "price_per_electricity": 13.0,
    "price_per_gas": 13.0,
    "price_per_water": 13.0,
    "property": "8b70ac80",
    "tax_rate": 13.0
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("PUT", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "days_to_pay": 30,
    "invoice_from": "Intellimeter Canada Inc.",
    "price_per_electricity": 13.0,
    "price_per_gas": 13.0,
    "price_per_water": 13.0,
    "property": "8b70ac80",
    "tax_rate": 13.0
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("PUT", "http://134.122.43.196:5000/api/v1/constants"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"days_to_pay\": 30,\r\n    \"invoice_from\": \"Intellimeter Canada Inc.\",\r\n    \"price_per_electricity\": 13.0,\r\n    \"price_per_gas\": 13.0,\r\n    \"price_per_water\": 13.0,\r\n    \"property\": \"8b70ac80\",\r\n    \"tax_rate\": 13.0\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/constants") .method("PUT", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/constants");
client.Timeout = -1;

var request = new RestRequest(Method.PUT);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"days_to_pay\": 30,\r\n    \"invoice_from\": \"Intellimeter Canada Inc.\",\r\n    \"price_per_electricity\": 13.0,\r\n    \"price_per_gas\": 13.0,\r\n    \"price_per_water\": 13.0,\r\n    \"property\": \"8b70ac80\",\r\n    \"tax_rate\": 13.0\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
Name Type Description
days_to_pay int The number of days the tenant has to pay their bill before it becomes 'Overdue'
invoice_from string The name to include in the signature line of the invoice email
price_per_electricity float The unit rate of electricity in cents
price_per_gas float The unit rate of gas in cents
price_per_water float The unit rate of water in cents
property string The ID of the property this set of constants is tied to
tax_rate float The tax rate (as a percent - ex. 13 = 13%)
updated datetime The date and time these constants were last updated
{
    "days_to_pay": 30,
    "invoice_from": "Intellimeter Canada Inc.",
    "price_per_electricity": 13.0,
    "price_per_gas": 13.0,
    "price_per_water": 13.0,
    "property": "8b70ac80",
    "tax_rate": 13.0,
    "updated": "2021-04-12T11:03:15"
}

Fee

This endpoint allows you to view and update additional flat fees to add to invoices. It can be accessed at http://134.122.43.196:5000/api/v1/billing/fee

GET (billing:fee:read)

Returns the additional flat-fees included in generated invoices

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
id string The ID the fee to get. This is optional.
curl --location --request GET 'http://134.122.43.196:5000/api/v1/fee?property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/fee?property=8b70ac80"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/fee?property=8b70ac80");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/fee?property=8b70ac80")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/fee?property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
active boolean If the fee should be included in future bills
id string The ID of the fee
name string The name of the fee (displayed on the invoice)
property string The property ID the fee belongs to
value float The value of the fee in dollars
[
    {
        "active": true,
        "id": "7009803c",
        "name": "My New Fee",
        "property": "8b70ac80",
        "value": 10.25
    }
]

POST (billing:fee:write)

Creates a new flat-fee to be included in generated invoices

Request
Request JSON:
Name Type Description
name string The name of the fee (displayed on the invoice)
value float The value of the fee in dollars
active boolean If the fee should be active. Default is true.
curl --location --request POST 'http://134.122.43.196:5000/api/v1/fee' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "active": true, "name": "My New Fee", "value": 10.25 }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/fee"

payload = json.dumps({
    "active": True,
    "name": "My New Fee",
    "value": 10.25
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("POST", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "active": true,
    "name": "My New Fee",
    "value": 10.25
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("POST", "http://134.122.43.196:5000/api/v1/fee"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"active\": true,\r\n    \"name\": \"My New Fee\",\r\n    \"value\": 10.25\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/fee") .method("POST", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/fee");
client.Timeout = -1;

var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"active\": true,\r\n    \"name\": \"My New Fee\",\r\n    \"value\": 10.25\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
Name Type Description
active boolean If the fee should be included in future bills
id string The ID of the fee
name string The name of the fee (displayed on the invoice)
property string The property ID the fee belongs to
value float The value of the fee in dollars
{
    "active": true,
    "id": "7009803c",
    "name": "My New Fee",
    "property": "8b70ac80",
    "value": 10.25
}

POST (billing:fee:write)

Replaces all of your fees with the ones in the JSON payload. If a fee is not included in the payload, it will be deleted. Note that this will cause each fee to be assigned a new ID.

Request
Request JSON:
Name Type Description
name string The name of the fee (displayed on the invoice)
value float The value of the fee in dollars
active boolean If the fee should be active. Default is true.
curl --location --request POST 'http://134.122.43.196:5000/api/v1/feeFlush?property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '[ { "active": true, "name": "My New Fee", "value": 10.25 }, { "active": true, "name": "My New Fee 2", "value": 12.25 } ]'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/feeFlush?property=8b70ac80"

payload = json.dumps([
    {
        "active": True,
        "name": "My New Fee",
        "value": 10.25
    },
    {
        "active": True,
        "name": "My New Fee 2",
        "value": 12.25
    }
])
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("POST", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify([
    {
        "active": true,
        "name": "My New Fee",
        "value": 10.25
    },
    {
        "active": true,
        "name": "My New Fee 2",
        "value": 12.25
    }
]);
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("POST", "http://134.122.43.196:5000/api/v1/feeFlush?property=8b70ac80"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "[\r\n    {\r\n        \"active\": true,\r\n        \"name\": \"My New Fee\",\r\n        \"value\": 10.25\r\n    },\r\n    {\r\n        \"active\": true,\r\n        \"name\": \"My New Fee 2\",\r\n        \"value\": 12.25\r\n    }\r\n]");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/feeFlush?property=8b70ac80") .method("POST", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/feeFlush?property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "[\r\n    {\r\n        \"active\": true,\r\n        \"name\": \"My New Fee\",\r\n        \"value\": 10.25\r\n    },\r\n    {\r\n        \"active\": true,\r\n        \"name\": \"My New Fee 2\",\r\n        \"value\": 12.25\r\n    }\r\n]",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
Name Type Description
active boolean If the fee should be included in future bills
id string The ID of the fee
name string The name of the fee (displayed on the invoice)
property string The property ID the fee belongs to
value float The value of the fee in dollars
[
    {
        "active": true,
        "id": "7009803c",
        "name": "My New Fee",
        "property": "8b70ac80",
        "value": 10.25
    },
    {
        "active": true,
        "id": "8f621a3",
        "name": "My New Fee 2",
        "property": "8b70ac80",
        "value": 12.25
    }
]

PUT (billing:fee:update)

Updates the selected fee

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
id string The ID the fee to update.
Request JSON:
Name Type Description
name string The name of the fee (displayed on the invoice)
value float The value of the fee in dollars
active boolean If the fee should be active. Default is true.
curl --location --request PUT 'http://134.122.43.196:5000/api/v1/fee?property=8b70ac80&id=7009803c' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "active": true, "name": "My New Fee", "value": 10.25 }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/fee?property=8b70ac80&id=7009803c"

payload = json.dumps({
    "active": True,
    "name": "My New Fee",
    "value": 10.25
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("PUT", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "active": true,
    "name": "My New Fee",
    "value": 10.25
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("PUT", "http://134.122.43.196:5000/api/v1/fee?property=8b70ac80&id=7009803c"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"active\": true,\r\n    \"name\": \"My New Fee\",\r\n    \"value\": 10.25\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/fee?property=8b70ac80&id=7009803c") .method("PUT", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/fee?property=8b70ac80&id=7009803c");
client.Timeout = -1;

var request = new RestRequest(Method.PUT);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"active\": true,\r\n    \"name\": \"My New Fee\",\r\n    \"value\": 10.25\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
Name Type Description
active boolean If the fee should be included in future bills
id string The ID of the fee
name string The name of the fee (displayed on the invoice)
property string The property ID the fee belongs to
value float The value of the fee in dollars
{
    "active": true,
    "id": "7009803c",
    "name": "My New Fee",
    "property": "8b70ac80",
    "value": 10.25
}

DELETE (billing:fee:delete)

Deletes the additional flat-fee

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
id string The ID the fee to delete
curl --location --request DELETE 'http://134.122.43.196:5000/api/v1/fee?property=8b70ac80&id=32670e03' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/fee?property=8b70ac80&id=32670e03"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("DELETE", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("DELETE", "http://134.122.43.196:5000/api/v1/fee?property=8b70ac80&id=32670e03");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/fee?property=8b70ac80&id=32670e03")
.method("DELETE", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/fee?property=8b70ac80&id=32670e03");
client.Timeout = -1;

var request = new RestRequest(Method.DELETE);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
active boolean If the fee should be included in future bills
id string The ID of the fee
name string The name of the fee (displayed on the invoice)
property string The property ID the fee belongs to
value float The value of the fee in dollars
{
    "active": true,
    "id": "7009803c",
    "name": "My New Fee",
    "property": "8b70ac80",
    "value": 10.25
}

Invoice

This endpoint allows you to view past invoices. It can be accessed at http://134.122.43.196:5000/api/v1/billing/invoice

GET (billing:invoice:read)

Returns the full history of generated invoices. For custom invoice templates, please contact support.

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
id string The ID the invoice to get. This is optional.
curl --location --request GET 'http://134.122.43.196:5000/api/v1/invoice?property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/invoice?property=8b70ac80"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/invoice?property=8b70ac80");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/invoice?property=8b70ac80")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/invoice?property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
created datetime The date and time the invoice was generated
due date The date the invoice can be considered 'due'
email_sent datetime The date and time the invoice was successfully sent to the tenant via email. If this value is null for more than a day, please report this to support as there was an error sending the invoice.
filename string The name of the created invoice file. Invoices are in the .odt file format
id string The ID of the invoice
paid datetime The date and time the tenant paid for the invoice, or null if it is unpaid
property string The ID of the property where the billed suite is located
service string The ID of the service which generated that invoice
suite string The ID of the suite which is responsible for paying for the invoice
total float The total of the invoice in dollars
[
    {
        "created": "2021-04-12T12:08:04",
        "due": "2021-05-12",
        "email_sent": "2021-04-12T12:08:05",
        "filename": "my_invoice_1.odt",
        "id": "8b70ac80",
        "paid": null,
        "property": "8b70ac80",
        "service": "8b70ac80",
        "suite": "8b70ac80",
        "total": 500.25
    }
]

PUT (billing:invoice:update)

Marks the selected invoice as 'paid'. Note that this action can not be undone!

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
id string The ID of the invoice to mark
curl --location --request PUT 'http://134.122.43.196:5000/api/v1/invoice?property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/invoice?property=8b70ac80"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("PUT", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("PUT", "http://134.122.43.196:5000/api/v1/invoice?property=8b70ac80");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/invoice?property=8b70ac80")
.method("PUT", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/invoice?property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.PUT);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
created datetime The date and time the invoice was generated
due date The date the invoice can be considered 'due'
email_sent datetime The date and time the invoice was successfully sent to the tenant via email
filename string The name of the created invoice file. Invoices are in the .odt file format
id string The ID of the invoice
paid datetime The date and time the tenant paid for the invoice, or null if it is unpaid
property string The ID of the property where the billed suite is located
service string The ID of the service which generated that invoice
suite string The ID of the suite which is responsible for paying for the invoice
total float The total of the invoice in dollars
{
    "created": "2021-04-12T12:08:04",
    "due": "2021-05-12",
    "email_sent": "2021-04-12T12:08:05",
    "filename": "my_invoice_1.odt",
    "id": "8b70ac80",
    "paid": "2021-04-12T12:14:08",
    "property": "8b70ac80",
    "service": "8b70ac80",
    "suite": "8b70ac80",
    "total": 500.25
}

Invoice File

This endpoint allows you to view past invoice files. It can be accessed at http://134.122.43.196:5000/api/v1/billing/invoice/[name]

Where [name] is the name of the invoice file you wish to pull.

GET (billing:invoice:view)

Returns information about a single property, or all properties

Request
URL Parameters:
Name Type Description
property string The ID of the property of the meter to retrieve. Default is to return all properties
curl --location --request GET 'http://134.122.43.196:5000/api/v1/invoiceFile' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/invoiceFile"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/invoiceFile");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/invoiceFile")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/invoiceFile");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Returns the invoice with the name [name] with the mimetype application/vnd.oasis.opendocument.text (.odt)

Service

This endpoint allows you to manage and view services which generate invoices. It can be accessed at http://134.122.43.196:5000/api/v1/billing/service

GET (billing:service:read)

Returns a list of all created services on this property. See the Invoice Types section for a list of invoice types we provide.

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
id string The ID the service to get. This is optional.
curl --location --request GET 'http://134.122.43.196:5000/api/v1/service?property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/service?property=8b70ac80"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/service?property=8b70ac80");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/service?property=8b70ac80")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/service?property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
active boolean If the service is allowed to generate invoices
address string The address to issue the invoice to
day_of_month int The day of the month to generate and send the invoices on. For example, a value of 1 will generate the invoices on January 1st, February 1st, etc...
id string The ID of the service
invoice_type string The type of invoice to generate. This can be one of the following values: Split From General, General Consumption Price, or Customized Price. For more information on each type, please see the Invoice Types section
name string The name of the service
property string The ID of the property to generate invoices for
suite string The ID of the suite this service applies to
[
    {
        "active": true,
        "address": "123 Main St.",
        "day_of_month": 3,
        "id": "8b70ac80",
        "invoice_type": "Split From General",
        "name": "My Service",
        "property": "8b70ac80",
        "suite": "8b70ac80"
    }
]

POST (billing:service:create)

Creates a new service

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
Request JSON:
Name Type Description
suite string The ID of the suite this service applies to
name string The name of the service
address string The address to issue the invoice to
invoice_type string The type of invoice to generate. This can be one of the following values: Split From General, General Consumption Price, or Customized Price. For more information on each type, please see the Invoice Types section
day_of_month int The day of the month to generate and send the invoices on. For example, a value of 1 will generate the invoices on January 1st, February 1st, etc...
active boolean If the service is allowed to generate invoices. Default is true
curl --location --request POST 'http://134.122.43.196:5000/api/v1/service?property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "address": "2134 Here St.", "day_of_month": 5, "invoice_type": "Split From General", "name": "My Service", "suite": "8b70ac80" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/service?property=8b70ac80"

payload = json.dumps({
    "address": "2134 Here St.",
    "day_of_month": 5,
    "invoice_type": "Split From General",
    "name": "My Service",
    "suite": "8b70ac80"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("POST", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "address": "2134 Here St.",
    "day_of_month": 5,
    "invoice_type": "Split From General",
    "name": "My Service",
    "suite": "8b70ac80"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("POST", "http://134.122.43.196:5000/api/v1/service?property=8b70ac80"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"address\": \"2134 Here St.\",\r\n    \"day_of_month\": 5,\r\n    \"invoice_type\": \"Split From General\",\r\n    \"name\": \"My Service\",\r\n    \"suite\": \"8b70ac80\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/service?property=8b70ac80") .method("POST", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/service?property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"address\": \"2134 Here St.\",\r\n    \"day_of_month\": 5,\r\n    \"invoice_type\": \"Split From General\",\r\n    \"name\": \"My Service\",\r\n    \"suite\": \"8b70ac80\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
Name Type Description
active boolean If the service is allowed to generate invoices
address string The address to issue the invoice to
day_of_month int The day of the month to generate and send the invoices on. For example, a value of 1 will generate the invoices on January 1st, February 1st, etc...
id string The ID of the service
invoice_type string The type of invoice to generate. This can be one of the following values: Split From General, General Consumption Price, or Customized Price. For more information on each type, please see the Invoice Types section
name string The name of the service
property string The ID of the property to generate invoices for
suite string The ID of the suite this service applies to
{
    "active": true,
    "address": "123 Main St.",
    "day_of_month": 3,
    "id": "8b70ac80",
    "invoice_type": "Split From General",
    "name": "My Service",
    "property": "8b70ac80",
    "suite": "8b70ac80"
}

PUT (billing:service:update)

Updates the selected service

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
id string The ID of the service to update
Request JSON:
Name Type Description
suite string The ID of the suite this service applies to
name string The name of the service
address string The address to issue the invoice to
invoice_type string The type of invoice to generate. This can be one of the following values: Split From General, General Consumption Price, or Customized Price. For more information on each type, please see the Invoice Types section
day_of_month int The day of the month to generate and send the invoices on. For example, a value of 1 will generate the invoices on January 1st, February 1st, etc...
active boolean If the service is allowed to generate invoices. Default is true
curl --location --request PUT 'http://134.122.43.196:5000/api/v1/service?property=8b70ac80&id=67bd6fc2' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "address": "2134 Here St.", "day_of_month": 5, "invoice_type": "Split From General", "name": "My Service", "suite": "8b70ac80" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/service?property=8b70ac80&id=67bd6fc2"

payload = json.dumps({
    "address": "2134 Here St.",
    "day_of_month": 5,
    "invoice_type": "Split From General",
    "name": "My Service",
    "suite": "8b70ac80"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("PUT", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "address": "2134 Here St.",
    "day_of_month": 5,
    "invoice_type": "Split From General",
    "name": "My Service",
    "suite": "8b70ac80"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("PUT", "http://134.122.43.196:5000/api/v1/service?property=8b70ac80&id=67bd6fc2"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"address\": \"2134 Here St.\",\r\n    \"day_of_month\": 5,\r\n    \"invoice_type\": \"Split From General\",\r\n    \"name\": \"My Service\",\r\n    \"suite\": \"8b70ac80\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/service?property=8b70ac80&id=67bd6fc2") .method("PUT", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/service?property=8b70ac80&id=67bd6fc2");
client.Timeout = -1;

var request = new RestRequest(Method.PUT);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"address\": \"2134 Here St.\",\r\n    \"day_of_month\": 5,\r\n    \"invoice_type\": \"Split From General\",\r\n    \"name\": \"My Service\",\r\n    \"suite\": \"8b70ac80\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
Name Type Description
active boolean If the service is allowed to generate invoices
address string The address to issue the invoice to
day_of_month int The day of the month to generate and send the invoices on. For example, a value of 1 will generate the invoices on January 1st, February 1st, etc...
id string The ID of the service
invoice_type string The type of invoice to generate. This can be one of the following values: Split From General, General Consumption Price, or Customized Price. For more information on each type, please see the Invoice Types section
name string The name of the service
property string The ID of the property to generate invoices for
suite string The ID of the suite this service applies to
{
    "active": true,
    "address": "123 Main St.",
    "day_of_month": 3,
    "id": "8b70ac80",
    "invoice_type": "Split From General",
    "name": "My Service",
    "property": "8b70ac80",
    "suite": "8b70ac80"
}

DELETE (billing:service:delete)

Deletes the selected service

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
id string The ID the service to delete
curl --location --request DELETE 'http://134.122.43.196:5000/api/v1/service?property=8b70ac80&id=67bd6fc2' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/service?property=8b70ac80&id=67bd6fc2"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("DELETE", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("DELETE", "http://134.122.43.196:5000/api/v1/service?property=8b70ac80&id=67bd6fc2");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/service?property=8b70ac80&id=67bd6fc2")
.method("DELETE", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/service?property=8b70ac80&id=67bd6fc2");
client.Timeout = -1;

var request = new RestRequest(Method.DELETE);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
active boolean If the service is allowed to generate invoices
address string The address to issue the invoice to
day_of_month int The day of the month to generate and send the invoices on. For example, a value of 1 will generate the invoices on January 1st, February 1st, etc...
id string The ID of the service
invoice_type string The type of invoice to generate. This can be one of the following values: Split From General, General Consumption Price, or Customized Price. For more information on each type, please see the Invoice Types section
name string The name of the service
property string The ID of the property to generate invoices for
suite string The ID of the suite this service applies to
{
    "active": true,
    "address": "123 Main St.",
    "day_of_month": 3,
    "id": "8b70ac80",
    "invoice_type": "Split From General",
    "name": "My Service",
    "property": "8b70ac80",
    "suite": "8b70ac80"
}

Suite

This endpoint allows you to manage suites at your property. It can be accessed at http://134.122.43.196:5000/api/v1/billing/suite

GET (billing:suite:read)

Returns a list of all suites at a property

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
id string The ID the suite to get. This is optional.
curl --location --request GET 'http://134.122.43.196:5000/api/v1/suite?property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/suite?property=8b70ac80"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/suite?property=8b70ac80");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/suite?property=8b70ac80")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/suite?property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
id string The ID of the suite
name string The name of the suite
property string The ID of the property
[
    {
        "id": "8b70ac80",
        "name": "My Suite",
        "property": "8b70ac80"
    }
]

POST (billing:suite:create)

Creates a new suite

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
Request JSON:
Name Type Description
name string The name of the suite
curl --location --request POST 'http://134.122.43.196:5000/api/v1/suite?property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "name": "My New Suite" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/suite?property=8b70ac80"

payload = json.dumps({
    "name": "My New Suite"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("POST", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "name": "My New Suite"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("POST", "http://134.122.43.196:5000/api/v1/suite?property=8b70ac80"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"name\": \"My New Suite\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/suite?property=8b70ac80") .method("POST", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/suite?property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"name\": \"My New Suite\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
Name Type Description
id string The ID of the suite
name string The name of the suite
property string The ID of the property
{
    "id": "67bd6fc2",
    "name": "My New Suite",
    "property": "8b70ac80"
}

PUT (billing:suite:update)

Updates an existing suite

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
id string The ID of the suite to update
Request JSON:
Name Type Description
name string The new name of the suite
curl --location --request PUT 'http://134.122.43.196:5000/api/v1/suite?property=8b70ac80&id=67bd6fc2' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "name": "My Newer Suite" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/suite?property=8b70ac80&id=67bd6fc2"

payload = json.dumps({
    "name": "My Newer Suite"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("PUT", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "name": "My Newer Suite"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("PUT", "http://134.122.43.196:5000/api/v1/suite?property=8b70ac80&id=67bd6fc2"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"name\": \"My Newer Suite\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/suite?property=8b70ac80&id=67bd6fc2") .method("PUT", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/suite?property=8b70ac80&id=67bd6fc2");
client.Timeout = -1;

var request = new RestRequest(Method.PUT);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"name\": \"My Newer Suite\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
Name Type Description
id string The ID of the suite
name string The name of the suite
property string The ID of the property
{
    "id": "67bd6fc2",
    "name": "My Newer Suite",
    "property": "8b70ac80"
}

DELETE (billing:suite:delete)

Deletes the suite

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
id string The ID the suite to delete
curl --location --request DELETE 'http://134.122.43.196:5000/api/v1/suite?property=8b70ac80&id=67bd6fc2' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/suite?property=8b70ac80&id=67bd6fc2"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("DELETE", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("DELETE", "http://134.122.43.196:5000/api/v1/suite?property=8b70ac80&id=67bd6fc2");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/suite?property=8b70ac80&id=67bd6fc2")
.method("DELETE", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/suite?property=8b70ac80&id=67bd6fc2");
client.Timeout = -1;

var request = new RestRequest(Method.DELETE);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
id string The ID of the suite
name string The name of the suite
property string The ID of the property
{
    "id": "67bd6fc2",
    "name": "My Newer Suite",
    "property": "8b70ac80"
}

Tenant

This endpoint allows you to manage your list of tenants. It can be accessed at http://134.122.43.196:5000/api/v1/billing/tenant

GET (billing:tenant:read)

Returns a list of all tenants at a property

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
id string The ID the fee to get. This is optional.
curl --location --request GET 'http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
address string The address of the tenant
email string The name of the tenant
first_name string The first name of the tenant
id string The ID of the tenant
last_name string The last name of the tenant
phone string The phone number of the tenant or null if unset
property string The property of the tenant
[
    {
        "address": "123 Main St.",
        "email": "support@intellimeter.ca",
        "first_name": "John",
        "id": "8b70ac80",
        "last_name": "Smith",
        "phone": null,
        "property": "8b70ac80"
    }
]

POST (billing:tenant:create)

Creates a new tenant

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
Request JSON:
Name Type Description
address string The address of the tenant
email string The name of the tenant
first_name string The first name of the tenant
last_name string The last name of the tenant
phone string The phone number of the tenant. Default is null
curl --location --request POST 'http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "address": "123 Main St.", "email": "support@intellimeter.ca", "first_name": "John", "last_name": "Doe", "phone": null }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80"

payload = json.dumps({
    "address": "123 Main St.",
    "email": "support@intellimeter.ca",
    "first_name": "John",
    "last_name": "Doe",
    "phone": None
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("POST", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "address": "123 Main St.",
    "email": "support@intellimeter.ca",
    "first_name": "John",
    "last_name": "Doe",
    "phone": null
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("POST", "http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"address\": \"123 Main St.\",\r\n    \"email\": \"support@intellimeter.ca\",\r\n    \"first_name\": \"John\",\r\n    \"last_name\": \"Doe\",\r\n    \"phone\": null\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80") .method("POST", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"address\": \"123 Main St.\",\r\n    \"email\": \"support@intellimeter.ca\",\r\n    \"first_name\": \"John\",\r\n    \"last_name\": \"Doe\",\r\n    \"phone\": null\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
Name Type Description
address string The address of the tenant
email string The name of the tenant
first_name string The first name of the tenant
id string The ID of the tenant
last_name string The last name of the tenant
phone string The phone number of the tenant or null if unset
property string The property of the tenant
{
    "address": "123 Main St.",
    "email": "support@intellimeter.ca",
    "first_name": "John",
    "id": "8b70ac80",
    "last_name": "Smith",
    "phone": null,
    "property": "8b70ac80"
}

PUT (billing:tenant:update)

Updates an existing tenant

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
id string The ID of the tenant to update
Request JSON:
Name Type Description
address string The address of the tenant
email string The name of the tenant
first_name string The first name of the tenant
last_name string The last name of the tenant
phone string The phone number of the tenant. Default is null
curl --location --request PUT 'http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80&id=67bd6fc2' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "address": "123 Main St.", "email": "support@intellimeter.ca", "first_name": "John", "last_name": "Doe", "phone": null }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80&id=67bd6fc2"

payload = json.dumps({
    "address": "123 Main St.",
    "email": "support@intellimeter.ca",
    "first_name": "John",
    "last_name": "Doe",
    "phone": None
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("PUT", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "address": "123 Main St.",
    "email": "support@intellimeter.ca",
    "first_name": "John",
    "last_name": "Doe",
    "phone": null
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("PUT", "http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80&id=67bd6fc2"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"address\": \"123 Main St.\",\r\n    \"email\": \"support@intellimeter.ca\",\r\n    \"first_name\": \"John\",\r\n    \"last_name\": \"Doe\",\r\n    \"phone\": null\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80&id=67bd6fc2") .method("PUT", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80&id=67bd6fc2");
client.Timeout = -1;

var request = new RestRequest(Method.PUT);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"address\": \"123 Main St.\",\r\n    \"email\": \"support@intellimeter.ca\",\r\n    \"first_name\": \"John\",\r\n    \"last_name\": \"Doe\",\r\n    \"phone\": null\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
Name Type Description
address string The address of the tenant
email string The name of the tenant
first_name string The first name of the tenant
id string The ID of the tenant
last_name string The last name of the tenant
phone string The phone number of the tenant or null if unset
property string The property of the tenant
{
    "address": "123 Main St.",
    "email": "support@intellimeter.ca",
    "first_name": "John",
    "id": "8b70ac80",
    "last_name": "Smith",
    "phone": null,
    "property": "8b70ac80"
}

DELETE (billing:tenant:delete)

Deletes the tenant

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
id string The ID the tenant to delete
curl --location --request DELETE 'http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80&id=67bd6fc2' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80&id=67bd6fc2"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("DELETE", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("DELETE", "http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80&id=67bd6fc2");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80&id=67bd6fc2")
.method("DELETE", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/tenant?property=8b70ac80&id=67bd6fc2");
client.Timeout = -1;

var request = new RestRequest(Method.DELETE);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
address string The address of the tenant
email string The name of the tenant
first_name string The first name of the tenant
id string The ID of the tenant
last_name string The last name of the tenant
phone string The phone number of the tenant or null if unset
property string The property of the tenant
{
    "address": "123 Main St.",
    "email": "support@intellimeter.ca",
    "first_name": "John",
    "id": "8b70ac80",
    "last_name": "Smith",
    "phone": null,
    "property": "8b70ac80"
}

Tenant Suite

This endpoint allows you to map tenants to suites. It can be accessed at http://134.122.43.196:5000/api/v1/billing/tenant-suite

GET (billing:tenant-suite:read)

Returns a list of all tenants in a suite, or suites owned by a tenant. Note that the tenant and suite arguments are mutually exclusive

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
tenant string If specified, all of the suites which are owned by the specified tenant will be returned.
suite string If specified, all of the tenants who live in the specified suite will be returned.
curl --location --request GET 'http://134.122.43.196:5000/api/v1/tenantSuite?property=8b70ac80&[tenant|suite]=[id]' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/tenantSuite?property=8b70ac80&[tenant|suite]=[id]"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/tenantSuite?property=8b70ac80&[tenant|suite]=[id]");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/tenantSuite?property=8b70ac80&[tenant|suite]=[id]")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/tenantSuite?property=8b70ac80&[tenant|suite]=[id]");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
See the Tenant section for the response format if suite is specified, or the Suite section for the response format if tenant is specified

POST (billing:tenant-suite:create)

Binds a tenant to a suite

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
Request JSON:
Name Type Description
tenant string The ID of the tenant to bind to the suite
suite string The ID of the suite to bind to the tenant
curl --location --request POST 'http://134.122.43.196:5000/api/v1/tenantSuite?property=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "suite": "2fbac398", "tenant": "5754eba3" }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/tenantSuite?property=8b70ac80"

payload = json.dumps({
    "suite": "2fbac398",
    "tenant": "5754eba3"
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("POST", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "suite": "2fbac398",
    "tenant": "5754eba3"
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("POST", "http://134.122.43.196:5000/api/v1/tenantSuite?property=8b70ac80"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"suite\": \"2fbac398\",\r\n    \"tenant\": \"5754eba3\"\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/tenantSuite?property=8b70ac80") .method("POST", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/tenantSuite?property=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"suite\": \"2fbac398\",\r\n    \"tenant\": \"5754eba3\"\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
HTTP: 204 - No Content

DELETE (billing:tenant-suite:delete)

Removes the binding of a tenant to a suite

Request
URL Parameters:
Name Type Description
property string The ID of the property to use
tenant string The ID of the tenant to remove binding from the suite
suite string The ID of the suite to remove binding from the tenant
curl --location --request DELETE 'http://134.122.43.196:5000/api/v1/tenantSuite?property=8b70ac80&tenant=5754eba3&suite=2fbac398' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/tenantSuite?property=8b70ac80&tenant=5754eba3&suite=2fbac398"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("DELETE", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("DELETE", "http://134.122.43.196:5000/api/v1/tenantSuite?property=8b70ac80&tenant=5754eba3&suite=2fbac398");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/tenantSuite?property=8b70ac80&tenant=5754eba3&suite=2fbac398")
.method("DELETE", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/tenantSuite?property=8b70ac80&tenant=5754eba3&suite=2fbac398");
client.Timeout = -1;

var request = new RestRequest(Method.DELETE);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
HTTP: 204 - No Content

Invoice Types

The following is a list of the currently supported invoice types, and some helpful information about each

Customized Price

This billing type issues a bill at a single flat rate. The flat rate is simply the sum of the active Fees at the property (+ tax)

For example, if your property has the following fees:

Name Value
Admin Fee $ 6.26
Service Fee $ 4.32

The total price of the invoice would become $10.58

$$ $6.26 + $4.32 = $10.58 $$

General Consumption Price

This billing type is the most complicated

For example, if the electricity rate is set to $0.13, we can calculate the total bill for each of our example tenants:

Tenant Consumption Rate Total
Tenant A 40.215 kWh $0.13 $$ 40.215 kWh \times $0.13 \approx $5.23 $$
Tenant B 35.500 kWh $0.13 $$ 35.500 kWh \times $0.13 \approx $4.62 $$
Tenant C 20.250 kWh $0.13 $$ 20.250 kWh \times $0.13 \approx $2.63 $$

Split From General

This billing type issues a bill which involves the most complicated formula, and may seem like a more complicated version of the General Consumption Price billing type, but its advantage is that it takes into account losses you don't want to carry. By splitting the invoice, we can be sure that the invoice will be equally divided between tenants.

In this example, we will start with the same consumption examples in the General Consumption Price billing type

Tenant Consumption
Tenant A 40.215 kWh
Tenant B 35.500 kWh
Tenant C 20.250 kWh

The total consumption of the property can be calculated as:

$$ 40.215 kWh + 35.500 kWh + 20.250 kWh = 95.875 kWh $$

The total cost of the consumption can then be calculated as (again using the $0.13 electricity rate)

$$ 95.875 kWh \times $0.13 = $12.46375 $$

Next, we can calculate the shares of each tenant based on their consumption

Tenant Consumption Total Consumption Tenant's Share
Tenant A 40.215 kWh 95.875 kWh $$ \frac{ 40.215 kWh }{ 95.875 kWh } \approx 0.4185 $$
Tenant B 35.500 kWh 95.875 kWh $$ \frac{ 35.500 kWh }{ 95.875 kWh } \approx 0.3703 $$
Tenant C 20.250 kWh 95.875 kWh $$ \frac{ 20.250 kWh }{ 95.875 kWh } \approx 0.2112 $$

Finally, we can calculate the total invoice of each tenant from their previously calculated share

Tenant Consumption Tenant's Share Tenant's Invoice
Tenant A 40.215 kWh $$ \approx 0.4185 $$ $$ 0.4185 \times $12.46375 \approx $5.22 $$
Tenant B 35.500 kWh $$ \approx 0.3703 $$ $$ 0.3703 \times $12.46375 \approx $4.62 $$
Tenant C 20.250 kWh $$ \approx 0.2112 $$ $$ 0.2112 \times $12.46375 \approx $2.63 $$

Note that these values are not an exact match (off by 1 cent) with the values calculated in the General Consumption Price billing type. This is simply due to rounding as we only kept four decimal places. When our system performs these calculations, it keep more than four decimal places, and so this error margin becomes negligible.

Electric Vehicle Charging Management Controller (EVCMC)

These endpoints allow you to control and manage your EVCMC (Vehicle Charging Management Controller) meters

Coming Soon

Reports

These endpoints generate and return reports on your company, properties, suites, or meters

Period Consumption

This endpoint provides total consumption over the specified period of time. It can be accessed at http://134.122.43.196:5000/api/v1/reports/period-consumption

GET (report:reading:period)

Request
URL Parameters:
Name Type Description
start date The start date of the range to generate the report from. Note that time can be included provided the value is in the ISO 8601 format
end date The end date of the range to generate the report from. Note that time can be included provided the value is in the ISO 8601 format
type string The data format the result should be in. This can be one of the following values: RAW, CSV, XML, JSON, YAML, XLSX, TSV, or MYSQL. All will return a file except for RAW which will return a standard JSON response
property string The ID of the property to retrieve data from
ids list A comma separated list of the ids of the meters you wish to include in the report, or all to return data on all meters
pretty bool If the resultant data should be pretty printed (this does not apply to all formats). This makes the data easier for a human to read, however, it can significantly increase the size of the file. Default is false.
table_name string If the report is being generated in MYSQL mode, this arguement can be used to set the table name the data is being inserted into. The default value is {table_name}
curl --location --request GET 'http://134.122.43.196:5000/api/v1/reports/period-consumption?start=2021-03-09&end=2021-03-13&type=csv&property=8b70ac80&ids=all' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/reports/period-consumption?start=2021-03-09&end=2021-03-13&type=csv&property=8b70ac80&ids=all"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/reports/period-consumption?start=2021-03-09&end=2021-03-13&type=csv&property=8b70ac80&ids=all");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/reports/period-consumption?start=2021-03-09&end=2021-03-13&type=csv&property=8b70ac80&ids=all")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/reports/period-consumption?start=2021-03-09&end=2021-03-13&type=csv&property=8b70ac80&ids=all");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
csv
xml
json
yaml
xslx
tsv
mysql

Single Grand Total

This endpoint returns the reads taken on the specified day. It can be accessed at http://134.122.43.196:5000/api/v1/reports/single-grand-total

GET (report:reading:single)

Request
URL Parameters:
Name Type Description
start date The start date of the range to generate the report from. Note that time can be included provided the value is in the ISO 8601 format
type string The data format the result should be in. This can be one of the following values: RAW, CSV, XML, JSON, YAML, XLSX, TSV, or MYSQL. All will return a file except for RAW which will return a standard JSON response
property string The ID of the property to retrieve data from
ids list A comma separated list of the ids of the meters you wish to include in the report, or all to return data on all meters
pretty bool If the resultant data should be pretty printed (this does not apply to all formats). This makes the data easier for a human to read, however, it can significantly increase the size of the file. Default is false.
table_name string If the report is being generated in MYSQL mode, this arguement can be used to set the table name the data is being inserted into. The default value is {table_name}
curl --location --request GET 'http://134.122.43.196:5000/api/v1/reports/single-grand-total?start=2021-03-09&type=csv&property=8b70ac80&ids=all' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/reports/single-grand-total?start=2021-03-09&type=csv&property=8b70ac80&ids=all"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/reports/single-grand-total?start=2021-03-09&type=csv&property=8b70ac80&ids=all");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/reports/single-grand-total?start=2021-03-09&type=csv&property=8b70ac80&ids=all")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/reports/single-grand-total?start=2021-03-09&type=csv&property=8b70ac80&ids=all");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
csv
xml
json
yaml
xslx
tsv
mysql

Daily Grand Total

This endpoint returns the reads taken each day in the specified range. It can be accessed at http://134.122.43.196:5000/api/v1/reports/daily-grand-total

GET (report:reading:daily)

Request
URL Parameters:
Name Type Description
start date The start date of the range to generate the report from. Note that time can be included provided the value is in the ISO 8601 format
end date The end date of the range to generate the report from. Note that time can be included provided the value is in the ISO 8601 format
type string The data format the result should be in. This can be one of the following values: RAW, CSV, XML, JSON, YAML, XLSX, TSV, or MYSQL. All will return a file except for RAW which will return a standard JSON response
property string The ID of the property to retrieve data from
ids list A comma separated list of the ids of the meters you wish to include in the report, or all to return data on all meters
pretty bool If the resultant data should be pretty printed (this does not apply to all formats). This makes the data easier for a human to read, however, it can significantly increase the size of the file. Default is false.
table_name string If the report is being generated in MYSQL mode, this arguement can be used to set the table name the data is being inserted into. The default value is {table_name}
curl --location --request GET 'http://134.122.43.196:5000/api/v1/reports/daily-grand-total?start=2021-03-09&end=2021-03-13&type=csv&property=8b70ac80&ids=all' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/reports/daily-grand-total?start=2021-03-09&end=2021-03-13&type=csv&property=8b70ac80&ids=all"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/reports/daily-grand-total?start=2021-03-09&end=2021-03-13&type=csv&property=8b70ac80&ids=all");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/reports/daily-grand-total?start=2021-03-09&end=2021-03-13&type=csv&property=8b70ac80&ids=all")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/reports/daily-grand-total?start=2021-03-09&end=2021-03-13&type=csv&property=8b70ac80&ids=all");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
csv
xml
json
yaml
xslx
tsv
mysql

Counts

This endpoint returns counts and statistics about your company. It can be accessed at http://134.122.43.196:5000/api/v1/reports/counts

GET (report:general:count)

Request
curl --location --request GET 'http://134.122.43.196:5000/api/v1/reports/counts' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/reports/counts"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/reports/counts");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/reports/counts")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/reports/counts");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
[
    {
        "invoices": {
            "late": 6,
            "late_percent": 13.953488372093023,
            "on_time": 37,
            "on_time_percent": 86.04651162790698,
            "paid": 2,
            "paid_percent": 4.651162790697675,
            "total": 43,
            "unpaid": 41,
            "unpaid_percent": 95.34883720930233
        },
        "monthly_consumption": {
            "electrical": 200.235,
            "gas": 60.289,
            "water": 30.458
        }
    }
]

Interval Report

This endpoint returns the consumption taken over the specified time period at the specified interval.. It can be accessed at http://134.122.43.196:5000/api/v1/reports/interval

GET (report:reading:interval)

Request
URL Parameters:
Name Type Description
start date The start date of the range to generate the report from. Note that time can be included provided the value is in the ISO 8601 format
end date The end date of the range to generate the report from. Note that time can be included provided the value is in the ISO 8601 format
type string The data format the result should be in. This can be one of the following values: RAW, CSV, XML, JSON, YAML, XLSX, TSV, or MYSQL. All will return a file except for RAW which will return a standard JSON response
property string The ID of the property to retrieve data from
ids list A comma separated list of the ids of the meters you wish to include in the report, or all to return data on all meters
interval string The interval to gather the consumption at. This can be one of the following values: HOUR, DAY, MONTH, or YEAR (case insensitive). Note that the timestamp will only show up to the specified interval. For example, if MONTH is selected, the timestamp will be in the format YYYY-MM
pretty bool If the resultant data should be pretty printed (this does not apply to all formats). This makes the data easier for a human to read, however, it can significantly increase the size of the file. Default is false.
table_name string If the report is being generated in MYSQL mode, this arguement can be used to set the table name the data is being inserted into. The default value is {table_name}
curl --location --request GET 'http://134.122.43.196:5000/api/v1/reports/interval?start=2021-03-09&end=2021-03-13&type=json&property=8b70ac80&ids=all&table_name=test&interval=day' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/reports/interval?start=2021-03-09&end=2021-03-13&type=json&property=8b70ac80&ids=all&table_name=test&interval=day"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/reports/interval?start=2021-03-09&end=2021-03-13&type=json&property=8b70ac80&ids=all&table_name=test&interval=day");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/reports/interval?start=2021-03-09&end=2021-03-13&type=json&property=8b70ac80&ids=all&table_name=test&interval=day")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/reports/interval?start=2021-03-09&end=2021-03-13&type=json&property=8b70ac80&ids=all&table_name=test&interval=day");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
csv
xml
json
yaml
xslx
tsv
mysql

Scheduled Reports

This endpoint allows to schedule reports to be generated and emailed to you automatically. It can be accessed at http://134.122.43.196:5000/api/v1/reports/reports/schedule

GET (report:schedule:read)

Returns a list of your scheduled reports

Request
curl --location --request GET 'http://134.122.43.196:5000/api/v1/reports/schedule' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/reports/schedule"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/reports/schedule");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/reports/schedule")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/reports/schedule");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
active bool If the report will be generated on its schedule
created datetime The date and time the report was created
end date The date the report should be run for the last time (null to run indefinitely)
id string The id of the report
last_run datetime The date and time the report was last run (null means it has not been run by the system yet)
name string The name of the report
period int How many "repeat"s must pass between each generation (ex. period=1 and repeat=month means to run every 1 months)
repeat string The frequency to run the report. This can be one of the following values: never, day, week, month, year (case insensitive)
reports list A list of strings containing the reports which should be included in the report (in order of appearance on the pdf file). Options are (case sensitive): ConsumptionTable, ConsumptionMonthly, ConsumptionDaily, ConsumptionDistribution, WeekendDistribution, WeekendTable, TopProperties, TopSuites, TopPropertiesTable, TopSuitesTable
result string A system generated message describing the status of the last report generation
start date The date the report should begin being scheduled (null means to use the date of creation)
updated datetime The date and time the report was last updated
user string The user who owns the report
[
    {
        "active": true,
        "created": "2021-05-25T13:26:35",
        "end": null,
        "id": "8b70ac80",
        "last_run": null,
        "name": "My Report",
        "period": null,
        "repeat": "never",
        "reports": [
            "ConsumptionTable",
            "ConsumptionMonthly",
            "ConsumptionDaily",
            "ConsumptionDistribution"
        ],
        "result": null,
        "start": "2021-05-25",
        "updated": "2021-05-27T09:54:39",
        "user": "8b70ac80"
    }
]

POST (report:schedule:create)

Creates a new scheduled report

Request
Request JSON:
Name Type Description
name string The name of the report
reports list A list of strings containing the reports which should be included in the report (in order of appearance on the pdf file). Options are (case sensitive): ConsumptionTable, ConsumptionMonthly, ConsumptionDaily, ConsumptionDistribution, WeekendDistribution, WeekendTable, TopProperties, TopSuites, TopPropertiesTable, TopSuitesTable
repeat string The frequency to run the report. This can be one of the following values: never, day, week, month, year (case insensitive)
period int How many "repeat"s must pass between each generation (ex. period=1 and repeat=month means to run every 1 months)
start date The date the report should begin being scheduled (null means to use the date of creation)
end date The date the report should be run for the last time (null to run indefinitely)
active bool If the report will be generated on its schedule
curl --location --request POST 'http://134.122.43.196:5000/api/v1/reports/schedule' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "name": "Report 2", "period": 1, "repeat": "day", "reports": [ "ConsumptionTable", "ConsumptionMonthly", "ConsumptionDaily", "ConsumptionDistribution" ] }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/reports/schedule"

payload = json.dumps({
    "name": "Report 2",
    "period": 1,
    "repeat": "day",
    "reports": [
        "ConsumptionTable",
        "ConsumptionMonthly",
        "ConsumptionDaily",
        "ConsumptionDistribution"
    ]
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("POST", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "name": "Report 2",
    "period": 1,
    "repeat": "day",
    "reports": [
        "ConsumptionTable",
        "ConsumptionMonthly",
        "ConsumptionDaily",
        "ConsumptionDistribution"
    ]
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("POST", "http://134.122.43.196:5000/api/v1/reports/schedule"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"name\": \"Report 2\",\r\n    \"period\": 1,\r\n    \"repeat\": \"day\",\r\n    \"reports\": [\r\n        \"ConsumptionTable\",\r\n        \"ConsumptionMonthly\",\r\n        \"ConsumptionDaily\",\r\n        \"ConsumptionDistribution\"\r\n    ]\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/reports/schedule") .method("POST", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/reports/schedule");
client.Timeout = -1;

var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"name\": \"Report 2\",\r\n    \"period\": 1,\r\n    \"repeat\": \"day\",\r\n    \"reports\": [\r\n        \"ConsumptionTable\",\r\n        \"ConsumptionMonthly\",\r\n        \"ConsumptionDaily\",\r\n        \"ConsumptionDistribution\"\r\n    ]\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
Name Type Description
active bool If the report will be generated on its schedule
created datetime The date and time the report was created
end date The date the report should be run for the last time (null to run indefinitely)
id string The id of the report
last_run datetime The date and time the report was last run (null means it has not been run by the system yet)
name string The name of the report
period int How many "repeat"s must pass between each generation (ex. period=1 and repeat=month means to run every 1 months)
repeat string The frequency to run the report. This can be one of the following values: never, day, week, month, year (case insensitive)
reports list A list of strings containing the reports which should be included in the report (in order of appearance on the pdf file). Options are (case sensitive): ConsumptionTable, ConsumptionMonthly, ConsumptionDaily, ConsumptionDistribution, WeekendDistribution, WeekendTable, TopProperties, TopSuites, TopPropertiesTable, TopSuitesTable
result string A system generated message describing the status of the last report generation
start date The date the report should begin being scheduled (null means to use the date of creation)
updated datetime The date and time the report was last updated
user string The user who owns the report
[
    {
        "active": true,
        "created": "2021-05-25T13:26:35",
        "end": null,
        "id": "8b70ac80",
        "last_run": null,
        "name": "My Report",
        "period": null,
        "repeat": "never",
        "reports": [
            "ConsumptionTable",
            "ConsumptionMonthly",
            "ConsumptionDaily",
            "ConsumptionDistribution"
        ],
        "result": null,
        "start": "2021-05-25",
        "updated": "2021-05-27T09:54:39",
        "user": "8b70ac80"
    }
]

PUT (report:schedule:update)

Updates an existing scheduled report

Request
URL Parameters:
Name Type Description
id string The ID of the report to update
Request JSON:
Name Type Description
name string The name of the report
reports list A list of strings containing the reports which should be included in the report (in order of appearance on the pdf file). Options are (case sensitive): ConsumptionTable, ConsumptionMonthly, ConsumptionDaily, ConsumptionDistribution, WeekendDistribution, WeekendTable, TopProperties, TopSuites, TopPropertiesTable, TopSuitesTable
repeat string The frequency to run the report. This can be one of the following values: never, day, week, month, year (case insensitive)
period int How many "repeat"s must pass between each generation (ex. period=1 and repeat=month means to run every 1 months)
start date The date the report should begin being scheduled (null means to use the date of creation)
end date The date the report should be run for the last time (null to run indefinitely)
active bool If the report will be generated on its schedule
curl --location --request PUT 'http://134.122.43.196:5000/api/v1/reports/schedule?id=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
--header 'Content-Type: application/json' \ --data-raw '{ "name": "Report 2", "period": 1, "repeat": "day", "reports": [ "ConsumptionTable", "ConsumptionMonthly", "ConsumptionDaily", "ConsumptionDistribution" ] }'
import requests
import json

url = "http://134.122.43.196:5000/api/v1/reports/schedule?id=8b70ac80"

payload = json.dumps({
    "name": "Report 2",
    "period": 1,
    "repeat": "day",
    "reports": [
        "ConsumptionTable",
        "ConsumptionMonthly",
        "ConsumptionDaily",
        "ConsumptionDistribution"
    ]
})
 
headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("PUT", url, headers=headers, data=payload) print(response.text)
var data = JSON.stringify({
    "name": "Report 2",
    "period": 1,
    "repeat": "day",
    "reports": [
        "ConsumptionTable",
        "ConsumptionMonthly",
        "ConsumptionDaily",
        "ConsumptionDistribution"
    ]
});
 
var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); } }); xhr.open("PUT", "http://134.122.43.196:5000/api/v1/reports/schedule?id=8b70ac80"); xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n    \"name\": \"Report 2\",\r\n    \"period\": 1,\r\n    \"repeat\": \"day\",\r\n    \"reports\": [\r\n        \"ConsumptionTable\",\r\n        \"ConsumptionMonthly\",\r\n        \"ConsumptionDaily\",\r\n        \"ConsumptionDistribution\"\r\n    ]\r\n}");
 
Request request = new Request.Builder() .url("http://134.122.43.196:5000/api/v1/reports/schedule?id=8b70ac80") .method("PUT", body)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/reports/schedule?id=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.PUT);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");
request.AddParameter("application/json", "{\r\n    \"name\": \"Report 2\",\r\n    \"period\": 1,\r\n    \"repeat\": \"day\",\r\n    \"reports\": [\r\n        \"ConsumptionTable\",\r\n        \"ConsumptionMonthly\",\r\n        \"ConsumptionDaily\",\r\n        \"ConsumptionDistribution\"\r\n    ]\r\n}",  ParameterType.RequestBody);
IRestResponse response = client.Execute(request); Console.WriteLine(response.Content);
Response
Name Type Description
active bool If the report will be generated on its schedule
created datetime The date and time the report was created
end date The date the report should be run for the last time (null to run indefinitely)
id string The id of the report
last_run datetime The date and time the report was last run (null means it has not been run by the system yet)
name string The name of the report
period int How many "repeat"s must pass between each generation (ex. period=1 and repeat=month means to run every 1 months)
repeat string The frequency to run the report. This can be one of the following values: never, day, week, month, year (case insensitive)
reports list A list of strings containing the reports which should be included in the report (in order of appearance on the pdf file). Options are (case sensitive): ConsumptionTable, ConsumptionMonthly, ConsumptionDaily, ConsumptionDistribution, WeekendDistribution, WeekendTable, TopProperties, TopSuites, TopPropertiesTable, TopSuitesTable
result string A system generated message describing the status of the last report generation
start date The date the report should begin being scheduled (null means to use the date of creation)
updated datetime The date and time the report was last updated
user string The user who owns the report
[
    {
        "active": true,
        "created": "2021-05-25T13:26:35",
        "end": null,
        "id": "8b70ac80",
        "last_run": null,
        "name": "My Report",
        "period": null,
        "repeat": "never",
        "reports": [
            "ConsumptionTable",
            "ConsumptionMonthly",
            "ConsumptionDaily",
            "ConsumptionDistribution"
        ],
        "result": null,
        "start": "2021-05-25",
        "updated": "2021-05-27T09:54:39",
        "user": "8b70ac80"
    }
]

DELETE (report:schedule:delete)

Deletes the specified report

Request
URL Parameters:
Name Type Description
id string The ID of the report to delete
curl --location --request DELETE 'http://134.122.43.196:5000/api/v1/reports/schedule?id=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/reports/schedule?id=8b70ac80"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("DELETE", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("DELETE", "http://134.122.43.196:5000/api/v1/reports/schedule?id=8b70ac80");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/reports/schedule?id=8b70ac80")
.method("DELETE", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/reports/schedule?id=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.DELETE);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
active bool If the report will be generated on its schedule
created datetime The date and time the report was created
end date The date the report should be run for the last time (null to run indefinitely)
id string The id of the report
last_run datetime The date and time the report was last run (null means it has not been run by the system yet)
name string The name of the report
period int How many "repeat"s must pass between each generation (ex. period=1 and repeat=month means to run every 1 months)
repeat string The frequency to run the report. This can be one of the following values: never, day, week, month, year (case insensitive)
reports list A list of strings containing the reports which should be included in the report (in order of appearance on the pdf file). Options are (case sensitive): ConsumptionTable, ConsumptionMonthly, ConsumptionDaily, ConsumptionDistribution, WeekendDistribution, WeekendTable, TopProperties, TopSuites, TopPropertiesTable, TopSuitesTable
result string A system generated message describing the status of the last report generation
start date The date the report should begin being scheduled (null means to use the date of creation)
updated datetime The date and time the report was last updated
user string The user who owns the report
[
    {
        "active": true,
        "created": "2021-05-25T13:26:35",
        "end": null,
        "id": "8b70ac80",
        "last_run": null,
        "name": "My Report",
        "period": null,
        "repeat": "never",
        "reports": [
            "ConsumptionTable",
            "ConsumptionMonthly",
            "ConsumptionDaily",
            "ConsumptionDistribution"
        ],
        "result": null,
        "start": "2021-05-25",
        "updated": "2021-05-27T09:54:39",
        "user": "8b70ac80"
    }
]

Generate a Scheduled Report

This endpoint queues one of your scheduled reports to be generated and downloaded. It can be accessed at http://134.122.43.196:5000/api/v1/reports/reports/schedule/generate

GET (report:schedule:generate)

Queues the specified report for generation. returns HTTP Status Code: 202

Request
URL Parameters:
Name Type Description
id string The ID of the report to queue for generation
curl --location --request GET 'http://134.122.43.196:5000/api/v1/reports/schedule/generate?id=8b70ac80' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/reports/schedule/generate?id=8b70ac80"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/reports/schedule/generate?id=8b70ac80");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/reports/schedule/generate?id=8b70ac80")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/reports/schedule/generate?id=8b70ac80");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
code int Will always be 202
error string Will always be "Accepted"
interval time The interval at which you may poll the status in the format HH:MM:SS. Will almost always be "0:00:05" - 5 seconds
message string A success message
poll_uri string The URL to poll the generation status
{
    "code": 202,
    "error": "Accepted",
    "interval": "0:00:05",
    "message": "The report generation job has been started. Please poll http://127.0.0.1:12345/api/v1/reports/schedule/poll?id=8b70ac80&token=179c9419c6d for the status",
    "poll_uri": "[Some URI to poll the status]"
}

Poll a Generating Report

This endpoint checks the status of a report being generated. It can be accessed at http://134.122.43.196:5000/api/v1/reports/reports/schedule/poll

GET (report:schedule:generate)

Queues the specified report for generation. returns HTTP Status Code: 202

Request
URL Parameters:
Name Type Description
id string The ID of the report to poll
token string The access token provided when queuing the report
curl --location --request GET 'http://134.122.43.196:5000/api/v1/reports/schedule/poll?id=8b70ac80&token=179c9419c6d' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/reports/schedule/poll?id=8b70ac80&token=179c9419c6d"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/reports/schedule/poll?id=8b70ac80&token=179c9419c6d");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/reports/schedule/poll?id=8b70ac80&token=179c9419c6d")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/reports/schedule/poll?id=8b70ac80&token=179c9419c6d");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
If the report has not finished being generated, you will receive the following JSON response:
{
    "code": 425,
    "error": "Too Early",
    "message": "The requested report is still being created. Please check again later."
}
If the report has not been completed yet, the generated PDF file will be returned with the Content-Type header set to application/pdf

File Send

This section explains the file formats which are available to be sent after each read cycle. For more information on configuring this, please see the HTTP/HTTPS or FTPS API Endpoints, or manage in the Intellimeter Cloud Portal under Settings/HTTP File Upload, or Settings/FTPS File Upload.

CSV

There will be one record per meter, and one column per parameter which is monitored

name,serial_number,utility,panel,suite,floor,time_stamping,sent,voltage_a,voltage_b,voltage_c
Meter1,20-350-Testing-MFX-1-Meter-01,E,,,,2021-01-20 15:20:00,,122.3,122.4,122.0
Meter2,20-350-Testing-MFX-2-Meter-01,E,,,,2021-01-20 15:20:00,,122.3,122.4,122.1

JSON

There will be one object per meter. The object key is the name of the meter. Each object will contain a key-value pair of the metering point and its latest read

{
     "Meter1": {
        "serial_number": "20-350-Testing-MFX-1-Meter-01",
        "utility": "E",
        "panel": null,
        "suite": null,
        "floor": null,
        "time_stamping": "2021-01-20 15:20:00",
        "sent": null,
        "voltage_a": 122.3,
        "voltage_b": 122.4,
        "voltage_c": 122.0
    },
    "Meter2": {
        "serial_number": "20-350-Testing-MFX-2-Meter-01",
        "utility": "E",
        "panel": null,
        "suite": null,
        "floor": null,
        "time_stamping": "2021-01-20 15:20:00",
        "sent": null,
        "voltage_a": 122.3,
        "voltage_b": 122.4,
        "voltage_c": 122.1
    }
}

XML

There will be one object per meter. Each object will contain a tag for each metering point and its latest read

<?xml version="1.0" encoding="UTF-8" ?>
<reads>
    <item>
        <name>Meter1</name>
        <serial_number>20-350-Testing-MFX-1-Meter-01</serial_number>
        <utility>E</utility>
        <panel></panel>
        <suite></suite>
        <floor></floor>
        <time_stamping>2021-01-20 15:20:00</time_stamping>
        <sent></sent>
        <voltage_a>122.3,</voltage_a>
        <voltage_b>122.4,</voltage_b>
        <voltage_c>122.0</voltage_c>
    </item>
    <item>
        <name>Meter2</name>
        <serial_number>20-350-Testing-MFX-2-Meter-01</serial_number>
        <utility>E</utility>
        <panel></panel>
        <suite></suite>
        <floor></floor>
        <time_stamping>2021-01-20 15:20:00</time_stamping>
        <sent></sent>
        <voltage_a>122.3,</voltage_a>
        <voltage_b>122.4,</voltage_b>
        <voltage_c>122.1</voltage_c>
    </item>
</reads>

Public

These are endpoints which do not require authentication. Note that they only pertain to the Intellimeter Data Web Portal, and may not be useful for your project.

FAQ

Retrieves the list of frequently asked API questions, and their answers. It can be accessed at http://134.122.43.196:5000/api/v1/faq

GET

Request
curl --location --request GET 'http://134.122.43.196:5000/api/v1/faq' \
--header 'Authorization: Bearer [Access Token]' \
import requests
import json

url = "http://134.122.43.196:5000/api/v1/faq"

headers = {
    "Authorization": "Bearer [Access Token]",
    "Content-Type": "application/json" } response = requests.request("GET", url, headers=headers) print(response.text)
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});

xhr.open("GET", "http://134.122.43.196:5000/api/v1/faq");
xhr.setRequestHeader("Authorization", "Bearer [Access Token]");
xhr.setRequestHeader("Content-Type", "application/json"); xhr.send();
OkHttpClient client = new OkHttpClient().newBuilder()
.build();

Request request = new Request.Builder()
.url("http://134.122.43.196:5000/api/v1/faq")
.method("GET", null)
  .addHeader("Authorization", "Bearer [Access Token]") .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute();
var client = new RestClient("http://134.122.43.196:5000/api/v1/faq");
client.Timeout = -1;

var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer [Access Token]");

IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Response
Name Type Description
answer string The answer to the question
created datetime The date and time the question was created
id string The ID of the question
question string The question
updated datetime The date and time the question was updated
[
    {
        "answer": "Answer 1",
        "created": "2021-04-08T16:27:02",
        "id": "8b70ac80",
        "question": "Question 1",
        "updated": "2021-04-08T16:27:02"
    }
]

User Manual

Retrieves the latest version of the user's manual for the Intellimeter Canada Inc. data portal. It can be accessed at http://134.122.43.196:5000/api/v1/documentation

Response
The User's Manual as a PDF file.

API Help And Support

For assistance with using the API, or any other questions or concerns, please contact us at support@intellimeter.ca