API Overview
InformaCast Mobile is Singlewire Software’s cloud-based, mobile device broadcast system that allows you to simultaneously send combinations of text, pre-recorded audio, and images to Android and iOS mobile endpoints such as cellular phones and tablets. While smart devices provide the richest interface and are the primary target, you can also send content via email, SMS messages to any cell phone, and audio calls to any telephone.
InformaCast Mobile (its web interface and Android and iOS mobile apps) is built upon a powerful representational state transfer (REST) application programming interface (API). Any operation supported by InformaCast Mobile can be achieved through its API, which uses the standard HTTP
verbs of POST
, GET
, PUT
, and DELETE
to create, read, update, and delete resources, though not all verbs are available for all resources.
An API request is comprised of the application path (i.e. https://api.icmobile.singlewire.com/api/), the API’s version, a resource path, and optional query parameters. The following API request could be used with an HTTP GET
to retrieve a user’s information.
Pasting this request into a web browser yields all known information about this user.
Visit http://www.tutorialspoint.com/http/http_quick_guide.htm to learn more about formatting HTTP requests or responses.
{"permissions": ["get"],
"lock": null,
"securityGroups": [],
"subscriptions": [
{"createdAt": "2014-05-22T12:55:14.932Z",
"id": "51839b40-e1b0-11e3-b343-0ab69cea9f8b",
"distributionListId": "29e56500-e1b0-11e3-b343-0ab69cea9f8b",
"userId": "d55af380-caf6-11e3-81cc-127b75e3b4bb"}],
"createdAt": "2014-04-23T14:52:04.152Z",
"id": "d55af380-caf6-11e3-81cc-127b75e3b4bb",
"email":"george.harrison@gmail.com",
"name":"George Harrison"}
Prerequisites
Before beginning to use the InformaCast Mobile API, you must have:
- A successfully registered account on InformaCast Mobile
- Internet access for the InformaCast Mobile website.
- A valid identity provider account with either InformaCast Mobile’s built-in identity provider, Microsoft Active Directory Federated Services (AD FS), Google OpenID Connect, or Windows Azure.
Mobile devices registering with InformaCast Mobile have the following prerequisites:
- For iOS devices, iOS 7.0.0 or later
- For Android devices, Android 4.0 (Ice Cream Sandwich) or later
- A separate identity provider account for each user who plans to receive InformaCast Mobile alerts on his/her device.
API Documentation
The documentation for the InformaCast Mobile API is separated into three panes:
- Navigation
- Documentation
- Sample Requests
The left Navigation pane includes a responsive table of contents that allows for easy navigation between InformaCast Mobile API’s operations and resources, and it also scrolls with you as you move through the content in the center pane.
The center Documentation pane includes definitions of certain aspects of InformaCast Mobile, explanations of each resource and its attributes, and the relevant HTTP request. The headings you may see pertaining to each resource include:
- HTTP REQUEST. The type of HTTP request (e.g. GET, PUT, POST, DELETE) along with the URL resource name.
- PRODUCES. The type of data that is produced from the request and contained in the body of the response (typically
application/json
). - CONSUMES. The type of data contained in the body of the request (if any). This data is used when processing the request (typically
application/json
). - PATH PARAMETER. Any data that may appear as a path parameter on the resource URL. The following example shows
961
as a path parameter:https://api.icmobile.singlewire.com/api/v1/users/961
- QUERY PARAMETERS. Any data that may appear as a query parameter (name/value pair) on the resource URL. The following example shows
limit
as a query parameter:https://api.icmobile.singlewire.com/api/v1/users?limit=1
- REQUEST PARAMETERS. The data that is contained in the request body that is used when processing the request (typically in the form of
application/json
). - RESPONSE. The data that is returned from the request, which is contained in the response body (typically in the form of
application/json
). - STATUS CODE. The HTTP response status code that is returned on the response (see Common Responses).
The Sample Requests pane on the right contains tab(s) of sample requests that pertain to the documentation in the center pane (currently, only cURL requests are shown, but we plan to add examples in other languages as we add support for different access libraries). The cURL examples should actually work if you copy and paste them into a shell window, although you may have to alter IDs and other values to match resources which actually exist in your account.
Terminology
When working with the InformaCast Mobile API, it’s useful to be familiar with certain terms:
- Users. Individuals who will receive (and possibly send) notifications. Users can be assigned individual permissions and grouped into distribution lists and security groups with their own set of permissions.
- Permissions. Controls for the functionality that users can view and/or change, e.g. read permissions for distribution list, create and edit permissions for security groups and message templates.
- Distribution Lists. A way to organize and group users. Distribution lists are also the recipients of notifications. You cannot send a notification to a user who is not included in a distribution list.
- Security Groups. Another way to group users, but also assign them permissions, such as creating message templates or sending notifications to specific distribution lists.
- Load Definitions. A way to load many users at once along with their distribution list subscriptions and security group assignments.
- Message Templates. The building blocks of the notifications you will send to your mobile endpoints, e.g. message template name, subject, body text, etc.
- Confirmation Requests. A response for your recipients to send back to you after receiving a notification. You can also configure an escalation notification based on the responses you receive.
- Notifications. The combination of your previous efforts: notifications are your configured message templates sent out to users who are housed in a distribution lists with certain permissions assigned to them at either the user or security group level and who may respond to your notification through a confirmation request, if you have configured it.
API Explorer Tour
The API Explorer is your window into InformaCast Mobile’s API. You can use it to:
- View the resources and attributes that InformaCast Mobile has to offer
- Craft API requests
- Review the information the API will provide based on your requests
- Place information (users, distribution lists, security groups, message templates, etc.) directly onto the InformaCast Mobile server without touching the web interface
When viewing the API explorer, you can see the resources and attributes available to you.
Resources are objects with associated attributes, relationships to other resources, and a set of methods that operate on them. Attributes are the building blocks of resources; they are comprised of the data you can affect. For example, users is a resource that is comprised of the following attributes: an unique ID, a name, whether the user’s account is locked and for how long, an email address, whether the user (if using the built-in Singlewire identity provider) must reset his password upon next login, and the unique ID associated with the load definition that created the user’s record, if applicable.
The set of methods for interacting with resources and attributes are the standard HTTP
verbs of POST
, GET
, PUT
, and DELETE
. These are housed in tabs underneath a resource’s attributes along with a description of your action, the fields available for your request, the HTTP URI associated with your API request, and the response your API request generates once click the GET, POST, PUT, or DELETE buttons.
Using the GET tab of the users resource as an example, a description of your action is “Get one resource by id or an array of resources by filtering attribute with GET.” Leaving all of the fields on the GET
tab blank and clicking the GET button, returns a list of all of your users. You can also see that the path parameter for your API request is /users
.
A full API request could then be crafted from this information: https://api.icmobile.singlewire.com/api/v1/users
. Pasting this along with a URL-encoded authentication token query parameter into a web browser would also yield a list of your users, without the nice formatting of the JSON response you get in the API Explorer.
Along with the application and resource path and perhaps query parameters for pagination and search, you can also see the API’s version number, v1
, which must appear in your API requests:
https://api.icmobile.singlewire.com/api/v1/
As new API versions are made available, you can update your API requests to adopt the newer version. Any unmodified API requests will continue to reach older versions; however, they may eventually be deprecated and retired.
Sign into the API Explorer and familiarize yourself further by using the other resources, attributes, and methods.
Helpful Clients
The InformaCast Mobile API is built on a set of RESTful standards. You will want to find or use a familiar REST client for your programming language of choice. If you don’t already have a preferred REST client, here are a few suggestions to get you started:
- Java
- Ruby
- Python requests
- JavaScript/NodeJS
- Clojure
- Shell
Authentication
Authenticating with the API is how you prove that you should be able to use it, and authentication is controlled through submitting an authentication token with every API request you make. This token is associated with a user, that user has permissions and security group memberships, and if the permissions and memberships allow it, your API request is processed.
How you create a token depends on the kind of application you are building:
User Interface Application. If your application has a user interface, you can embed a web browser and configure it to use the login mechanism provided by the InformaCast Mobile REST API server. The InformaCast Mobile token provider interface is responsible for logging in users through an identity provider associated with their InformaCast Mobile accounts, which results in an authentication token for your application to use when making requests on behalf of that user. For iOS applications, the Google Toolbox for Mac OAuth 2 Controller works well for providing the login interface and pairs naturally with their HTTP Fetcher for wrapping REST API requests to supply the authentication token. This is the preferred approach for obtaining an authentication token within your application because it allows the application to act on behalf of the specific user who has logged in with it.
Headless Application. If your application runs in the background, with no opportunity for user interaction, you need to create a permanent token through the administrative interface and store it securely within your application. If a single copy of your application is available as a service over the Internet to your users, you can manage this process entirely in-house. If you distribute copies of your application for your users to configure and run for themselves, your installation and configuration interface will need to provide a way for your users to store their own permanent tokens, and your documentation will need to explain how they will obtain them. Because of security concerns, you should never create or use permanent tokens unless you have no alternative.
Either kind of token grants access to InformaCast Mobile, so it is important to keep it secure. This is particularly important for permanent tokens, because if such a token must be revoked due to a compromise, you will need to update your shared web application, or tell your clients to update their configured token.
Create a Token for Experimentation
If you just need a token suitable for experimental exploration of the API, use the following steps.
- Open a web browser and go to the API Explorer. The API Explorer page appears.
Click the Login link at the top of the page. The InformaCast Mobile Login page appears.
Log in. Once you have successfully logged in, you are returned to the API Explorer and the authentication token assigned to you for that browser session is displayed in the field to the right of the Resources dropdown menu (highlighted in the following picture).
Copy and paste this token into the commands that you want to try out against the API. See Use the Token for more information.
As noted in Authentication, if you are building an application that will interact with the API on behalf of an interactive user, you will want to embed a web browser and direct the user to the InformaCast Mobile login interface. Use query parameters to inform the API that your user is logging in within your application through the client ID and client secret assigned to your application.
Since the implementation of an OAuth2 login is complex, try building on top of an open-source solution, such as the Google Toolbox for Mac OAuth 2 Controller. This is the approach used in-house at Singlewire. The documentation for the library will explain how your client information is configured and how the token is obtained at the end of a successful login process. Even if you plan to roll out your own OAuth 2 client implementation from scratch, the source and documentation of a library like this will be a valuable resource.
Create a Permanent Token
If you need a token to be embedded permanently in an application that runs in a headless mode (i.e. without the ability to ask a user to periodically log in for it and which needs to stay logged in), you will need to create a permanent token for it. (Or, as noted in Authentication, your clients can do so, and paste the token into your application’s configuration interface, if the application will be logging in on their behalf.)
Use the following steps to create a permanent token.
- Open a web browser and go to InformaCast Mobile’s web interface.
- Create a user with an appropriate set of permissions to meet the needs of your application.
Click the Users dropdown menu and go to Manage Users | user’s Name link | User Tokens tab. The Edit User Details page appears, displaying the contents of the User Tokens tab.
Click the Add button. The Add Token pop-up window appears.
Enter a name for your token in the Name field, e.g. InformaCast Mobile Plugin.
Click the Save button. The Generated Security Token pop-up window appears.
Copy and paste the token from the Generated Security Token pop-up window into your source code editor or application configuration window in order to embed it for future use.
Click the Done button. You are returned to the Edit User Details page and you can see your newly added token.
Manually generated tokens, like the one you just created, have no expiration date.
Use the Token
The examples in this section show how to retrieve the
Session
resource, which contains information about the login session associated with the authentication token.
As specified by OAuth 2’s Bearer Token Usage principles—on which the API relies—there are three methods for providing authorization for a request:
These methods are listed in decreasing order of convenience and preference. Wherever possible, the Authorization header method should be used. The other two methods are fallbacks for cases where that is simply not possible, and the final approach (e.g. URI query parameter) should only be used in testing and development contexts.
Authorization Header
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/session"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
print(requests.get(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/session"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
puts(JSON.parse(HTTParty.get(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/session" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
A token may be passed via an Authorization request header field as defined by RFC2617. Additional details and guidelines can be found here. Using an Authorization header is the preferred method, and should be used whenever possible.
Form-encoded Body Parameter
curl "https://api.icmobile.singlewire.com/api/v1/session" \
-d "access_token=S35QCVBN6S6TUQKHOND%3D"
# When using a client library, the authentication
# header is taken care of for you, so there is no
# need to use a body parameter.
# When using a client library, the authentication
# header is taken care of for you, so there is no
# need to use a body parameter.
A token may be passed in the form body so long as the request is single-part and uses the x-www-form-urlencoded
Content-Type. Additional criteria and guidelines can be found here. This approach can be used when it is not possible for you to set the Authorization header, as long as the other criteria are met. As discussed in the IETF guidelines, it is not possible to use this approach with the HTTP GET
method.
URI Query Parameter
curl "https://api.icmobile.singlewire.com/api/v1/session?access_token=S35QCVBN6S6TUQKHOND%3D"
# When using a client library, the authentication
# header is taken care of for you, so there is no
# need to use a body parameter.
# When using a client library, the authentication
# header is taken care of for you, so there is no
# need to use a body parameter.
A token may be specified as an encoded query parameter and must be properly separated from additional query parameters using the &
character. Additional details and guidelines can be found here. This method should be used as a last resort, when neither of the other methods are possible, because it suffers from security deficiencies even when used with all the Cache-Control
headers recommended by the guidelines.
Assuming the token was valid, all three of the above methods would return something like the following:
{
"accessToken": "S35QCVBN6S6TUQKHOND=",
"userId": "723f0df0-25ff-11e3-bb04-2a16fd5e656f",
"providerId": "a8105c2c-8e15-11e5-800a-efb9f24b4331",
"providerName": "Yoyodyne",
"email": "sallie.chin@yoyodyne.com",
"name": "Sallie Chin",
"isFusion": true,
"isLicenseValid": true,
"idleTimeout": 90,
"idleTimeoutCustom": true
}
Choosing an acting Domain
Once you have created any Domains, all API requests are interpreted in the context of a particular Domain, described as the “Acting Domain.”
To specify the Domain in which a particular request should operate,
you supply the desired Domain id
value either as the request header
x-singlewire-domain
, or as the request parameter domain
(the
request parameter can either be a query parameter in the URL of any
request, or a body parameter for requests using HTTP methods other
than GET
).
If you do not specify a value for either the x-singlewire-domain
request header or the domain
request parameter, the first Domain
available to the user making the request, from a list sorted by Name
Path, will be assumed.
If you specify both the request header and the request parameter, the
domain
request parameter value will be used, and the
x-singlewire-domain
header will be ignored. This allows the header
to specify a longer-lived acting context, while special requests can
occasionally act in a different Domain by adding the request
parameter.
If the user associated with the request’s authentication token is not permitted to act in the specified Domain (or in the root Domain, if none was specified), the request will fail with a validation error.
Quick Start
Jump right in and learn the basic tenets of InformaCast Mobile.
InformaCast Mobile allows you to add users to its system, group these users into distributions lists, assign them permissions (such as read/write access for creating notifications), send them notifications comprised of message templates (or allow them to trigger notifications from their iOS or Android devices), and allow them to respond to their notifications through confirmation requests.
The following sections walk you quickly through the steps of sending a notification:
Create Your First User
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/users"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'email': 'craig.smith@acme.com',
'name': 'Craig Smith'
}
try:
user = requests.post(url, headers=headers, data=json.dumps(data)).json()
print(user)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/users"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'email': 'craig.smith@acme.com'
,
'name': 'Craig Smith'
}
begin:
user = JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body)))
puts(user)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/users" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"email": "craig.smith@acme.com", \
"name": "Craig Smith"}'
# This is a thin wrapper around rest-client;
# details on other ways you can use it are in
# http://www.rubydoc.info/github/rest-client/rest-client
{
"lock": null,
"name": "Craig Smith",
"securityGroups": [ ],
"passwordResetRequired": false,
"createdAt": "2014-08-13T20:33:53.262Z",
"email": "craig.smith@acme.com",
"permissions": ["delete", "put", "get"],
"subscriptions": [ ],
"id": "2400c8e0-2329-11e4-8e47-685b358ea847"
}
Create a user named Craig Smith
. Start him with nothing but the most basic permissions.
Create Your First Distribution List
# Continuing the previous example:
try:
dist_list = requests.post(url, headers=headers, data=json.dumps(data)).json()
print(dist_list)
except RequestException as e:
print('Unexpected error!', e)
# Continuing the previous example:
begin:
dist_list = JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body)))
puts(dist_list)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/distribution-lists" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"name": "To Just Craig Smith"}'
{
"permissions": ["delete", "put", "get"],
"createdAt": "2014-08-13T20:40:38.627Z",
"id": "159e9330-232a-11e4-8e47-685b358ea847",
"name": "To Just Craig Smith"
}
In order for Craig Smith to receive a notification, he must first belong to a distribution list.
Create a distribution list named To Just Craig Smith
.
Subscribe a User to a Distribution List
# Continuing with the user and distribution
# list objects from the previous example:
try:
sub = requests.post(url, headers=headers, data=json.dumps(data)).json()
print(sub)
except RequestException as e:
print('Unexpected error!', e)
# Continuing with the user and distribution
# list objects from the previous example:
begin:
sub = JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body)))
puts(sub)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/users/2400c8e0-2329-11e4-8e47-685b358ea847/subscriptions" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"distributionListId": "159e9330-232a-11e4-8e47-685b358ea847"}'
{
"permissions": ["delete", "put", "get"],
"user": {
"createdAt": "2014-08-13T20:33:53.262Z",
"id": "2400c8e0-2329-11e4-8e47-685b358ea847",
"email": "craig.smith@acme.com",
"name": "Craig Smith"
},
"distributionList": {
"createdAt": "2014-08-13T20:40:38.627Z",
"id": "159e9330-232a-11e4-8e47-685b358ea847",
"name": "To Just Craig Smith"
},
"createdAt": "2014-08-13T20:42:08.689Z",
"distributionListId": "159e9330-232a-11e4-8e47-685b358ea847",
"id": "4b4cf210-232a-11e4-8e47-685b358ea847",
"userId": "2400c8e0-2329-11e4-8e47-685b358ea847"
}
Notifications are sent to distribution lists that may contain one or many users. In order for Craig Smith to get any notifications, he must belong to a distribution list.
Once subscribed, Craig Smith
will now receive any notifications sent to that distribution list. Notice that this request contains the id
values that were assigned to both of the resources you created in the first two sections. The user ID is part of the resource path to the subscription, and the distribution list ID is a POST
parameter in the request body.
Register a User’s Device
# Continuing with the user object from the
# previous example:
try:
reg = requests.post(url, headers=headers, data=json.dumps(data)).json()
print(reg)
except RequestException as e:
print('Unexpected error!', e)
# Continuing with the user object from the
# previous example:
begin:
reg = JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body)))
puts(reg)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/users/2400c8e0-2329-11e4-8e47-685b358ea847/devices" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"type": "Android", \
"name": "Android Nexus Fire 2", \
"deviceIdentifier": "APA91bFpOikKATC523g5Z_4-1puPNa_oE8t1sTzEwlfWKE0jFH-TvjAmFL_1ZkSCq7VGNA6dGn3jDQ5BsdZAf"}'
{
"permissions": ["delete", "put", "get"],
"createdAt": "2014-08-06T16:54:23.115Z",
"deviceIdentifier": "APA91bFpOikKATC523g5Z_4-1puPNa_oE8t1sTzEwlfWKE0jFH-TvjAmFL_1ZkSCq7VGNA6dGn3jDQ5BsdZAf",
"type": "Android",
"name": "Android Nexus Fire 2",
"disabled": false,
"id": "511795b0-1d8a-11e4-a054-3c970e7ff560",
"userId": "685c2400-dd09-11e3-8c49-b8e856327746"
}
Craig Smith wants to receive push notifications on his Android Device. Depending on the push notification service being used (e.g. APNS, GCM, SMS, etc.), different types of identifier information are needed to register the device.
Add a Confirmation Request
# Continuing the previous example:
try:
conf_req = requests.post(url, headers=headers, data=json.dumps(data)).json()
print(conf_req)
except RequestException as e:
print('Unexpected error!', e)
# Continuing the previous example:
begin:
conf_req = JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body)))
puts(conf_req)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/confirmation-requests" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"name": "Are you there?", \
"options": ["Yes", "No"]}'
{
"permissions": ["delete", "put", "get"],
"escalationRules": [ ],
"createdAt": "2014-08-13T21:35:07.728Z",
"id": "b227cd00-2331-11e4-8e47-685b358ea847",
"options": ["Yes", "No"],
"name": "Are you there?"
}
Message templates contain the building blocks of the notifications you will send to your users. Confirmation requests are one of those building blocks, and allow you to configure a response for your users to send back to you after receiving a notification. You can also configure an escalation notification to be sent if enough responses aren’t received.
Craig Smith will need to respond to his notification, so you will create a confirmation request before adding it to your message template.
This confirmation request allows Craig Smith to respond with Yes
or No
.
Create the Message Template
# Continuing with the confirmation request
# and distribution list objects from the previous
# example:
try:
template = requests.post(url, headers=headers, data=json.dumps(data)).json()
print(template)
except RequestException as e:
print('Unexpected error!', e)
# Continuing with the confirmation request
# and distribution list objects from the previous
# example:
begin:
template = JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body)))
puts(template)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/message-templates" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"name": "For Craig Smith Only", \
"subject": "Hello, Craig. Are you there?", \
"body": "Please confirm you are present.", \
"confirmationRequestId": "b227cd00-2331-11e4-8e47-685b358ea847", \
"distributionListIds": ["159e9330-232a-11e4-8e47-685b358ea847"]}'
{
"distributionListIdsCustomizable": false,
"subject": "Hello Craig. Are you there?",
"distributionListIds": ["159e9330-232a-11e4-8e47-685b358ea847"],
"confirmationRequestIdDisplay": "auto",
"bodyDisplay": "auto",
"audioDisplay": "auto",
"name": "For Craig Smith Only",
"imageCustomizable": false,
"subjectCustomizable": false,
"confirmationRequestIdCustomizable": false,
"image": 0,
"imageDisplay": "auto",
"audioCustomizable": false,
"audio": 0,
"confirmationRequestId": "b227cd00-2331-11e4-8e47-685b358ea847",
"createdAt": "2014-08-13T21:35:57.500Z",
"permissions": ["delete", "put", "get"],
"distributionListIdsDisplay": "auto",
"subjectDisplay": "auto",
"body": "Please confirm you are present.",
"id": "cfd267c0-2331-11e4-8e47-685b358ea847",
"distributionLists": [
{
"createdAt": "2014-08-13T20:40:38.627Z",
"id": "159e9330-232a-11e4-8e47-685b358ea847",
"name": "To Just Craig Smith"
}
],
"confirmationRequest": {
"escalationRules": [ ],
"createdAt": "2014-08-13T21:35:07.728Z",
"id": "b227cd00-2331-11e4-8e47-685b358ea847",
"options": ["Yes", "No"],
"name": "Are you there?"
},
"bodyCustomizable": false
}
You now have all the pieces you need to create a message template.
Message templates require a name (For Craig Smith Only
) and subject (Hello Craig. Are you there?
).
You should also supply the id
of the confirmation request you created, and a list containing the id
of the distribution list you created.
Send the Notification
# Continuing with the message template object
# from the previous example:
try:
sent = requests.post(url, headers=headers, data=json.dumps(data)).json()
print(sent)
except RequestException as e:
print('Unexpected error!', e)
# Continuing with the message template object
# from the previous example:
begin:
sent = JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body)))
puts(sent)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/notifications" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"messageTemplateId": "cfd267c0-2331-11e4-8e47-685b358ea847"}'
{
"recipientCount": 1,
"permissions": [
"delete",
"put",
"get"
],
"messageTemplateId": "b227cd00-2331-11e4-8e47-685b358ea847",
"messageTemplate": {
"imageDisplay": "auto",
"userIdsDisplay": "auto",
"imageCustomizable": false,
"name": "For Craig Smith Only",
"audioDisplay": "auto",
"createdAt": "2015-03-09T21:57:41.199Z",
"distributionListIds": [
"159e9330-232a-11e4-8e47-685b358ea847"
],
"subjectCustomizable": false,
"confirmationRequestIdCustomizable": false,
"distributionListIdsCustomizable": false,
"bodyDisplay": "auto",
"confirmationRequestId": "4ec6ffa0-c6a7-11e4-b374-de9e84057a63",
"userIdsCustomizable": false,
"id": "4ecf15f0-c6a7-11e4-b374-de9e84057a63",
"bodyCustomizable": false,
"distributionListIdsDisplay": "auto",
"subjectDisplay": "auto",
"audioCustomizable": false,
"body": "Please confirm you are present.",
"confirmationRequestIdDisplay": "auto",
"subject": "Hello Craig. Are you there?"
},
"smsReceived": 0,
"confirmationResults": {
"Yes": 0,
"No": 0
},
"initiator": {
"createdAt": "2014-05-29T15:41:37.010Z",
"id": "b8301520-e747-11e3-b541-c82a144feb17",
"lock": {
"end": null,
"start": null
},
"passwordResetRequired": false,
"name": "James Elliott",
"email": "james.elliott@singlewire.com"
},
"createdAt": "2015-03-09T21:57:41.247Z",
"distributionListIds": [
"4eb35090-c6a7-11e4-b374-de9e84057a63"
],
"confirmationRequestId": "b227cd00-2331-11e4-8e47-685b358ea847",
"smsSent": 0,
"id": "4ed668f0-c6a7-11e4-b374-de9e84057a63",
"imageMimeType": null,
"confirmationRequest": {
"escalationRules": [ ],
"createdAt": "2015-03-09T21:57:41.146Z",
"id": "b227cd00-2331-11e4-8e47-685b358ea847",
"options": [
"Yes",
"No"
],
"name": "Are you there?"
},
"image": 0,
"audio": 0,
"distributionLists": [
{
"createdAt": "2015-03-09T21:57:41.017Z",
"id": "4eb35090-c6a7-11e4-b374-de9e84057a63",
"name": "To Just Craig Smith"
}
],
"body": "Please confirm you are present.",
"userIds": null,
"readCount": 0,
"subject": "Hello Craig. Are you there?",
"initiatorId": "b8301520-e747-11e3-b541-c82a144feb17"
}
Creating a notification is the same as sending it. It will be delivered to all users’ registered devices who are subscribed to the distribution list(s) associated with the notification.
There are various counters in the Notification object which can be checked over time to monitor the progress as users read (and, if there is an attached confirmation request, respond to) it.
Change Log
To view or subscribe to upcoming API changes, check out the API Developer Announcements.
Changes from 2023-09-20
- The Site Buildings resource has a new
skipAddressValidation
attribute which can be used to forcibly specify building address components (which must include accurate latitude and longitude) when there is a problem with the Google Maps data which is used to validate addresses.
Changes from 2023-08-09
- BREAKING CHANGE As of ICOP 14.17.1, on-premise resources such as MT, RG, etc. will no longer have their numeric ID’s associated with
cloud resources. This affects usage of the
assoc-sync-state
,assoc-sync-state-ids
,assoc-sync-state-for-endpoint
query params. Users can now fetch these resources on-prem via their /Fusion/v1/* API’s using the new UUID id field. See table below for the complete list of new /Fusion/v1/ API’s available, and the InformaCast API docs for more info.
Old | New |
---|---|
/V1/ActivationGroups | /Fusion/V1/ActivationGroups |
/V1/Admin/Telephony | /Fusion/V1/Admin/Telephony |
/V1/Admin/TtsLexicon | /Fusion/V1/Admin/TtsLexicon |
/V1/Admin/TtsVoices | /Fusion/V1/Admin/TtsVoices |
/V1/Bells | /Fusion/V1/Bells |
/V1/Endpoints | /Fusion/V1/Endpoints |
/V1/Messages | /Fusion/V1/Messages |
/V1/Plugins/NightBell | /Fusion/V1/Plugins/NightBell |
/V1/RecipientGroups | /Fusion/V1/RecipientGroups |
/V1/ScheduledBroadcasts | /Fusion/V1/ScheduledBroadcasts |
Changes from 2023-06-28
- BREAKING CHANGE Changed the behavior of
/extensions/*/endpoints
, now endpoints that haven’t reported build-info yet will not be included in the list. New qpinclude-pending
can be used to restore prev behavior. - BREAKING CHANGE The extension endpoints API has been changed to no longer return endpoints that have not registered their build information yet.
New
?include-pending=true
query parameter added which can restore previous functionality, if desired. - New alarm added,
fusion-delta-sync-error-event
. createdAt
/updatedAt
fields added to the following resources:- Activation Groups
- Bell Schedules
- CUCM Cluster Fusion Servers
- CUCM Clusters
- Clear Device Schedules
- Device Groups
- Distribution Lists
- Extension Endpoints
- Extensions
- Failover Pairs
- Message Templates
- Ring Lists
- Scheduled Notifications
- Security Group Members
- Subscriptions
- Text-to-Speech Defaults
- Text-to-Speech Lexicons
- Text-to-Speech Voices
Exposed
syncId
on Clear Device Schedules.BREAKING CHANGE Editing the backup endpoint of the failover pair, deleting the failover pair itself, or deleting the primary endpoint of a failover pair result in a factory reset of the backup endpoint. The factory reset occurs to prevent unexpected behavior if a backup endpoint becomes a standalone or primary endpoint.
- Routes affected:
PUT /failover-pairs/{failoverPairId}
DELETE /failover-pairs/{failoverPairId}
DELETE /extension/{fusionExtensionId}/endpoints/{primaryEndpointId}
- Routes affected:
Changes from 2023-05-16
BREAKING CHANGE
- In the 2023-02-22 API release, the
contacts
attribute was added to thesites_buildings
resource. In a future release, it was to be used for contacting emergency services. That field will no longer be needed. The 2023-05-16 release will remove the attribute. If you have put any data in this attribute (despite the lack of access to it from the Administration Console), that data will be discarded.
Added
- Scenarios can now be configured to automatically call emergency services when they are initiated (if this feature has been purchased for your organization).
- New attributes have been added to Site Buildings to support the new emergency calling feature.
- When previewing simulated answers for a
scenario, it is now possible to use the new
checkPanicRange
query parameter to determine whether a given latitude and longitude is within a one-mile range of a building with emergency calling enabled. This range is required to automatically initiate a response from emergency services when initiating a panic button scenario that also has emergency calling enabled. - When sending scenarios with emergency calling enabled, the Scenario
Notification resource will use a new
emergencyAction
attribute to report whether the process of contacting emergency services has been initiated. - When an Incident is created from a scenario with
emergency calling enabled, a new
emergencyCallingStatus
attribute reflects the latest update reported by the emergency services integration provider. - New fields have been added to the Load
Definitions resource to support integrations
with SISs (Student Information Systems) that support the OneRoster
format. Unless a provider has had these loaders enabled, adding
loaders of the
sis
type with these fields will be disabled. Contact Singlewire Sales/Support if you need this feature. Additionally, connections between SCIM Groups created by these loaders and Distribution Lists are now enabled through a new field on the latter.
Changes from 2023-02-22
Changed
BREAKING CHANGE As announced last fall, there is a significant
change to the way that site information is communicated for scenarios.
This was previously implemented using a single site
field which
could be answered with a site ID or name. To improve consistency, and
to add support for more detailed location information, site
fields
are being removed from scenarios, and instead a location
object will
be submitted when creating scenario notifications. This location
object will at minimum contain a site
object specifying the site ID,
but can also contain building
, floor
, and zone
objects (again,
specifying their IDs) for increasing levels of detail.
Rather than using a site
field, scenarios will indicate that they
support location information with a new locationEnabled
boolean
attribute. When locationEnabled
is true
, the text that clients
should use to prompt for location information will be configured using
the new attribute locationQuestionName
, and a backwards-compatible
variable in which a summary of the location
object will be made
available for customizing notification text will be configured using
the new attribute locationVariable
. Default answers for site,
building, floor, and zone can be configured using the new attributes
defaultSiteId
, defaultBuildingId
, defaultFloorId
, and
defaultZoneId
(an example of increased flexibility; previously it
was only possible to specify a default site).
Existing scenarios which have site
fields will be migrated
automatically to use locationEnabled
instead, and the values of
locationQuestionName
, locationVariable
, and defaultSiteId
will
be set up from the former site
question.
To offer backwards compatibility with older mobile clients, for
several releases after the switch to using location
a synthetic
site
question will be reported in the fields
response for any
location-enabled scenario. (This fake site
field can be recognized
because it is the only site
field that will exist in a scenario,
will have an id
of 55ca36de-4b3c-11ed-aeff-17a043a08a03
, and will
always have the highest rank
.) Clients that do not yet know how to
send the location
object will be able to continue sending this field
instead. Code that has been updated to send location
values must
filter out this question, since it is redundant with sending
location
, and attempts to send both location
and a site
field
will result in a validation failure. Applications should be updated to
send the more flexible location
object as soon as possible. A few
releases after location is supported, this backwards compatibility
mode will be removed: the synthetic site
question will stop
appearing in the fields
, and will no longer be accepted when sending
a scenario notificaiton.
NOTE We had previously planned on using a rank
of 0
for the
fake site
question, but this turned out to create compatibility
problems with older versions of some mobile apps, so we changed to
this approach for better compatibility during the transition period.
Even during the period of backwards compatibility, it will not be
possible to configure scenarios to have actual site
fields using the
scenarios API. The administrative web application will be updated to
use the new locationEnabled
and related attributes described above,
and any other integrations which directly manipulate scenario
resources will need to make the same changes.
Added
- There is a new License Acceptances resource which will be used to support separately-licensed features as they are released in the future.
Changes from 2022-12-14
Added
- When fetching site buildings, floors, and zones, it is now possible
to request that the names of parent resources (site, building,
and/or floor) be included in the response by supplying the query
parameter
include-parent-names
with the valuetrue
. - Site buildings can now have address information associated with them, and when this is supplied, their latitude and longitude will be calculated. Sites themselves will report the latitude and longitude of the centroid (geographic average) of any buildings whose geolocation is known.
- Roll Call resources as part of Incidents. Roll Call allows for updating statuses and locations of users during an incident.
- The Clear Devices Schedules resource has been added to the API to allow for a means of clearing on-premises device screens on a specified schedule. This is meant to make end users more aware of when they have received a notification by keeping their screens clear when a notification is not active.
Changes from 2022-11-02
Changed
- BREAKING CHANGE The
assoc-sync-state
query param across all supported resources no longer returns the last reported synced resource id. Instead, a new query param (assoc-sync-state-for-endpoint
) was added which will return the last reported sync state for a specific endpoint which will include the last reported sync id. - BREAKING CHANGE When listing Notifications, the resource no longer
returns information about attached Areas of Interest, Device Groups, Distribution Lists,
Outbound Systems, or Users, unless their respective query parameter (
includeAreasOfInterest
,includeDeviceGroups
,includeDistributionLists
,includeCollaborationGroups
, orincludeUsers
) is utilized. - DEPRECATION NOTICE
/sites/{siteId}/floors
is being replaced with/sites/{siteId}/buildings/{buildingId}/floors
and/sites/{siteId}/floors/{floorId}/zones
is being replaced with/sites/{siteId}/buildings/{buildingId}/floors/{floorId}/zones
. Any floors that already exist during this release will result in the creation of a building (“Main Building”) in that site which takes ownership of the floors. The backward-compatible APIs which do not include a building ID will work fine as long as there is at most one building in the site, and they will create a default building when creating a floor if the site has no buildings. Once multiple buildings per site are in use, only the new APIs will work reliably: the old APIs will non-deterministically choose a building ID, which will not work for looking up floors in other buildings. This also means that all users’ mobile clients must be upgraded to a current release before multiple buildings are created.
Added
- Added Site Building resource for managing buildings belonging to sites.
Changes from 2022-09-21
Changed
BREAKING CHANGE The Message Templates resource no longer returns an embedded notification profile, unless the query parameter
includeNotificationProfile
is supplied with a true value.There are two pairs of extensions which are now treated by the user interface as a single concept: the iOS and Android push extensions are jointly managed as InformaCast for iOS/Android, and the macOS and Windows push extensions are jointly managed as InformaCast for Mac/Windows. Because of this, granting or revoking a user or group permission to one of either pair will automatically grant or revoke permission to the other, and enabling or disabling an extension in either pair will automatically enable or disable the other.
Changes from 2022-08-10
Added
The Users resource now includes an attribute
tfaRemovalRequested
which causes the user’s two factor authentication to be deactivated on next login (available only for Providers configured to use InformaCast’s own Identity Provider for login).The Scenarios endpoint includes three new attributes: the string
winHotkeys
, which is used to specify a keyboard combination to send scenarios, and thesilentHotkey
boolean value (defaultfalse
) and stringcustomConfirm
, both of which are used to customize scenario-sending behavior.The Sites endpoint now has a new endpoint for Site Floors. See Site Floors for more details. This new endpoint has another endpoint for Site Floor Zones. See Site Floor Zones for more details.
The Sites endpoint now has a new endpoint for Site Role Recipients. See Site Recipients for more details.
The Site Roles endpoint now has a new endpoint for Site Roles Associated Sites. See Site Roles Associated Sites for more details.
The Sites endpoint includes a new request parameter: the boolean
includeFloorTotal
to list the total amount of floors the site has.
Changes from 2022-06-29
- Notification previews can be created using a new
draft
attribute when POSTing a Notification. It’s not actually sent to any recipients; it allows you to view the users and devices that would receive the notification were it to be sent. - When listing the Notification Devices
resource, requests can be filtered using the query parameters
deviceIdentifier
,type
, andtypes
. - The Notification Devices Response
includes a
user
object when theuserId
value is notnull
, which contains information about the user associated with the device as that user existed when the notification was sent (as preserved in the User Notifications table). - When listing the Notification Recipients
resource, requests can be filtered using the query parameters
confirmableOnly
andtypes
. - BREAKING CHANGE
activityCounts
have been removed from the Notification History Report. Please usenotificationProgress
instead.
Changes from 2022-06-01
Changed
- To make it easier to adjust to the removal of the
auto
choice in Message Template display settings, the default value when omitted is now automatically assigned eithershow
orhide
based on whether the corresponding field contains content, instead of requiring the appropriate value to be expicitly sent in thePOST
parameters. This is effectively now backwards compatible with the behavior prior to 2022-05-18, when it would default toauto
, even though that is no longer a valid option itself.
Changes from 2022-05-18
Changed
- BREAKING CHANGE As previously announced, there have been a number
of changes to the Message Template API to
simplify working with them and sending notifications.
- The
auto
choice is no longer available for any of the attributes which control the display of sections of the message template at send time (e.g.audioDisplay
). The only valid choices areshow
orhide
. Any formerauto
values were changed toshow
if the corresponding field in the Message Template contained content or if the corrensponding customizable setting (e.g.audioCustomizable
) wastrue
. If the attribute was empty and not customizable, its corresponding display attribute was set tohide
. - It is no longer possible to create or configure message templates
where the
display
attribute isshow
but there is no corresponding content and thecustomizable
attribute isfalse
. It will also be impossible to save a message template where an attribute has content but itsdisplay
value ishide
. - The
subjectDisplay
andbodyDisplay
attributes now always have the valueshow
, because it is no longer possible to hide these elements. They will be completely removed in a future release once there has been time to update all API clients. - The
alertToneDisplay
,ttsCustomContentDisplay
, andttsVoiceIdDisplay
attributes will no longer have their own independent values, they are controlled by the value ofaudioDisplay
. For any existing templates, ashow
value for any of these four attributes (after following the rules above for migration of formerauto
values) resulted inaudioDisplay
being set totrue
. - It is no longer possible to save Message Templates where
alertToneDisplay
,ttsCustomContentDisplay
, orttsVoiceIdDisplay
has a value that differs fromaudioDisplay
(attempts to set any of these values other thanaudioDisplay
will be rejected). In a future release all butaudioDisplay
will be removed entirely, once there has been time to update all API clients. - The
optOut
,metaData
, andmetadataCustomizable
attributes are no longer supported, and have been removed. Please use theisSubscribable
feature in Distribution Lists to replace the opt-out feature in Message Templates. - The User Message Templates resource,
which was tied to the removed
optOut
attribute, no longer returns any values. In a future release it will be removed entirely, once there has been enough time for all API clients to be updated. - The Opted Out Report no longer returns any values. In a future release it will be removed entirely, once there has been enough time for all API clients to be updated.
- The
- The Notification Profiles resource has a
new read-only attribute,
default
, which indicates whether a notification profile is the default to be used with Message Templates that do not specify a different one. - The Notification Profiles resource has a
new attribute,
includeMessageTemplates
, which can be set to true in any request to cause another new attribute,messageTemplates
, to be returned in the response, listing the IDs and names of all Message Templates that use it. - When
POST
ing a Notification, there is a new request attributeextensionSettingsOverrides
, which can be used to disable device extensions which were enabled in the Notification Profile. - The Scenarios API now supports integration scenarios, which is a new type of scenario merging the additional layer of removed scenario launchers into existing scenario types.
Removed
- BREAKING CHANGE The
Scenario Launchers
resource has been removed.
Changes from 2022-02-23
Deprecated
- BREAKING CHANGE In an upcoming release (likely in the spring of 2022) there will be a number of changes to the Message Template API to simplify working with them and sending notifications.
- The
auto
choice will no longer be available for any of the attributes which control the display of sections of the message template at send time (e.g.audioDisplay
). The only valid choices will beshow
orhide
. Any existingauto
values will be changed toshow
if the corresponding field in the Message Template contained content or if the corrensponding customizable setting (e.g.audioCustomizable
) wastrue
. If the attribute was empty and not customizable, its corresponding display attribute will be set tohide
. - It will no longer be possible to create or configure message templates where the
display
attribute isshow
but there is no corresponding content and thecustomizable
attribute isfalse
. It will also be impossible to save a message template where an attribute has content but itsdisplay
value ishide
. - The
subjectDisplay
andbodyDisplay
attributes will now always have the valueshow
, because it is no longer possible to hide these elements. They will be completely removed in an even later release once there has been time to update all API clients. - The
alertToneDisplay
,ttsCustomContentDisplay
, andttsVoiceIdDisplay
attributes will no longer have their own independent values, they will be controlled by the value ofaudioDisplay
. For any existing templates, ashow
value for any of these four attributes (after following the rules above for migration of formerauto
values) will result inaudioDisplay
being set totrue
. - It will no longer be possible to save Message Templates where
alertToneDisplay
,ttsCustomContentDisplay
, orttsVoiceIdDisplay
has a value that differs fromaudioDisplay
. In a future release all butaudioDisplay
will be removed entirely, once there has been time to update all API clients. - The
optOut
,metaData
, andmetadataCustomizable
attributes are no longer supported, and will be removed immediately. Please use theisSubscribable
feature in Distribution Lists to replace the opt-out feature in Message Templates. - The User Message Templates resource, which was tied to the removed
optOut
attribute, will no longer return any values. In a future release it will be removed entirely, once there has been enough time for all API clients to be updated. - The Opted Out Report will no longer return any values. In a future release it will be removed entirely, once there has been enough time for all API clients to be updated.
- The
Added
- The Notifications API now supports date/time variables which can be used in the subject/body/tts custom content. An additional
raw
query param on GET requests was also added to return the subject/body back in its original form before the date/time variables were substituted. - Added a new Settings API resource for configuring globally preferred timezone/locale.
Changes from 2021-12-15
Removed
- BREAKING CHANGE As was announced on 2021-11-03, lockStart and lockEnd values for Users are no longer supported. User locks can be modified using isLocked instead.
Changes from 2021-11-03
Added
- The Scenario response now includes
type
,phoneNumber
andinstructions
, which provides support for the new Panic Button scenarios using the/scenarios
endpoint.
Changed
- BREAKING CHANGE The locking system for Users has changed.
- lockStart and lockEnd will be replaced by the boolean isLocked.
- Existing user locks will be automatically converted to booleans. Current lockEnd dates will be ignored and users will now need to be unlocked manually.
- New lockStart dates are still accepted and will be converted to isLocked automatically. However, this is highly discouraged as support for lockStart will be removed completely in the next release.
- Do not attempt to lock or unlock users during the release window. Any locks added may be lost.
Removed
- BREAKING CHANGE As was announced on 2021-09-22, the user type
unauthenticated-desktop
is no longer supported. These API endpoints will not accept it as a valid filtering parameter:
Changes from 2021-09-22
Deprecated
- BREAKING CHANGE As of the next release (currently scheduled for November 2021) the endpoints and filters associated
with unauthenticated user registration (for Cloud IDNs) will be removed.
- The user type
unauthenticated-desktop
associated with unauthenticated users will be removed - User and User Device filtering will no longer accept or return users of type
unauthenticated-desktop
- The user type
Changes from 2021-08-04
Added
- The Pagination Parameters now support an
include-total
query param. - The
TelephonyNumbers
report has new attributesserviceProvider
andtype
. - The following resources can now be copied using a
/clone
endpoint:- Bell Schedules
- Confirmation Requests
- Device Groups
- Distribution Lists
- Message Templates
- Notification Profiles
- Ring Lists
- Scenarios
- Scheduled Notifications
- Security Groups
Changed
- BREAKING CHANGE The
number
attribute in theTelephonyNumbers
report has been renamedphoneNumber
.
Changes from 2021-06-30
Added
- The
include-counts
query param under the CUCM Clusters has been removed. Please useinclude-total
instead. - The
include-counts
query param under the CUCM Cluster Fusion Servers has been removed. Please useinclude-total
instead. - BREAKING CHANGE The
isCampaignNumber
attribute in theTelephonyNumbers
report has been removed, as that concept no longer exists. - The
Incident Plans
andIncidents
resources. Each have various subresources and both are Domain-enabled. - The
Confirmation
report to view a list of all notification confirmation responses over a period of time.
Changed
- The Users documentation now includes the description of application types supported by the API. A new user type -
unauthenticated-desktop
- is also documented. - A new user device type -
WNS
- is now supported by the User Devices API.
Deprecated
- BREAKING CHANGE The
isCampaignNumber
attribute in theTelephonyNumbers
report will be removed, as that concept will no longer be relevant. At the same time, thenumber
attribute will be renamedphoneNumber
, and some new attributes will be added.
Removed
- BREAKING CHANGE The
TelephonyUsage
,TelephonyTotalSpent
,TelephonyStatus
,TelephonyBalanceAdjustments
, andDailyTelephonyBalance
reports have been removed. - BREAKING CHANGE The
usage
key under theNotificationHistory
has been removed.
Changes from 2021-05-12
Added
- The Message Template response and
Notification response now include
audioFiles
andimageFiles
arrays, which provide a superset of the information that was previously available in theaudio
,image
, andimageMimeType
attributes. Those older attributes are now redundant, and will likely be deprecated and removed in future releases. - The User Devices response now includes
a new
updatedAt
attribute which specifies the timestamp of the last update to a device’s registration record. - A new endpoint is added to allow direct access to all user devices: User Devices - Direct Access.
Changed
- BREAKING CHANGE As mentioned in the change log for the previous release, requests for image and audio data now involve redirection to AWS CloudFront content distribution network nodes geographically closer to the origin of the request, for improved performance.
BREAKING CHANGE As previously announced, GET requests to /areas-of-interest will return mobile and desktop devices. To maintain existing functionality, requests must specify only
syncedDeviceTypes=mobile
in the new syncedDeviceTypes parameter. Requests specifyingsyncedDeviceTypes=desktop
are also valid, as discussed in the AOIs endpoint.BREAKING CHANGE As was announced earlier (Changes from 2020-12-09), it is no longer possible to convert regular user accounts to application or endpoint accounts; application and endpoint accounts can no longer belong to security groups or to have direct permissions (with the exception of custom applications - those still can have direct permissions and be members of security groups.)
Changes from 2021-04-14
Added
- Cisco Unified Communications Manager Cluster Configurations
- Cisco Unified Communications Manager Cluster Server Specific Configurations
Updated
- BREAKING CHANGE All HTTP clients will need to support HTTP Status 302: Redirect responses, and to follow the redirect.
- BREAKING CHANGE All Advanced/Fusion Server installations will need to have network access to Amazon’s AWS CloudFront service.
- BREAKING CHANGE The
convert=pcm
query parameter for converting the audio format when retrieving audio files is deprecated, because it is no longer necessary (as described below), and will stop being supported in a future release. - BREAKING CHANGE
data
andlog
keys on Load Request responses have been removed. Associated data can be found on new/content
and/log
subresources respectively. - BREAKING CHANGE Previously, a parent resource path could be called with the appropriate object ID in the body of a
request, e.g. curl -X PUT -d ’{“id”: “
”}’ ’ . Correct requests must now specify the object ID as a path parameter, e.g. curl -X PUT ’/users/ /devices’ /users/ ./devices/ ’ - BREAKING CHANGE
GET
requests to/notifications
and/notifications/<notificationId>
will no longer return the entire associated Message Template. It will now only return the name of the Message Template (at the time the notification was sent). - The
content-type
header used when sending audio data has been corrected. It was previously a non-standard value which caused problems for some clients, and turned out to be the reason we needed to offer theconvert=pcm
query parameter. The value now returned,audio/wav
, allows the audio to be used without conversion everywhere it needs to be, so we are deprecating this query parameter (as noted above). - BREAKING CHANGE In our next release, GET requests to /areas-of-interest will return mobile and desktop devices. To
prepare for that change, a new
syncedDeviceTypes=mobile
parameter will be required to only return AOIs that should be synced only to mobile apps. When nosyncedDeviceTypes
are specified, all synced AOIs will be returned in the response.
Changes from 2020-12-09
Added
- Added /v1/brandings content section.
- Added documentation for
list
brandings,get
branding andput
branding requests. - Added
providerIdpId
attribute to users. - Added
includeIdp
query param to users. - Added
providerIdp
object to detailed user response. - Added the /users/:user-id/all-permissions resource to allow requesting all of a user’s permissions at once.
- Added the initiationDetails type ‘inbound-cap’ to the POST /notifications API.
- Added the POST /extensions/e1b2db4b-626a-11e7-a3f9-0de43455e890/proxy/cap/event endpoint to allow event-based CAP message processing.
- Added
verified
attribute to user devices. By default, this value will be set toFALSE
when adding devices for yourself andTRUE
when adding devices for other users. - Added
requiresOptIn
attribute to extensions. - Added Dynamic Replies to Confirmation Requests.
- Added Identity Providers resource.
- Added Self Service Subscriptions resource.
- Added
isSubscribable
attribute to Distribution Lists. By default, this value will be set toFALSE
when creating a new Distribution List. - Added User Profile resource.
Updated
- BREAKING CHANGE In our next release, all HTTP clients will need to support HTTP Status 302: Redirect responses to follow the redirect.
- BREAKING CHANGE In our next release, all Advanced/Fusion Server installations will need to have network access to Amazon’s AWS Cloudfront service.
- BREAKING CHANGE The date format change mentioned in the Changes from 2020-09-23 Updated section have been implemented.
- BREAKING CHANGE When creating devices for yourself, you must now verify email, phone-call, and SMS devices by responding to the message prompting you to verify the device.
- BREAKING CHANGE In order to get the value of
passwordResetRequired
(only for users that belong to the Cirrus IDP), you are now required to pass?includeIdp=true
as a query param in theGET
request. BREAKING CHANGE In order to make InformaCast Mobile more secure, in an upcoming release the following changes will be made that will prevent external application accounts from receiving permissions they do not require to perform their functions:
- It will no longer be possible to convert regular user accounts to application or endpoint accounts. PUT requests to
/users/:user-id
that effect such conversions will be rejected as invalid. The only exception will be made for cases when regular user accounts are converted to application accounts with application type set tocustom
. See Update a User for more details. - Application and endpoint accounts will no longer be allowed to belong to security groups or to have direct permissions.
POST requests to
/users/:user-id/security-groups
and/users/:user-id/permissions
will be rejected as invalid for users whose type isapplication
orendpoint
. The only exception will be made for application accounts whose application type iscustom
- that category of users will still be allowed to belong to security groups and to have direct permissions. See Add Permissions to a User and Place a User in a Security Group for more details.
- It will no longer be possible to convert regular user accounts to application or endpoint accounts. PUT requests to
Changes from 2020-09-23
Updated
- BREAKING CHANGE In an effort to better comply with official date and time standards, Singlewire
will be making a change to some API clients that perform date and time processing
for date and time fields. This change may break the backwards compatibility
of these API clients. Currently, the majority of date and time fields are in the
following format:
2020-06-23T23:06:22.828+0000
. With this change, InformaCast will instead use a proper ISO8601 date and time string. For example, InformaCast would return2020-06-23T23:06:22.828Z
instead of2020-06-23T23:06:22.828+0000
. This change will allow most languages to be able to parse date and time fields without issue (or custom processing). For most API clients, no changes will be necessary. For example, JavaScript’s built-in date parsing or libraries, such as moment.js, can handle both formats gracefully, and Java’s JodaTime library can do the same. If you have any custom date and time processing logic, please be sure to verify it can handle proper ISO8601 date and time strings before the format changes.
Changes from 2020-08-12
Added
Updated
- Added Excel spreadsheet data type to Load Requests section.
Changes from 2020-06-24
Added
Changes from 2020-05-13
Changed
Limits have been applied to particular resources restricting how many may be created. Affected (limits noted):
- Activation Groups
- Areas of Interest
- Bell Schedules
- Device Groups
- Distribution Lists
- Domains
- Extensions
- Message Templates
- Ring Lists
- Scheduled Notifications
Changes from 2020-04-01
Deprecated
- Requests to List All Load Requests will remove
tagsSeen
,unmappedTags
,log
, anddata
from the response. You will still be able to retrieve these attributes via Get a Load Request.
Added
Activation Groups and Device Groups have received new attributes that are used for managing a new type of devices - multicast-capable Poly® phones. When a provider’s license enables the use of Poly® phones, the phones have to be placed in activation groups in order to be grouped by distinct multicast address and port combinations.
To enable such grouping, the following new fields were added to the payloads of the requests for creating or updating Activation Groups:
multicastType
multicastAddress
multicastPort
The details of an activation group returned by the REST API now also include the
usedChannels
attribute that describes its relationship with device groups.In addition to activation groups, the multicast-capable devices have to be placed in device groups in order to be able to receive audio notifications. To support that, the payloads of the requests for creating or updating Device Groups now include the
activationGroupIds
attribute. The details of a device group returned by the REST API include the following new attributes:activationGroups
,multicastConfigs
.The details of a multicast-capable Device returned by the REST API will have an additional attribute that indicates which activation group it belongs to:
activationGroupId
.
Changed
- The fact that orphaned Collaboration Groups cannot be automatically deleted when deleting a Domain was clarified.
Changes from 2020-02-19
Removed
- Announced as deprecated in October last year, the
usableDomains
attribute in Session has now been removed. The same information can be obtained by requesting a user’s domains with thetransitive
andcompact
flags.
Added
- The Bell Schedules, Collaboration Groups, Device Groups and Ring Lists resources have been Domain-enabled, so there are new Domain Bell Schedules, Domain Collaboration Groups, Domain Device Groups, Domain Ring Lists, Bell Schedule Domains, Collaboration Group Domains, Device Group Domains, and Ring List Domains resources, and new query parameters and response attributes in Bell Schedules, Collaboration Groups, Device Groups, and Ring Lists themselves when Domains are in use.
Changes from 2019-12-16
Removed
- REST APIs associated with hybrid devices along with the
replay
audio option (only used for these devices) on Notification Profile Settings have been removed.
Added
- The Confirmation Requests resource has been Domain-enabled, so there are new Domain Confirmation Requets and Confirmation Request Domains resources, and new query parameters and response attributes in Confirmation Requests themselves when Domains are in use.
Changes from 2019-11-13
Deprecated
- The
replay
attribute on an InformaCast Device is now deprecated. This attribute was previously used only for hybrid devices (discontinued support for these Cisco IP Phones has been previously announced). In addition to removal of this Notification Profile Settings attribute, full REST API support for hybrid devices (i.e./V1/Devices/hybridDevices
) via the Fusion Server extension will also be removed.
Removed
- The
Scheduled Notifications Activities
resource has been removed.
Changes from 2019-10-30
Added
- Added a
syncId
field to Message Templates, Bell Schedules, Ring Lists, Distribution Lists, and Device Groups (for Singlewire use only, API consumers should not use or rely on this value, nor assume that it will continue to exist). - Added
type
,isLicensed
, andaxlError
fields to additions and exclusions for Device Groups, Activation Groups, and Licenses. - Domain Users can now be filtered by
type
query parameter, just like the raw Users resource. - The Message Templates, Notifications, and Notification Profiles resources have been Domain-enabled, so there are new Domain Message Templates, Domain Notifications, Domain Notification Profiles, Message Template Domains, Notification Domains, and Notification Profile Domains resources, and new query parameters and response attributes in Message Templates, Notifications, and Notification Profiles themselves when Domains are in use.
- When deleting a Domain it is now possible to specify that orphaned resources should be promoted to the parent domain instead of deleting them.
Changed
- OPTIONS requests now return a 204 status code instead of a 200.
Deprecated
usableDomains
in Session is now deprecated and will be removed soon. The same information can be obtained by requesting a user’s domains with thetransitive
andcompact
flags.- The
Scheduled Notifications Activities
resource is deprecated and is scheduled to be removed on 2019-11-13.
Alarms
Alarms are a resource which receive and store information on the health of InformaCast.
id | Type | Description |
---|---|---|
dcaca6f6-9d71-11eb-b775-0242ac110003 | fusion_server_red | Alerts you when on-premises server(s) have entered/exited a severely degraded state of service. |
cdcf1a88-9d71-11eb-b775-0242ac110003 | fusion_server_yellow | Alerts you when on-premises server(s) have entered/exited a mildly degraded state of service. |
e2125942-9d71-11eb-b775-0242ac110003 | license_violation | Alerts you when your instance of InformaCast is in violation of your organization’s license. |
91b26697-934f-11ec-b6a2-99eae723bd46 | phone_cache_update_failed | Alerts you when InformaCast fails to build a list of registered Cisco IP phones for Unified CM. |
a25f212f-9d71-11eb-b775-0242ac110003 | sis_loader_failed | Alerts you when InformaCast encounters errors during an import of data from your Student Information System (SIS). |
f28b0080-9d71-11eb-b775-0242ac110003 | speakers_unregistered | Alerts you when on-premises server(s) have detected that their number of registered speakers is below your organization’s set amount. |
4f2a8452-71bc-11ed-aa23-9bc083285fdb | fusion_delta_sync_error_event | Alerts you when on-premises server(s) have failed to synchronize information they pulled from the InformaCast cloud. |
List Alarms
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/alarms"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
params = {
'limit': 1
}
try:
print(requests.get(url, headers=headers, params=params).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/alarms"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
query = {
'limit': 1
}
begin:
puts(JSON.parse(HTTParty.get(url, headers: headers, query: query)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/alarms?limit=1" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"total": 4,
"partial": true,
"previous": null,
"next": "1",
"data": [
{
"id": "dcaca6f6-9d71-11eb-b775-0242ac110003",
"status": "OK",
"type": "fusion_server_red",
"muted": true,
"updatedAt": "2021-09-08T13:41:16.807Z",
"createdAt": "2021-04-14T22:36:32.409Z",
"permissions": [
"put",
"get"
]
}
]
}
Gets a list of all alarms available to the current user. (The Permissions and Security Groups associated with the request, through the user attached to the access token, may limit the resources returned.)
HTTP Request
GET /alarms
Produces
application/json
Query Parameters
To make this example more manageable, only the first alarm was requested using the API’s pagination parameters. The response reflects this, as well as the fact that there were a total of 2 available when the request was made. The Informacast Mobile API offers a standard pagination mechanism for list requests like this.
Parameter | Type | Description |
---|---|---|
includeThresholds | Boolean | If true , include the list of Alarm Thresholds associated with the alarm. Only available for the speaker registration alarm. |
includeActions | Boolean | If true , include the list Alarm Action ids associated with the alarm. |
Response
The alarm response format is detailed here.
Get an Alarm
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/alarms/f28b0080-9d71-11eb-b775-0242ac110003"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
role = requests.get(url, headers=headers).json()
print(role)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/alarms/f28b0080-9d71-11eb-b775-0242ac110003"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
role = JSON.parse(HTTParty.get(url, headers: headers))
puts(role)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/alarms/f28b0080-9d71-11eb-b775-0242ac110003" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"id": "f28b0080-9d71-11eb-b775-0242ac110003",
"status": "ACTIVE",
"type": "speakers_unregistered",
"muted": false,
"updatedAt": "2021-09-08T13:41:16.807Z",
"createdAt": "2021-04-14T22:37:09.099Z",
"permissions": [
"put",
"get"
]
}
Retrieves a single alarm by id
. Since this is not a list request, there is no pagination wrapper around the result.
HTTP Request
GET /alarms/{alarmId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
alarmId | The id of the alarm to retrieve. |
Query Parameters
Parameter | Type | Description |
---|---|---|
includeThresholds | Boolean | If true , include the list of Alarm Thresholds associated with the alarm. Only available for the speaker registration alarm. |
includeActions | Boolean | If true , include the list Alarm Action ids associated with the alarm. |
Response
The alarm response format is detailed here.
Update an Alarm
# Continuing with the alarm object from the
# previous example:
try:
print(requests.put(url, headers=headers, data=json.dumps(data)).json())
except RequestException as e:
print('Unexpected error!', e)
# Continuing with the alarm object from the
# previous example:
begin:
puts(JSON.parse(HTTParty.put(url, headers: headers, body: JSON.dump(body))))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/alarms/f28b0080-9d71-11eb-b775-0242ac110003" \
-X PUT \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"muted": true}'
{
"id": "f28b0080-9d71-11eb-b775-0242ac110003",
"status": "ACTIVE",
"type": "speakers_unregistered",
"muted": true,
"updatedAt": "2021-09-08T13:41:16.807Z",
"createdAt": "2021-04-14T22:37:09.099Z",
"permissions": [
"put",
"get"
]
}
Updates an existing alarm. Note that only muted and alarmThresholds may be updated as part of an update.
HTTP Request
PUT /alarms/{alarmId}
Consumes
multipart/form-data
, application/x-www-form-urlencoded
, application/json
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
alarmId | The id of the alarm to update. |
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
id | String | N/A | The id of the alarm. |
muted | Boolean | N/A | Mutes an alarm, which prevents actions from being sent. |
alarmThresholds | Array[Alarm Thresholds] | N/A | The alarm thresholds of the alarm. |
Response
The alarm response format is detailed here.
Alarm Thresholds
Alarm Thresholds contain information about the number of devices that can unregister before we activate the alarm. Only necessary on alarms which need to monitor device registration, eg. speakers.
Alarm Thresholds do not have their own endpoint, and are instead nested inside of an array in alarm resources.
Attribute | Type | Description |
---|---|---|
id | String | The id of the threshold. |
alarmId | String | The id of the associated alarm. |
endpointId | String | The id of the fusion server this threshold should be set to. Allows customization of thresholds if different servers have different speaker counts. |
threshold | String | The number of devices that can unregister before we send an alarm notification. |
Alarm Response
The JSON document used to represent a Alarm resource has the following content:
Attribute | Type | Description |
---|---|---|
createdAt | ISO 8601 date/time | When this alarm was created. |
updatedAt | ISO 8601 date/time | When this alarm was last updated. |
id | String | The id of the alarm, for efficient retrieval or manipulation of the alarm. Not writable. |
status | String | The status of the alarm, one of OK and ACTIVE , where ACTIVE indicates the alarm has detected a problem in the system. Not writable. |
type | String | A snake case description of the type of alarm associated with the resource. |
muted | String | Whether the alarm will send notifications when its state changes. |
permissions | Array[String] | Options: get put delete . Which operations are possible on this resource, given the authentication token being used to access the API. |
Alarm Actions
Alarm Actions are a resource that stores the notification details to be sent when an alarm is triggered.
Information about the action that should be triggered when an event occurs. Includes configuration for a message to be sent when a system health check fails.
List Alarm Actions
Gets a list of all alarm actions of a specific alarm available to the current user.
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/alarms/cdcf1a88-9d71-11eb-b775-0242ac110003/actions"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
role = requests.get(url, headers=headers).json()
print(role)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/alarms/cdcf1a88-9d71-11eb-b775-0242ac110003/actions"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
role = JSON.parse(HTTParty.get(url, headers: headers))
puts(role)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/alarms/cdcf1a88-9d71-11eb-b775-0242ac110003/actions" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"total": 2,
"partial": false,
"previous": null,
"next": null,
"data": [
{
"permissions": [
"put",
"delete",
"get"
],
"messageTemplateId": "bc7768e2-1ca0-11ec-aa38-592256cda945",
"alarmId": "dcaca6f6-9d71-11eb-b775-0242ac110003",
"collaborationGroups": [],
"messageTemplate": {
"imageDisplay": "auto",
"optOut": false,
"inferredMessageType": "Text",
"userIdsDisplay": "auto",
"ttsVoiceIdCustomizable": false,
"imageCustomizable": false,
"ttsVoiceIdDisplay": "auto",
"imageFiles": [],
"ttsCustomContent": "",
"deviceGroupIdsDisplay": "auto",
"collaborationGroups": [],
"ttsCustomContentCustomizable": true,
"incidentPlanId": null,
"name": "sendstonoone",
"audioDisplay": "auto",
"expiration": null,
"createdAt": "2021-09-23T19:02:02.393Z",
"distributionListIds": [],
"subjectCustomizable": true,
"confirmationRequestIdCustomizable": false,
"voice": {
"id": "751de142-841a-11ea-a32f-17f989f7588d",
"name": "Joanna",
"gender": "Female",
"language": "en-US",
"engine": "neural",
"synthesisProvider": "Amazon Polly"
},
"distributionListIdsCustomizable": true,
"deviceGroupIds": [],
"syncId": "bc7768e2-1ca0-11ec-aa38-592256cda945:1632423769247",
"areaOfInterestIdsCustomizable": true,
"areasOfInterest": [],
"deviceGroupIdsCustomizable": true,
"collaborationGroupIdsCustomizable": true,
"audioFiles": [],
"bodyDisplay": "auto",
"expirationCustomizable": false,
"confirmationRequestId": null,
"incidentPlanIdDisplay": "auto",
"collaborationGroupIdsDisplay": "auto",
"alertToneDisplay": "auto",
"userIdsCustomizable": true,
"ttsVoiceId": "751de142-841a-11ea-a32f-17f989f7588d",
"id": "bc7768e2-1ca0-11ec-aa38-592256cda945",
"notificationProfileId": "66405cdb-cde9-11eb-8059-87f0c8f1aa98",
"collaborationGroupIds": [],
"ttsType": "none",
"bodyCustomizable": true,
"imageMimeType": null,
"distributionListIdsDisplay": "auto",
"confirmationRequest": null,
"ttsCustomContentDisplay": "auto",
"image": 0,
"subjectDisplay": "auto",
"audio": 0,
"distributionLists": [],
"audioCustomizable": false,
"incidentPlan": null,
"expirationDisplay": "auto",
"incidentPlanIdCustomizable": false,
"body": "body",
"userIds": [],
"confirmationRequestIdDisplay": "auto",
"deviceGroups": [],
"followUp": false,
"alertToneCustomizable": false,
"areaOfInterestIds": [],
"metadata": {},
"subject": "subject",
"alertTone": "default",
"users": [],
"areaOfInterestIdsDisplay": "auto",
"metadataCustomizable": false
},
"createdAt": "2021-09-21T14:48:40.549Z",
"distributionListIds": [],
"deviceGroupIds": [],
"areasOfInterest": [],
"id": "02a29a4d-1aeb-11ec-9499-8bf44620b8b8",
"collaborationGroupIds": [],
"distributionLists": [],
"userIds": [],
"deviceGroups": [],
"triggerOnStatus": "ACTIVE",
"areaOfInterestIds": [],
"users": []
},
]
}
HTTP Request
GET /alarms/{alarmId}/actions
Produces
application/json
Query Parameters
To make this example more manageable, only the first alarm event was requested using the API’s pagination parameters. The response reflects this, as well as the fact that there were a total of 2 available when the request was made. The Informacast Mobile API offers a standard pagination mechanism for list requests like this.
Path Parameters
Attribute | Type | Description |
---|---|---|
alarmId | String | The id of the alarm you want to get all the actions of. |
Get Alarm Actions
The action triggered for each alarm type. Stores notification details.
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/alarms/cdcf1a88-9d71-11eb-b775-0242ac110003/actions/136ccc57-1d71-11ec-aa38-c99a03e48334"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
role = requests.get(url, headers=headers).json()
print(role)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/alarms/cdcf1a88-9d71-11eb-b775-0242ac110003/actions/136ccc57-1d71-11ec-aa38-c99a03e48334"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
role = JSON.parse(HTTParty.get(url, headers: headers))
puts(role)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/alarms/cdcf1a88-9d71-11eb-b775-0242ac110003/actions/136ccc57-1d71-11ec-aa38-c99a03e48334" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"permissions": [
"put",
"delete",
"get"
],
"messageTemplateId": "66f2bbfe-cde9-11eb-8059-e189c5a04e8b",
"alarmId": "cdcf1a88-9d71-11eb-b775-0242ac110003",
"collaborationGroups": [],
"messageTemplate": {
"imageDisplay": "auto",
"optOut": false,
"inferredMessageType": "Text",
"userIdsDisplay": "auto",
"ttsVoiceIdCustomizable": true,
"imageCustomizable": false,
"ttsVoiceIdDisplay": "auto",
"imageFiles": [
{
"fileName": "all-clear.png",
"size": 18003,
"contentType": "image/png",
"metadata": {
"data": {
"sampleFormat": "UnsignedIntegral",
"bitsPerSample": "8 8 8 8",
"planarConfiguration": "PixelInterleaved"
},
"width": 960,
"chroma": {
"blackIsZero": true,
"numChannels": 4,
"colorSpaceType": "RGB"
},
"height": 660,
"dimension": {
"imageOrientation": "Normal",
"pixelAspectRatio": 1.0,
"verticalPixelSize": 0.35285816,
"horizontalPixelSize": 0.35285816
},
"compression": {
"lossless": true,
"compressionTypeName": "deflate",
"numProgressiveScans": 1
},
"transparency": {
"alpha": "nonpremultipled"
}
}
}
],
"ttsCustomContent": null,
"deviceGroupIdsDisplay": "auto",
"collaborationGroups": [],
"ttsCustomContentCustomizable": true,
"incidentPlanId": null,
"name": "All Clear",
"audioDisplay": "auto",
"expiration": null,
"createdAt": "2021-06-15T14:53:10.319Z",
"distributionListIds": [],
"subjectCustomizable": true,
"confirmationRequestIdCustomizable": false,
"distributionListIdsCustomizable": true,
"deviceGroupIds": [],
"syncId": "66f2bbfe-cde9-11eb-8059-e189c5a04e8b:1623768790807",
"areaOfInterestIdsCustomizable": true,
"areasOfInterest": [],
"deviceGroupIdsCustomizable": true,
"collaborationGroupIdsCustomizable": true,
"audioFiles": [],
"bodyDisplay": "auto",
"expirationCustomizable": true,
"confirmationRequestId": null,
"incidentPlanIdDisplay": "auto",
"collaborationGroupIdsDisplay": "auto",
"alertToneDisplay": "auto",
"userIdsCustomizable": true,
"ttsVoiceId": null,
"id": "66f2bbfe-cde9-11eb-8059-e189c5a04e8b",
"notificationProfileId": "66405cdb-cde9-11eb-8059-87f0c8f1aa98",
"collaborationGroupIds": [],
"ttsType": "none",
"bodyCustomizable": true,
"imageMimeType": null,
"distributionListIdsDisplay": "auto",
"confirmationRequest": null,
"ttsCustomContentDisplay": "auto",
"image": 18003,
"subjectDisplay": "auto",
"audio": 0,
"distributionLists": [],
"audioCustomizable": true,
"incidentPlan": null,
"expirationDisplay": "auto",
"incidentPlanIdCustomizable": false,
"body": "The situation is under control and the all-clear notification has been issued. Normal activities may be resumed. If you have any questions or concerns, please call <INSERT NUMBER HERE>.",
"userIds": [],
"confirmationRequestIdDisplay": "auto",
"deviceGroups": [],
"followUp": false,
"alertToneCustomizable": false,
"areaOfInterestIds": [],
"metadata": null,
"subject": "ALL CLEAR! Resume normal activities.",
"alertTone": "all-clear1",
"users": [],
"areaOfInterestIdsDisplay": "auto",
"metadataCustomizable": true
},
"createdAt": "2021-09-24T19:53:23.605Z",
"distributionListIds": [],
"deviceGroupIds": [],
"areasOfInterest": [],
"id": "136ccc57-1d71-11ec-aa38-c99a03e48334",
"collaborationGroupIds": [],
"distributionLists": [],
"userIds": [
"f7a6d830-cdea-11eb-8059-ddbbbdf7035e"
],
"deviceGroups": [],
"triggerOnStatus": "ACTIVE",
"areaOfInterestIds": [],
"users": [
{
"email": "admin@dev.com",
"name": "admin",
"createdAt": "2021-06-15T15:04:22.588Z",
"type": "regular",
"selfRegistered": false,
"idleTimeout": 720,
"loadSourceId": null,
"id": "f7a6d830-cdea-11eb-8059-ddbbbdf7035e",
"isLicensed": true,
"isLocked": false
}
]
}
HTTP Request
GET /alarms/{alarmId}/actions/{id}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
id | The id of the Alarm Actions. |
alarmId | The id of the Alarm. |
Create Alarm Action
Create an alarm action.
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/alarms/e2125942-9d71-11eb-b775-0242ac110003/actions"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'alarmId': 'e2125942-9d71-11eb-b775-0242ac110003',
'triggerOnStatus': 'ACTIVE',
'messageTemplateId': '66f2bbfe-cde9-11eb-8059-e189c5a04e8b',
'userIds': ['f7a6d830-cdea-11eb-8059-ddbbbdf7035e']
}
try:
“role” = requests.“post”(url, headers=headers, data=json.dumps(data)).json()
print(“role”)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/alarms/e2125942-9d71-11eb-b775-0242ac110003/actions"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'alarmId': 'e2125942-9d71-11eb-b775-0242ac110003'
,
'triggerOnStatus': 'ACTIVE'
,
'messageTemplateId': '66f2bbfe-cde9-11eb-8059-e189c5a04e8b'
,
'userIds': ['f7a6d830-cdea-11eb-8059-ddbbbdf7035e'
]
}
begin:
“role” = JSON.parse(HTTParty.“post”(url, headers: headers, body: JSON.dump(body)))
puts(“role”)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/alarms/e2125942-9d71-11eb-b775-0242ac110003/actions" \
-X “POST” \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"alarmId": "e2125942-9d71-11eb-b775-0242ac110003", \
"triggerOnStatus": "ACTIVE", \
"messageTemplateId": "66f2bbfe-cde9-11eb-8059-e189c5a04e8b", \
"userIds": ["f7a6d830-cdea-11eb-8059-ddbbbdf7035e"]}'
{
"permissions":[
"put",
"delete",
"get"
],
"messageTemplateId":"66f2bbfe-cde9-11eb-8059-e189c5a04e8b",
"alarmId":"dcaca6f6-9d71-11eb-b775-0242ac110003",
"collaborationGroups":[],
"messageTemplate":{
"imageDisplay":"auto",
"optOut":false,
"inferredMessageType":"Text",
"userIdsDisplay":"auto",
"ttsVoiceIdCustomizable":true,
"imageCustomizable":false,
"ttsVoiceIdDisplay":"auto",
"imageFiles":[
{
"fileName":"all-clear.png",
"size":18003,
"contentType":"image/png",
"metadata":{
"data":{
"sampleFormat":"UnsignedIntegral",
"bitsPerSample":"8 8 8 8",
"planarConfiguration":"PixelInterleaved"
},
"width":960,
"chroma":{
"blackIsZero":true,
"numChannels":4,
"colorSpaceType":"RGB"
},
"height":660,
"dimension":{
"imageOrientation":"Normal",
"pixelAspectRatio":1.0,
"verticalPixelSize":0.35285816,
"horizontalPixelSize":0.35285816
},
"compression":{
"lossless":true,
"compressionTypeName":"deflate",
"numProgressiveScans":1
},
"transparency":{
"alpha":"nonpremultipled"
}
}
}
],
"ttsCustomContent":null,
"deviceGroupIdsDisplay":"auto",
"collaborationGroups":[],
"ttsCustomContentCustomizable":true,
"incidentPlanId":null,
"name":"All Clear",
"audioDisplay":"auto",
"expiration":null,
"createdAt":"2021-06-15T14:53:10.319Z",
"distributionListIds":[],
"subjectCustomizable":true,
"confirmationRequestIdCustomizable":false,
"distributionListIdsCustomizable":true,
"deviceGroupIds":[],
"syncId":"66f2bbfe-cde9-11eb-8059-e189c5a04e8b:1623768790807",
"areaOfInterestIdsCustomizable":true,
"areasOfInterest":[],
"deviceGroupIdsCustomizable":true,
"collaborationGroupIdsCustomizable":true,
"audioFiles":[],
"bodyDisplay":"auto",
"expirationCustomizable":true,
"confirmationRequestId":null,
"incidentPlanIdDisplay":"auto",
"collaborationGroupIdsDisplay":"auto",
"alertToneDisplay":"auto",
"userIdsCustomizable":true,
"ttsVoiceId":null,
"id":"66f2bbfe-cde9-11eb-8059-e189c5a04e8b",
"notificationProfileId":"66405cdb-cde9-11eb-8059-87f0c8f1aa98",
"collaborationGroupIds":[ ],
"ttsType":"none",
"bodyCustomizable":true,
"imageMimeType":null,
"distributionListIdsDisplay":"auto",
"confirmationRequest":null,
"ttsCustomContentDisplay":"auto",
"image":18003,
"subjectDisplay":"auto",
"audio":0,
"distributionLists":[],
"audioCustomizable":true,
"incidentPlan":null,
"expirationDisplay":"auto",
"incidentPlanIdCustomizable":false,
"body":"The situation is under control and the all-clear notification has been issued. Normal activities may be resumed. If you have any questions or concerns, please call <INSERT NUMBER HERE>.",
"userIds":[],
"confirmationRequestIdDisplay":"auto",
"deviceGroups":[ ],
"followUp":false,
"alertToneCustomizable":false,
"areaOfInterestIds":[],
"metadata":null,
"subject":"ALL CLEAR! Resume normal activities.",
"alertTone":"all-clear1",
"users":[],
"areaOfInterestIdsDisplay":"auto",
"metadataCustomizable":true
},
"createdAt":"2021-09-24T20:09:06.940Z",
"distributionListIds":[ ],
"deviceGroupIds":[],
"areasOfInterest":[],
"id":"45b24bf7-1d73-11ec-aa38-4f12b8864b56",
"collaborationGroupIds":[],
"distributionLists":[],
"userIds":[
"f7a6d830-cdea-11eb-8059-ddbbbdf7035e"
],
"deviceGroups":[],
"triggerOnStatus":"ACTIVE",
"areaOfInterestIds":[],
"users":[
{
"email":"admin@dev.com",
"name":"admin",
"createdAt":"2021-06-15T15:04:22.588Z",
"type":"regular",
"selfRegistered":false,
"idleTimeout":720,
"loadSourceId":null,
"id":"f7a6d830-cdea-11eb-8059-ddbbbdf7035e",
"isLicensed":true,
"isLocked":false
}
]
}
HTTP Request
POST /alarms/{alarmId}/actions/
Consumes
multipart/form-data
, application/x-www-form-urlencoded
, application/json
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
alarmId | The id of the Alarm. |
Attribute | Type | Default | Description |
---|---|---|---|
alarmId | String | N/A | The id of the alarm. |
triggerOnStatus | String | N/A | The status of the alarm, one of OK and ACTIVE , for which the alarm action should be sent. |
messageTemplateId | String | N/A | The id of the message template with which the alarm action is associated. |
areaOfInterestIds | Array[String] | N/A | The list of ids for areas of interest that should be attached to this scenario notification. |
collaborationGroupIds | Array[String] | N/A | The list of ids for collaboration groups that should be attached to this scenario notification. |
deviceGroupIds | Array[String] | N/A | The list of ids for device groups (fusion only) that should be attached to this scenario notification. |
distributionListIds | Array[String] | N/A | The list of ids for distribution lists that should be attached to this scenario notification. |
userIds | Array[String] | N/A | The list of ids for users that should be attached to this scenario notification. |
Update Alarm Action
Update an alarm action.
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/alarms/dcaca6f6-9d71-11eb-b775-0242ac110003/actions/66f2bbfe-cde9-11eb-8059-e189c5a04e8b"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'alarmId': 'dcaca6f6-9d71-11eb-b775-0242ac110003',
'id': '66f2bbfe-cde9-11eb-8059-e189c5a04e8b',
'userIds': ['66ce1cf4-cde9-11eb-8059-113eda5e75d7', 'f7a6d830-cdea-11eb-8059-ddbbbdf7035e']
}
try:
“role” = requests.“put”(url, headers=headers, data=json.dumps(data)).json()
print(“role”)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/alarms/dcaca6f6-9d71-11eb-b775-0242ac110003/actions/66f2bbfe-cde9-11eb-8059-e189c5a04e8b"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'alarmId': 'dcaca6f6-9d71-11eb-b775-0242ac110003'
,
'id': '66f2bbfe-cde9-11eb-8059-e189c5a04e8b'
,
'userIds': ['66ce1cf4-cde9-11eb-8059-113eda5e75d7'
, 'f7a6d830-cdea-11eb-8059-ddbbbdf7035e'
]
}
begin:
“role” = JSON.parse(HTTParty.“put”(url, headers: headers, body: JSON.dump(body)))
puts(“role”)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/alarms/dcaca6f6-9d71-11eb-b775-0242ac110003/actions/66f2bbfe-cde9-11eb-8059-e189c5a04e8b" \
-X “PUT” \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"alarmId": "dcaca6f6-9d71-11eb-b775-0242ac110003", \
"id": "66f2bbfe-cde9-11eb-8059-e189c5a04e8b", \
"userIds": ["66ce1cf4-cde9-11eb-8059-113eda5e75d7", "f7a6d830-cdea-11eb-8059-ddbbbdf7035e"]}'
{
"updatedAt":"2021-09-24T20:09:07.159Z",
"permissions":[
"put",
"get"
],
"muted":false,
"alarmActionIds":[
"45b24bf7-1d73-11ec-aa38-4f12b8864b56"
],
"createdAt":"2021-04-14T22:36:32.409Z",
"type":"fusion_server_red",
"status":"OK",
"id":"dcaca6f6-9d71-11eb-b775-0242ac110003",
"alarmThresholds":[]
}
HTTP Request
PUT /alarms/{alarmId}/actions/{id}
Consumes
multipart/form-data
, application/x-www-form-urlencoded
, application/json
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
alarmId | The id of the Alarm. |
id | The id of the Alarm Action. |
Attribute | Type | Default | Description |
---|---|---|---|
id | String | N/A | The id of the alarm action. |
alarmId | String | N/A | The id of the alarm. |
triggerOnStatus | String | N/A | The status of the alarm, one of OK and ACTIVE , for which the alarm action should be sent. |
messageTemplateId | String | N/A | The id of the message template with which the alarm action is associated. |
areaOfInterestIds | Array[String] | N/A | The list of ids for areas of interest that should be attached to this scenario notification. |
collaborationGroupIds | Array[String] | N/A | The list of ids for collaboration groups that should be attached to this scenario notification. |
deviceGroupIds | Array[String] | N/A | The list of ids for device groups (fusion only) that should be attached to this scenario notification. |
distributionListIds | Array[String] | N/A | The list of ids for distribution lists that should be attached to this scenario notification. |
userIds | Array[String] | N/A | The list of ids for users that should be attached to this scenario notification. |
Delete Alarm Action
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/alarms/dcaca6f6-9d71-11eb-b775-0242ac110003/actions/66f2bbfe-cde9-11eb-8059-e189c5a04e8b"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
“role” = requests.“delete”(url, headers=headers).json()
print(“role”)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/alarms/dcaca6f6-9d71-11eb-b775-0242ac110003/actions/66f2bbfe-cde9-11eb-8059-e189c5a04e8b"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
“role” = JSON.parse(HTTParty.“delete”(url, headers: headers))
puts(“role”)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/alarms/dcaca6f6-9d71-11eb-b775-0242ac110003/actions/66f2bbfe-cde9-11eb-8059-e189c5a04e8b" \
-X “DELETE” \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Accept: application/json"
{
"status":200,
"message":"deleted 66f2bbfe-cde9-11eb-8059-e189c5a04e8b"
}
HTTP Request
DELETE /alarms/{alarmId}/actions/{id}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
alarmId | The id of the Alarm. |
id | The id of the Alarm Action. |
Alarm Action Response
The JSON document used to represent an Alarm Action resource has the following content:
Attribute | Type | Description |
---|---|---|
id | String | The id of the alarm action. |
alarmId | String | The id of the alarm. |
triggerOnStatus | String | The status of the alarm, one of OK and ACTIVE , for which the alarm action should be sent. |
messageTemplateId | String | The id of the message template with which the alarm action is associated. |
areaOfInterestIds | Array[String] | The list of ids for areas of interest that should be attached to this scenario notification. |
collaborationGroupIds | Array[String] | The list of ids for collaboration groups that should be attached to this scenario notification. |
deviceGroupIds | Array[String] | The list of ids for device groups (fusion only) that should be attached to this scenario notification. |
distributionListIds | Array[String] | The list of ids for distribution lists that should be attached to this scenario notification. |
userIds | Array[String] | The list of ids for users that should be attached to this scenario notification. |
Alarm Events
Alarm Events are a subreasource of alarm. Alarm Events are triggered for each alarm type. The Alarm Event holds onto information about what status was entered and when it was triggered.
List Alarm Events
Gets a list of all alarm events of a specific alarm available to the current user.
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/alarms/dcaca6f6-9d71-11eb-b775-0242ac110003/events"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'limit': 1
}
try:
“role” = requests.“get”(url, headers=headers, data=json.dumps(data)).json()
print(“role”)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/alarms/dcaca6f6-9d71-11eb-b775-0242ac110003/events"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'limit': 1
}
begin:
“role” = JSON.parse(HTTParty.“get”(url, headers: headers, body: JSON.dump(body)))
puts(“role”)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/alarms/dcaca6f6-9d71-11eb-b775-0242ac110003/events?limit=1" \
-X “GET” \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Accept: application/json"
{
"total": 2,
"partial": false,
"previous": null,
"next": null,
"data": [
{
"permissions": [
"get"
],
"id": "dcaghrf6-9d71-11eb-b775-0242ac110003",
"createdAt": "2020-03-05T21:33:21.670Z",
"status": "ACTIVE"
},
]
}
HTTP Request
GET /alarms/{alarmId}/events
Produces
application/json
Query Parameters
To make this example more manageable, only the first alarm event was requested using the API’s pagination parameters. The response reflects this, as well as the fact that there were a total of 2 available when the request was made. The Informacast Mobile API offers a standard pagination mechanism for list requests like this.
Path Parameters
Attribute | Type | Description |
---|---|---|
alarmId | String | The id of alarm for which events are retrieved. |
Get Alarm Events
The events triggered for each alarm type. Stores information about the entered status and the time and date the event was triggered.
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/alarms/dcaca6f6-9d71-11eb-b775-0242ac110003/events/r94ja6f6-9d71-11eb-b775-0242ac110003"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
“role” = requests.“get”(url, headers=headers).json()
print(“role”)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/alarms/dcaca6f6-9d71-11eb-b775-0242ac110003/events/r94ja6f6-9d71-11eb-b775-0242ac110003"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
“role” = JSON.parse(HTTParty.“get”(url, headers: headers))
puts(“role”)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/alarms/dcaca6f6-9d71-11eb-b775-0242ac110003/events/r94ja6f6-9d71-11eb-b775-0242ac110003" \
-X “GET” \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Accept: application/json"
{
"permissions": [
"get"
],
"id": "r94ja6f6-9d71-11eb-b775-0242ac110003",
"createdAt": "2020-03-05T21:33:21.670Z",
"status": "ACTIVE"
}
HTTP Request
GET /alarms/{alarmId}/events/{id}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
id | The id of the Alarm Event. |
alarmId | The id of the Alarm. |
Areas of Interest
Areas of Interest (AOIs) denote geographic regions that can distribute Notifications to Users currently found within the region.
A circular region around the Cincinnati Airport. As seen in the InformaCast Mobile administrative console, this AOI currently has one user within its bounds.
List All Areas of Interest
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/areas-of-interest"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
params = {
'limit': 1
}
try:
print(requests.get(url, headers=headers, params=params).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/areas-of-interest"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
query = {
'limit': 1
}
begin:
puts(JSON.parse(HTTParty.get(url, headers: headers, query: query)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/areas-of-interest?limit=1" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"total": 3,
"partial": false,
"previous": null,
"next": null,
"data": [
{
"id": "0b45d70c-01ba-11e6-91d9-01444c9150eb",
"name": "MSN",
"geometryType": "circle",
"geometryValue": {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
-89.3362,
43.1356
]
},
"properties": {
"radiusInM": 3182
}
},
"syncedDeviceTypes": [
"mobile"
],
"createdAt": "2016-04-13T20:55:24.605Z",
"permissions": [
"delete",
"put",
"get"
]
}
]
}
Retrieves the list of all areas of interest. The visibility of AOIs may be limited by the permissions associated with the request, which are attributed through the user attached to the access token.
HTTP Request
GET /areas-of-interest
Produces
application/json
Query Parameters
To make this example more manageable, only the first user was requested using the API’s pagination parameters. The response reflects this, as well as the fact that there were a total of 3 areas available when the request was made. The InformaCast Mobile API offers a standard pagination mechanism for list requests like this.
Response
The AOI response format is detailed here.
Get an Area of Interest
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
aoi = requests.get(url, headers=headers).json()
print(aoi)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
aoi = JSON.parse(HTTParty.get(url, headers: headers))
puts(aoi)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"id": "cd2ec764-01a7-11e6-91d9-339e9d3d9df4",
"name": "CVG",
"geometryType": "circle",
"geometryValue": {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
-84.6672,
39.0478
]
},
"properties": {
"radiusInM": 3551
}
},
"syncedDeviceTypes": [
"mobile"
],
"createdAt": "2016-04-13T18:44:49.494Z",
"permissions": [
"delete",
"put",
"get"
]
}
Retrieves a single AOI by id
. Since this is not a list request, there is no pagination wrapper around the result.
HTTP Request
GET /areas-of-interest/{aoiId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
aoiId | The id of the area to retrieve. |
Response
The AOI response format is detailed here.
Create an Area of Interest
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/areas-of-interest"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'name': 'Madison Airport',
'geometryType': 'circle',
'geometryValue': {
'type': 'Feature',
'geometry': {
'type': 'Point',
'coordinates': [-89.34, 43.14]
}
,
'properties': {
'radiusInM': 3000
}
}
,
'syncedDeviceTypes': ['mobile']
}
try:
aoi = requests.post(url, headers=headers, data=json.dumps(data)).json()
print(aoi)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/areas-of-interest"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'name': 'Madison Airport'
,
'geometryType': 'circle'
,
'geometryValue': {
'type': 'Feature'
,
'geometry': {
'type': 'Point'
,
'coordinates': [-89.34
, 43.14
]
}
,
'properties': {
'radiusInM': 3000
}
}
,
'syncedDeviceTypes': ['mobile'
]
}
begin:
aoi = JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body)))
puts(aoi)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/areas-of-interest" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"name": "Madison Airport", \
"geometryType": "circle", \
"geometryValue": {"type": "Feature", \
"geometry": {"type": "Point", \
"coordinates": [-89.34, 43.14]}, \
"properties": {"radiusInM": 3000}}, \
"syncedDeviceTypes": ["mobile"]}'
{
"geometryType": "circle",
"name": "Madison Airport",
"id": "e83d84e6-2281-11e6-a729-83a644c48766",
"geometryValue": {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [ -89.34, 43.14 ]
},
"properties": {
"radiusInM": 3000
}
},
"syncedDeviceTypes": [
"mobile"
],
"createdAt": "2016-05-25T14:06:42.385Z",
"permissions": [ "delete", "put", "get" ]
}
Creates a new area of interest (limit: 20).
HTTP Request
POST /areas-of-interest
Consumes
multipart/form-data
, application/x-www-form-urlencoded
, application/json
Produces
application/json
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
geometryType | String | N/A | Option: circle . A circular region defined by center point given in latitude and longitude and a radius given in meters. |
geometryValue |
array[number] | N/A | An array with the latitude and longitude of the feature |
geometryValue |
String | N/A | Option: Point . The type of feature. |
geometryValue |
integer | N/A | For circular features, the radius of the circle in meters |
geometryValue |
String | N/A | Option: Feature . The type of geojson. |
name | String | N/A | The area’s display name |
syncedDeviceTypes | array[String] | N/A | Options: mobile desktop . The device types synced with the AOI, i.e. included in its count. Note: Submitting syncedDeviceTypes=mobile,desktop is equivalent to omitting the parameter. |
Response
The AOI response format is detailed here.
Update an Area of Interest
# Continuing with the areas of interest object
# from the previous example:
try:
print(requests.put(url, headers=headers, data=json.dumps(data)).json())
except RequestException as e:
print('Unexpected error!', e)
# Continuing with the areas of interest object
# from the previous example:
begin:
puts(JSON.parse(HTTParty.put(url, headers: headers, body: JSON.dump(body))))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/e83d84e6-2281-11e6-a729-83a644c48766" \
-X PUT \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"name": "MSN"}'
{
"geometryType": "circle",
"name": "MSN",
"id": "e83d84e6-2281-11e6-a729-83a644c48766",
"geometryValue": {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [ -89.34, 43.14 ]
},
"properties": {
"radiusInM": 3000
}
},
"syncedDeviceTypes": [
"mobile"
],
"createdAt": "2016-05-25T14:06:42.385Z",
"permissions": [ "delete", "put", "get" ]
}
Updates an existing area of interest.
HTTP Request
PUT /areas-of-interest/{aoiId}
Consumes
multipart/form-data
, application/x-www-form-urlencoded
, application/json
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
aoiId | The id of the area to update. |
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
geometryType | String | N/A | Option: circle . A circular region defined by center point given in latitude and longitude and a radius given in meters. |
geometryValue |
String | N/A | Option: Point . The type of feature. |
geometryValue |
array[number] | N/A | An array with the latitude and longitude of the feature |
geometryValue |
integer | N/A | For circular features, the radius of the circle in meters |
geometryValue |
String | N/A | Option: Feature . The type of geojson. |
name | String | N/A | The area’s display name |
syncedDeviceTypes | array[String] | N/A | Options: mobile desktop . The device types synced with the AOI, i.e. included in its count. Note: Submitting syncedDeviceTypes=mobile,desktop is equivalent to omitting the parameter. |
Response
The AOI response format is detailed here.
Remove an Area of Interest
# Continuing with the areas of interest object
# from the previous example:
try:
print(requests.delete(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
# Continuing with the areas of interest object
# from the previous example:
begin:
puts(JSON.parse(HTTParty.delete(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/e83d84e6-2281-11e6-a729-83a644c48766" \
-X DELETE \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Accept: application/json"
{
"status": 200,
"message": "deleted e83d84e6-2281-11e6-a729-83a644c48766"
}
Deletes an existing area of interest.
HTTP Request
DELETE /areas-of-interest/{aoiId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
aoiId | The id of the area to delete. |
Response
The deletion response format is detailed here.
Area of Interest Response
The JSON document used to represent an Area of Interest resource has the following content:
Attribute | Type | Description |
---|---|---|
createdAt | ISO 8601 date/time | When this area was created. |
geometryType | String | Option: circle . A circular region defined by center point given in latitude and longitude and a radius given in meters. |
geometryValue | GeometryValue | The geometry details. If present, this value determines the location, shape, and size of the area of interest. |
id | String | The id of the area, for efficient retrieval, manipulation, or looking up sub-resources attached to the AOI |
name | String | The area’s display name |
syncedDeviceTypes | array[String] | Options: mobile desktop . The device types synced with the AOI, i.e. included in its count. Note: Submitting syncedDeviceTypes=mobile,desktop is equivalent to omitting the parameter. |
permissions | array[String] | Options: get put delete . Which operations are possible on this resource, given the authentication token being used to access the API. |
Geometry Value Response
A geometry value is represented by the following JSON document structure:
Attribute | Type | Description |
---|---|---|
geometry |
array[number] | An array with the latitude and longitude of the feature |
geometry |
String | Option: Point . The type of feature. |
properties |
integer | For circular features, the radius of the circle in meters |
type | String | Option: Feature . The type of geojson. |
AOI Boundary Triggers
Boundary Triggers help create site-specific actions based on the presence or movement of Users within defined Areas of Interest (AOIs). Any action taken will also result in the creation of a Boundary Trigger Activity entry.
List All Boundary Triggers
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4/boundary-triggers"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
params = {
'limit': 1
}
try:
print(requests.get(url, headers=headers, params=params).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4/boundary-triggers"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
query = {
'limit': 1
}
begin:
puts(JSON.parse(HTTParty.get(url, headers: headers, query: query)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4/boundary-triggers?limit=1" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"total": 1,
"partial": false,
"previous": null,
"next": null,
"data": [
{
"perUserThrottlingInSecs": 600,
"areaOfInterestId": "cd2ec764-01a7-11e6-91d9-339e9d3d9df4",
"permissions": [
"delete",
"put",
"get"
],
"messageTemplateId": "bdf85eab-228e-11e6-a729-513ce5b8ef20",
"messageTemplate": {
"imageDisplay": "auto",
"userIdsDisplay": "auto",
"imageCustomizable": false,
"name": "Welcome to CVG",
"audioDisplay": "auto",
"createdAt": "2016-05-25T15:38:34.925Z",
"distributionListIds": [],
"subjectCustomizable": false,
"confirmationRequestIdCustomizable": false,
"distributionListIdsCustomizable": true,
"areaOfInterestIdsCustomizable": true,
"collaborationGroupIdsCustomizable": true,
"bodyDisplay": "auto",
"confirmationRequestId": null,
"collaborationGroupIdsDisplay": "auto",
"alertToneDisplay": "auto",
"userIdsCustomizable": true,
"id": "bdf85eab-228e-11e6-a729-513ce5b8ef20",
"collaborationGroupIds": [],
"bodyCustomizable": false,
"imageMimeType": null,
"distributionListIdsDisplay": "auto",
"confirmationRequest": null,
"audioSize": 0,
"imageHash": null,
"audioHash": null,
"subjectDisplay": "auto",
"audioCustomizable": false,
"imageSize": 0,
"body": "Welcome to the Cincinnati International Airport. Your comfort and safety are important to use and we work to keep you informed of all local events.",
"userIds": [],
"confirmationRequestIdDisplay": "auto",
"alertToneCustomizable": false,
"areaOfInterestIds": [],
"metadata": {},
"subject": "Welcome to Cincinnati!",
"alertTone": "default",
"areaOfInterestIdsDisplay": "auto",
"metadataCustomizable": false
},
"name": "Arrive at CVG",
"createdAt": "2016-05-25T15:40:02.358Z",
"distributionListIds": [],
"id": "f215963c-228e-11e6-a729-f95bf9c34bbf",
"notificationAction": "send-to-user",
"action": "entered",
"distributionLists": [],
"body": null,
"userIds": [
"e4e7860d-fb72-11e5-93a8-7b0393df5405"
],
"subject": null,
"users": [
{
"email": "marc.loy@singlewire.com",
"name": "Marc Loy",
"passwordResetRequired": false,
"type": "regular",
"loadSourceId": null,
"id": "e4e7860d-fb72-11e5-93a8-7b0393df5405",
"createdAt": "2016-04-05T21:10:58.989Z"
}
]
}
]
}
Retrieves the list of all boundary triggers (entering, exiting, or both) associated with the given area of interest. (The permissions associated with the request, through the user attached to the access token, may limit the visibility of these triggers.)
HTTP Request
GET /areas-of-interest/{aoiId}/boundary-triggers
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
aoiId | The id of the Area of Interest whose triggers are being looked up. |
Query Parameters
To make this example more manageable, only the first trigger was requested using the API’s pagination parameters. The response reflects this, as well as the fact that this is the only trigger available when the request was made. If multiple triggers are available, the total
count would contain the correct number of triggers regardless of how many were requested through pagination limits. The Informacast Mobile API offers a standard pagination mechanism for list requests like this.
Response
The boundary trigger response format is detailed here.
Get a Boundary Trigger
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4/boundary-triggers/f215963c-228e-11e6-a729-f95bf9c34bbf"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
trigger = requests.get(url, headers=headers).json()
print(trigger)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4/boundary-triggers/f215963c-228e-11e6-a729-f95bf9c34bbf"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
trigger = JSON.parse(HTTParty.get(url, headers: headers))
puts(trigger)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4/boundary-triggers/f215963c-228e-11e6-a729-f95bf9c34bbf" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"perUserThrottlingInSecs": 600,
"areaOfInterestId": "cd2ec764-01a7-11e6-91d9-339e9d3d9df4",
"permissions": [
"delete",
"put",
"get"
],
"messageTemplateId": "bdf85eab-228e-11e6-a729-513ce5b8ef20",
"messageTemplate": {
"imageDisplay": "auto",
"userIdsDisplay": "auto",
"imageCustomizable": false,
"name": "Welcome to CVG",
"audioDisplay": "auto",
"createdAt": "2016-05-25T15:38:34.925Z",
"distributionListIds": [],
"subjectCustomizable": false,
"confirmationRequestIdCustomizable": false,
"distributionListIdsCustomizable": true,
"areaOfInterestIdsCustomizable": true,
"collaborationGroupIdsCustomizable": true,
"bodyDisplay": "auto",
"confirmationRequestId": null,
"collaborationGroupIdsDisplay": "auto",
"alertToneDisplay": "auto",
"userIdsCustomizable": true,
"id": "bdf85eab-228e-11e6-a729-513ce5b8ef20",
"collaborationGroupIds": [],
"bodyCustomizable": false,
"imageMimeType": null,
"distributionListIdsDisplay": "auto",
"confirmationRequest": null,
"audioSize": 0,
"imageHash": null,
"audioHash": null,
"subjectDisplay": "auto",
"audioCustomizable": false,
"imageSize": 0,
"body": "Welcome to the Cincinnati International Airport. Your comfort and safety are important to use and we work to keep you informed of all local events.",
"userIds": [],
"confirmationRequestIdDisplay": "auto",
"alertToneCustomizable": false,
"areaOfInterestIds": [],
"metadata": {},
"subject": "Welcome to Cincinnati!",
"alertTone": "default",
"areaOfInterestIdsDisplay": "auto",
"metadataCustomizable": false
},
"name": "Arrive at CVG",
"createdAt": "2016-05-25T15:40:02.358Z",
"distributionListIds": [],
"id": "f215963c-228e-11e6-a729-f95bf9c34bbf",
"notificationAction": "send-to-user",
"action": "entered",
"distributionLists": [],
"body": null,
"userIds": [
"e4e7860d-fb72-11e5-93a8-7b0393df5405"
],
"subject": null,
"users": [
{
"email": "marc.loy@singlewire.com",
"name": "Marc Loy",
"passwordResetRequired": false,
"type": "regular",
"loadSourceId": null,
"id": "e4e7860d-fb72-11e5-93a8-7b0393df5405",
"createdAt": "2016-04-05T21:10:58.989Z"
}
]
}
Retrieves a single boundary trigger by id
. Since this is not a list request, there is no pagination wrapper around the result.
HTTP Request
GET /areas-of-interest/{aoiId}/boundary-triggers/{triggerId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
aoiId | The id of the area of interest. |
triggerId | The id of the trigger to retrieve. |
Response
The boundary trigger response format is detailed here.
Create a Boundary Trigger
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4/boundary-triggers"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'name': 'Arrival Welcome',
'action': 'entered',
'per-user-throttling-in-secs': 300,
'notification-action': 'send-to-user',
'message-template-id': 'bdf85eab-228e-11e6-a729-513ce5b8ef20',
'subject': 'Welcome to Cincinnati!'
}
try:
trigger = requests.post(url, headers=headers, data=json.dumps(data)).json()
print(trigger)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4/boundary-triggers"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'name': 'Arrival Welcome'
,
'action': 'entered'
,
'per-user-throttling-in-secs': 300
,
'notification-action': 'send-to-user'
,
'message-template-id': 'bdf85eab-228e-11e6-a729-513ce5b8ef20'
,
'subject': 'Welcome to Cincinnati!'
}
begin:
trigger = JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body)))
puts(trigger)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4/boundary-triggers" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"name": "Arrival Welcome", \
"action": "entered", \
"per-user-throttling-in-secs": 300, \
"notification-action": "send-to-user", \
"message-template-id": "bdf85eab-228e-11e6-a729-513ce5b8ef20", \
"subject": "Welcome to Cincinnati!"}'
{
"perUserThrottlingInSecs": 300,
"areaOfInterestId": "cd2ec764-01a7-11e6-91d9-339e9d3d9df4",
"permissions": [
"delete",
"put",
"get"
],
"messageTemplateId": "bdf85eab-228e-11e6-a729-513ce5b8ef20",
"messageTemplate": {
"imageDisplay": "auto",
"userIdsDisplay": "auto",
"imageCustomizable": false,
"name": "Welcome to CVG",
"audioDisplay": "auto",
"createdAt": "2016-05-25T15:38:34.925Z",
"distributionListIds": [],
"subjectCustomizable": false,
"confirmationRequestIdCustomizable": false,
"distributionListIdsCustomizable": true,
"areaOfInterestIdsCustomizable": true,
"collaborationGroupIdsCustomizable": true,
"bodyDisplay": "auto",
"confirmationRequestId": null,
"collaborationGroupIdsDisplay": "auto",
"alertToneDisplay": "auto",
"userIdsCustomizable": true,
"id": "bdf85eab-228e-11e6-a729-513ce5b8ef20",
"collaborationGroupIds": [],
"bodyCustomizable": false,
"imageMimeType": null,
"distributionListIdsDisplay": "auto",
"confirmationRequest": null,
"audioSize": 0,
"imageHash": null,
"audioHash": null,
"subjectDisplay": "auto",
"audioCustomizable": false,
"imageSize": 0,
"body": "Welcome to the Cincinnati International Airport. Your comfort and safety are important to use and we work to keep you informed of all local events.",
"userIds": [],
"confirmationRequestIdDisplay": "auto",
"alertToneCustomizable": false,
"areaOfInterestIds": [],
"metadata": {},
"subject": "Welcome to Cincinnati!",
"alertTone": "default",
"areaOfInterestIdsDisplay": "auto",
"metadataCustomizable": false
},
"name": "Welcome 3",
"createdAt": "2016-05-25T17:51:16.446Z",
"distributionListIds": [],
"id": "476810c8-22a1-11e6-a729-bdd2c948c5a0",
"notificationAction": "send-to-user",
"action": "entered",
"distributionLists": [],
"body": null,
"userIds": [],
"subject": "Welcome to Cincinnati!",
"users": []
}
Create a new Boundary Trigger.
HTTP Request
POST /areas-of-interest/{aoiId}/boundary-triggers
Consumes
multipart/form-data
, application/x-www-form-urlencoded
, application/json
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
aoiId | The id of the area of interest. |
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
action | String | N/A | Option: entered , exited , both . Indicates if a notification should be sent out either when someone has entered or exited an area of interest. |
body | String | N/A | The body override of the Message Template |
distributionListIds | array[uuid] | N/A | When anyone from these Distribution lists crosses an area of interest, trigger this action. |
messageTemplateId | uuid | N/A | If a notification is being sent, the id of the Message Template to use. |
name | String | N/A | The trigger’s name. Maximum of 140 characters. |
notificationAction | String | N/A | Option: send-to-none , send-to-user , send-to-message-template-recipients . Indicates whether or not a notification should be sent out when someone has entered or exited an area of interest. The notication can be skipped, sent to the user, or to the recipients specified in the associated Message Template respectively. |
perUserThrottlingInSecs | Integer | N/A | The amount of time that must pass before another boundary trigger will fire for that user. |
subject | String | N/A | The subject override of the Message Template |
userIds | array[uuid] | N/A | When any User from this list crosses an area of interest, trigger this action. |
Response
The boundary trigger response format is detailed here.
Update a Boundary Trigger
# Continuing with the boundary trigger object
# from the previous example:
try:
print(requests.put(url, headers=headers, data=json.dumps(data)).json())
except RequestException as e:
print('Unexpected error!', e)
# Continuing with the boundary trigger object
# from the previous example:
begin:
puts(JSON.parse(HTTParty.put(url, headers: headers, body: JSON.dump(body))))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4/boundary-triggers/476810c8-22a1-11e6-a729-bdd2c948c5a0" \
-X PUT \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"name": "Welcome 2016"}'
{
"perUserThrottlingInSecs": 300,
"areaOfInterestId": "cd2ec764-01a7-11e6-91d9-339e9d3d9df4",
"permissions": [
"delete",
"put",
"get"
],
"messageTemplateId": "bdf85eab-228e-11e6-a729-513ce5b8ef20",
"messageTemplate": {
"imageDisplay": "auto",
"userIdsDisplay": "auto",
"imageCustomizable": false,
"name": "Welcome to CVG",
"audioDisplay": "auto",
"createdAt": "2016-05-25T15:38:34.925Z",
"distributionListIds": [],
"subjectCustomizable": false,
"confirmationRequestIdCustomizable": false,
"distributionListIdsCustomizable": true,
"areaOfInterestIdsCustomizable": true,
"collaborationGroupIdsCustomizable": true,
"bodyDisplay": "auto",
"confirmationRequestId": null,
"collaborationGroupIdsDisplay": "auto",
"alertToneDisplay": "auto",
"userIdsCustomizable": true,
"id": "bdf85eab-228e-11e6-a729-513ce5b8ef20",
"collaborationGroupIds": [],
"bodyCustomizable": false,
"imageMimeType": null,
"distributionListIdsDisplay": "auto",
"confirmationRequest": null,
"audioSize": 0,
"imageHash": null,
"audioHash": null,
"subjectDisplay": "auto",
"audioCustomizable": false,
"imageSize": 0,
"body": "Welcome to the Cincinnati International Airport. Your comfort and safety are important to use and we work to keep you informed of all local events.",
"userIds": [],
"confirmationRequestIdDisplay": "auto",
"alertToneCustomizable": false,
"areaOfInterestIds": [],
"metadata": {},
"subject": "Welcome to Cincinnati!",
"alertTone": "default",
"areaOfInterestIdsDisplay": "auto",
"metadataCustomizable": false
},
"name": "Welcome 2016",
"createdAt": "2016-05-25T17:51:16.446Z",
"distributionListIds": [],
"id": "476810c8-22a1-11e6-a729-bdd2c948c5a0",
"notificationAction": "send-to-user",
"action": "entered",
"distributionLists": [],
"body": null,
"userIds": [],
"subject": "Welcome to Cincinnati!",
"users": []
}
Updates an existing boundary trigger.
HTTP Request
PUT /areas-of-interest/{aoiId}/boundary-triggers/{triggerId}
Consumes
multipart/form-data
, application/x-www-form-urlencoded
, application/json
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
aoiId | The id of the area of interest |
triggerId | The id of the trigger to update |
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
action | String | N/A | Option: entered , exited , both . Indicates if a notification should be sent out either when someone has entered or exited an area of interest. |
body | String | N/A | The body override of the Message Template |
messageTemplateId | uuid | N/A | If a notification is being sent, the id of the Message Template to use. |
name | String | N/A | The trigger’s name. Maximum of 140 characters. |
notificationAction | String | N/A | Option: send-to-none , send-to-user , send-to-message-template-recipients . Indicates whether or not a notification should be sent out when someone has entered or exited an area of interest. The notication can be skipped, sent to the user, or to the recipients specified in the associated Message Template respectively. |
perUserThrottlingInSecs | Integer | N/A | The amount of time that must pass before another boundary trigger will fire for that user. |
distributionListIds | array[uuid] | N/A | When anyone from these Distribution lists crosses an area of interest, trigger this action. |
subject | String | N/A | The subject override of the Message Template |
userIds | array[uuid] | N/A | When any User from this list crosses an area of interest, trigger this action. |
Response
The boundary trigger response format is detailed here.
Remove a Boundary Trigger
# Continuing with the boundary trigger object
# from the previous example:
try:
print(requests.delete(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
# Continuing with the boundary trigger object
# from the previous example:
begin:
puts(JSON.parse(HTTParty.delete(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4/boundary-triggers/476810c8-22a1-11e6-a729-bdd2c948c5a0" \
-X DELETE \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Accept: application/json"
{
"status": 200,
"message": "deleted 476810c8-22a1-11e6-a729-bdd2c948c5a0"
}
Deletes an existing boundary trigger.
HTTP Request
DELETE /areas-of-interest/{aoiId}/boundary-triggers/{triggerId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
aoiId | The id of the area of interest |
triggerId | The id of the trigger to update |
Response
The deletion response format is detailed here.
Boundary Trigger Response
The JSON document used to represent a User resource has the following content:
Attribute | Type | Description |
---|---|---|
action | String | Option: entered , exited , both . Indicates if a notification should be sent out either when someone has entered or exited an area of interest. |
areaOfInterestId | uuid | The id of the Area of Interest associated with this trigger. |
body | String | The body override of the Message Template |
distributionListIds | array[uuid] | When anyone from these Distribution lists crosses an area of interest, trigger this action. |
id | uuid | The id of the user, for efficient retrieval, manipulation, or looking up sub-resources attached to the user. |
messageTemplate | Message Template | The pre-fetched template, if one is being used. |
messageTemplateId | uuid | If a notification is being sent, the id of the Message Template to use. |
name | String | The trigger’s name. Maximum of 140 characters. |
notificationAction | String | Option: send-to-none , send-to-user , send-to-message-template-recipients . Indicates whether or not a notification should be sent out when someone has entered or exited an area of interest. The notication can be skipped, sent to the user, or to the recipients specified in the associated Message Template respectively. |
permissions | Array[String] | Options: get put delete . Which operations are possible on this resource, given the authentication token being used to access the API. |
perUserThrottlingInSecs | Integer | The amount of time that must pass before another boundary trigger will fire for that user. |
userIds | array[uuid] | When any User from this list crosses an area of interest, trigger this action. |
subject | String | The subject override of the Message Template |
AOI Boundary Trigger Activities
You can monitor boundary trigger events with Activities. Each activity entry includes the type of activity (enter or exit) and whether or not the triggered action was successful. Note that the activities represent a read-only log of triggered events and cannot themselves be altered or deleted.
List All Activities
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4/boundary-triggers/86ac7740-22a0-11e6-a729-356099d3635b/activities"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
params = {
'limit': 1
}
try:
print(requests.get(url, headers=headers, params=params).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4/boundary-triggers/86ac7740-22a0-11e6-a729-356099d3635b/activities"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
query = {
'limit': 1
}
begin:
puts(JSON.parse(HTTParty.get(url, headers: headers, query: query)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4/boundary-triggers/86ac7740-22a0-11e6-a729-356099d3635b/activities?limit=1" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"total": 8,
"partial": false,
"previous": null,
"next": null,
"data": [
{
"id": "527910b5-2345-11e6-a729-0da433599b2c",
"areaOfInterestId": "cd2ec764-01a7-11e6-91d9-339e9d3d9df4",
"boundaryTriggerId": "86ac7740-22a0-11e6-a729-356099d3635b",
"reason": "exited",
"status": "success",
"device": {
"deviceIdentifier": "simulator:63913053-1cfa-11e6-8356-774e67ffa4fc",
"disabled": false,
"name": "iPhone Simulator",
"client": "",
"createdAt": "2016-05-18T13:14:01.924Z",
"type": "apns-sandbox",
"build": "v2.9.0 D",
"id": "63913053-1cfa-11e6-8356-774e67ffa4fc",
"userId": "e4e7860d-fb72-11e5-93a8-7b0393df5405",
"os": "9.3",
"user": {
"id": "e4e7860d-fb72-11e5-93a8-7b0393df5405",
"name": "Marc Loy",
"type": "regular",
"email": "marc.loy@singlewire.com"
}
},
"createdAt": "2016-05-26T13:25:32.476Z",
"permissions": [
"delete",
"put",
"get"
]
}
]
}
Retrieves the list of all areas of interest.
HTTP Request
GET /areas-of-interest/{aoiId}/boundary-triggers/{triggerId}/activities
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
aoiId | The id of the Area of Interest associated with the trigger being looked up. |
triggerId | The id of the Boundary Trigger whose activities are being looked up. |
Query Parameters
To make this example more manageable, only the first user was requested using the API’s pagination parameters. The response reflects this, as well as the fact that there were a total of eight areas available when the request was made. The Informacast Mobile API offers a standard pagination mechanism for list requests like this.
Response
The Activity response format is detailed here.
Get an Activity
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4/boundary-triggers/86ac7740-22a0-11e6-a729-356099d3635b/activities/527910b5-2345-11e6-a729-0da433599b2c"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
activity = requests.get(url, headers=headers).json()
print(activity)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4/boundary-triggers/86ac7740-22a0-11e6-a729-356099d3635b/activities/527910b5-2345-11e6-a729-0da433599b2c"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
activity = JSON.parse(HTTParty.get(url, headers: headers))
puts(activity)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/areas-of-interest/cd2ec764-01a7-11e6-91d9-339e9d3d9df4/boundary-triggers/86ac7740-22a0-11e6-a729-356099d3635b/activities/527910b5-2345-11e6-a729-0da433599b2c" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"id": "527910b5-2345-11e6-a729-0da433599b2c",
"areaOfInterestId": "cd2ec764-01a7-11e6-91d9-339e9d3d9df4",
"boundaryTriggerId": "86ac7740-22a0-11e6-a729-356099d3635b",
"reason": "exited",
"status": "success",
"device": {
"deviceIdentifier": "simulator:63913053-1cfa-11e6-8356-774e67ffa4fc",
"disabled": false,
"name": "iPhone Simulator",
"client": "",
"createdAt": "2016-05-18T13:14:01.924Z",
"type": "apns-sandbox",
"build": "v2.9.0 D",
"id": "63913053-1cfa-11e6-8356-774e67ffa4fc",
"userId": "e4e7860d-fb72-11e5-93a8-7b0393df5405",
"os": "9.3",
"user": {
"id": "e4e7860d-fb72-11e5-93a8-7b0393df5405",
"name": "Marc Loy",
"type": "regular",
"email": "marc.loy@singlewire.com"
}
},
"createdAt": "2016-05-26T13:25:32.476Z",
"permissions": [
"delete",
"put",
"get"
]
}
Retrieves a single AOI by id
. Since this is not a list request, there is no pagination wrapper around the result.
HTTP Request
GET /areas-of-interest/{aoiId}/boundary-triggers/{triggerId}/activities/{activityId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
aoiId | The id of the Area of Interest associated with the trigger being looked up. |
triggerId | The id of the Boundary Trigger associated with the activity being looked up. |
activityId | The id of the specific activity being looked up. |
Response
The Activity response format is detailed here.
Area of Interest Response
The JSON document used to represent an Area of Interest resource has the following content:
Attribute | Type | Description |
---|---|---|
areaOfInterestId | String | The id of the area, for efficient retrieval, manipulation, or looking up sub-resources attached to the Area of Interest |
boundaryTriggerId | String | The id of the boundary trigger, for efficient retrieval, manipulation, or looking up sub-resources attached to the Boundary Trigger |
createdAt | ISO 8601 date/time | When this activity was created. |
device | Device | The device that triggered the boundary condition. |
id | String | The id of the activity |
permissions | Array[String] | Options: get put delete . Which operations are possible on this resource, given the authentication token being used to access the API. |
reason | String | Options: entered exited . Denotes the cause (entry/exit) of the trigger. |
status | String | Options: success no-recipients . Denotes the success or failure of the triggered notification. Note that log-only triggers (notificationAction is send-to-none ) are marked success upon activity creation. |
Bell Schedules
Bell Schedules represent a weekly, bi-weekly, or tri-weekly cycle of daily event notifications. One can configure the date range within which a bell schedule is valid, the time zone for ring lists contained in this bell schedule, the number of weeks in a cycle, any ring lists with events set to fire on days within that cycle, and any exceptions on specific dates that may override the default ring list for that day in the cycle.
List all Bell Schedules
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
params = {
'limit': 1
}
try:
bell_schedules = requests.get(url, headers=headers, params=params).json()
print(bell_schedules)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
query = {
'limit': 1
}
begin:
bell_schedules = JSON.parse(HTTParty.get(url, headers: headers, query: query))
puts(bell_schedules)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/bell-schedules?limit=1" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"total": 1,
"previous": null,
"next": null,
"data": [
{
"description": "School Year 2017-2018",
"bellScheduleExceptions": [
{
"id": "788b62cb-69c3-11e8-9e0e-37bff5ca251f",
"description": "Snow Day",
"ringListId": "68c1f806-650e-11e8-a57e-bf0edde4bce4",
"startDate": "2018-01-03",
"endDate": "2018-01-03",
"ringListName": "Snow Day"
}
],
"timeZone": "America/Chicago",
"permissions": [
"delete",
"put",
"get"
],
"bellScheduleEntries": [
{
"ringListId": "f94d1622-6a65-11e8-9030-0d319c188f5d",
"entryNum": 0,
"ringListName": "Monday"
},
{
"ringListId": "04e253b6-6a66-11e8-9030-055159f85cae",
"entryNum": 1,
"ringListName": "Tuesday"
},
{
"ringListId": "0a5c4df9-6a66-11e8-9030-e5fd3c7e9500",
"entryNum": 2,
"ringListName": "Wednesday"
},
{
"ringListId": "1140387c-6a66-11e8-9030-f52fea97f89c",
"entryNum": 3,
"ringListName": "Thursday"
},
{
"ringListId": "16240d3f-6a66-11e8-9030-bfa905b4cd81",
"entryNum": 4,
"ringListName": "Friday"
}
],
"name": "School Year 17-18",
"startDate": "2017-08-28",
"createdAt": "2018-05-31T20:18:35.635Z",
"updatedAt": "2018-05-31T20:18:35.635Z",
"numWeeks": 1,
"endDate": "2018-05-25",
"id": "cc01447c-650f-11e8-a57e-332c8cdd597f"
}
]
}
Retrieves a list of all bell schedules. (The Permissions and Security Groups associated with the request, through the user attached to the access token, may limit the resources returned.)
HTTP Request
GET /bell-schedules
Produces
application/json
Query Parameters
To make this example more manageable, only the first bell schedule was requested using the API’s pagination parameters. The response reflects this, as well as the fact that there were a total of four available when the request was made. The InformaCast Mobile API offers a standard pagination mechanism for list requests like this.
Parameter | Type | Description |
---|---|---|
assoc-sync-state | Boolean | If true , include the current synchronization state for fusion endpoints. |
assoc-sync-state-for-endpoint | String | Include the current synchronization state for a specific fusion endpoint. |
includeDomains | Boolean | If true , include the list of Domains to which each bell schedule belongs. |
Response
The bell schedule response format is detailed here.
Get a Bell Schedule
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules/37c1fe0a-4b9c-11e7-8148-0242ac110002"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
bell_schedule = requests.get(url, headers=headers).json()
print(bell_schedule)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules/37c1fe0a-4b9c-11e7-8148-0242ac110002"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
bell_schedule = JSON.parse(HTTParty.get(url, headers: headers))
puts(bell_schedule)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/bell-schedules/37c1fe0a-4b9c-11e7-8148-0242ac110002" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"description": "School Year 2017-2018",
"bellScheduleExceptions": [
{
"id": "788b62cb-69c3-11e8-9e0e-37bff5ca251f",
"description": "Snow Day",
"ringListId": "68c1f806-650e-11e8-a57e-bf0edde4bce4",
"startDate": "2018-01-03",
"endDate": "2018-01-03",
"ringListName": "Snow Day"
}
],
"timeZone": "America/Chicago",
"permissions": [
"delete",
"put",
"get"
],
"bellScheduleEntries": [
{
"ringListId": "f94d1622-6a65-11e8-9030-0d319c188f5d",
"entryNum": 0,
"ringListName": "Monday"
},
{
"ringListId": "04e253b6-6a66-11e8-9030-055159f85cae",
"entryNum": 1,
"ringListName": "Tuesday"
},
{
"ringListId": "0a5c4df9-6a66-11e8-9030-e5fd3c7e9500",
"entryNum": 2,
"ringListName": "Wednesday"
},
{
"ringListId": "1140387c-6a66-11e8-9030-f52fea97f89c",
"entryNum": 3,
"ringListName": "Thursday"
},
{
"ringListId": "16240d3f-6a66-11e8-9030-bfa905b4cd81",
"entryNum": 4,
"ringListName": "Friday"
}
],
"name": "School Year 17-18",
"startDate": "2017-08-28",
"createdAt": "2018-05-31T20:18:35.635Z",
"updatedAt": "2018-05-31T20:18:35.635Z",
"numWeeks": 1,
"endDate": "2018-05-25",
"id": "cc01447c-650f-11e8-a57e-332c8cdd597f"
}
Retrieves a single bell schedule by id
. Since this is not a list request, there is no pagination wrapper around the result.
HTTP Request
GET /bell-schedules/{bellScheduleId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
bellScheduleId | The id of the Bell Schedule to retrieve. |
Query Parameters
Parameter | Type | Description |
---|---|---|
includeDomains | Boolean | If true , include the list of Domains to which the bell schedule belongs. |
Response
The bell schedule response format is detailed here.
Create a Bell Schedule
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'name': 'School Year 17-18',
'description': 'School Year 2017-2018',
'startDate': '2017-08-28',
'endDate': '2018-05-25',
'timeZone': 'America/Chicago',
'numWeeks': 1,
'bellScheduleEntries': [{
'entryNum': 0,
'ringListId': 'f94d1622-6a65-11e8-9030-0d319c188f5d'
}
, {
'entryNum': 1,
'ringListId': '04e253b6-6a66-11e8-9030-055159f85cae'
}
, {
'entryNum': 2,
'ringListId': '0a5c4df9-6a66-11e8-9030-e5fd3c7e9500'
}
, {
'entryNum': 3,
'ringListId': '1140387c-6a66-11e8-9030-f52fea97f89c'
}
, {
'entryNum': 4,
'ringListId': '16240d3f-6a66-11e8-9030-bfa905b4cd81'
}
],
'bellScheduleExceptions': [{
'description': 'Snow Day',
'ringListId': '68c1f806-650e-11e8-a57e-bf0edde4bce4',
'startDate': '2018-01-03',
'endDate': '2018-01-03'
}
]
}
try:
bell_schedule = requests.post(url, headers=headers, data=json.dumps(data)).json()
print(bell_schedule)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'name': 'School Year 17-18'
,
'description': 'School Year 2017-2018'
,
'startDate': '2017-08-28'
,
'endDate': '2018-05-25'
,
'timeZone': 'America/Chicago'
,
'numWeeks': 1
,
'bellScheduleEntries': [{
'entryNum': 0
,
'ringListId': 'f94d1622-6a65-11e8-9030-0d319c188f5d'
}
, {
'entryNum': 1
,
'ringListId': '04e253b6-6a66-11e8-9030-055159f85cae'
}
, {
'entryNum': 2
,
'ringListId': '0a5c4df9-6a66-11e8-9030-e5fd3c7e9500'
}
, {
'entryNum': 3
,
'ringListId': '1140387c-6a66-11e8-9030-f52fea97f89c'
}
, {
'entryNum': 4
,
'ringListId': '16240d3f-6a66-11e8-9030-bfa905b4cd81'
}
]
,
'bellScheduleExceptions': [{
'description': 'Snow Day'
,
'ringListId': '68c1f806-650e-11e8-a57e-bf0edde4bce4'
,
'startDate': '2018-01-03'
,
'endDate': '2018-01-03'
}
]
}
begin:
bell_schedule = JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body)))
puts(bell_schedule)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/bell-schedules" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"name": "School Year 17-18", \
"description": "School Year 2017-2018", \
"startDate": "2017-08-28", \
"endDate": "2018-05-25", \
"timeZone": "America/Chicago", \
"numWeeks": 1, \
"bellScheduleEntries": [{"entryNum": 0, \
"ringListId": "f94d1622-6a65-11e8-9030-0d319c188f5d"}, {"entryNum": 1, \
"ringListId": "04e253b6-6a66-11e8-9030-055159f85cae"}, {"entryNum": 2, \
"ringListId": "0a5c4df9-6a66-11e8-9030-e5fd3c7e9500"}, {"entryNum": 3, \
"ringListId": "1140387c-6a66-11e8-9030-f52fea97f89c"}, {"entryNum": 4, \
"ringListId": "16240d3f-6a66-11e8-9030-bfa905b4cd81"}], \
"bellScheduleExceptions": [{"description": "Snow Day", \
"ringListId": "68c1f806-650e-11e8-a57e-bf0edde4bce4", \
"startDate": "2018-01-03", \
"endDate": "2018-01-03"}]}'
{
"description": "School Year 2017-2018",
"bellScheduleExceptions": [
{
"id": "788b62cb-69c3-11e8-9e0e-37bff5ca251f",
"description": "Snow Day",
"ringListId": "68c1f806-650e-11e8-a57e-bf0edde4bce4",
"startDate": "2018-01-03",
"endDate": "2018-01-03",
"ringListName": "Snow Day"
}
],
"timeZone": "America/Chicago",
"permissions": [
"delete",
"put",
"get"
],
"bellScheduleEntries": [
{
"ringListId": "f94d1622-6a65-11e8-9030-0d319c188f5d",
"entryNum": 0,
"ringListName": "Monday"
},
{
"ringListId": "04e253b6-6a66-11e8-9030-055159f85cae",
"entryNum": 1,
"ringListName": "Tuesday"
},
{
"ringListId": "0a5c4df9-6a66-11e8-9030-e5fd3c7e9500",
"entryNum": 2,
"ringListName": "Wednesday"
},
{
"ringListId": "1140387c-6a66-11e8-9030-f52fea97f89c",
"entryNum": 3,
"ringListName": "Thursday"
},
{
"ringListId": "16240d3f-6a66-11e8-9030-bfa905b4cd81",
"entryNum": 4,
"ringListName": "Friday"
}
],
"name": "School Year 17-18",
"startDate": "2017-08-28",
"createdAt": "2018-05-31T20:18:35.635Z",
"updatedAt": "2018-05-31T20:18:35.635Z",
"numWeeks": 1,
"endDate": "2018-05-25",
"id": "cc01447c-650f-11e8-a57e-332c8cdd597f"
}
Creates a new bell schedule (limit: 3500). Once the schedule is created, it should begin firing at the next available time within the startDate
and endDate
.
HTTP Request
POST /bell-schedules
Consumes
multipart/form-data
, application/x-www-form-urlencoded
, application/json
Produces
application/json
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
name | String | N/A | A unique name for the bell schedule. |
description | String | null | An optional description for the bell schedule. |
startDate | Date | N/A | The start date for your bell schedule in ISO 8601 YYYY-MM-DD format. |
endDate | Date | N/A | The end date for your bell schedule in ISO 8601 YYYY-MM-DD format. |
timeZone | String | N/A | A timezone such as “America/Chicago”. This list is too long to enumerate here. |
numWeeks | Integer | N/A | The number of weeks in a bell schedule. Value can only be 1, 2, or 3 which corresponds to a weekly, bi-weekly, or tri-weekly schedule respectively. |
bellScheduleEntries | Array[Object] | [] | An array of the configured ring list entries attached to a bell schedule. Please see here for detailed information about bell schedule entries. |
bellScheduleExceptions | Array[Object] | [] | An array of exceptions attached to the bell schedule. Please see here for detailed information about bell schedule exceptions. |
Response
The bell schedule response format is detailed here.
Update a Bell Schedule
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules/cc01447c-650f-11e8-a57e-332c8cdd597f"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'name': 'School Year 17-18',
'description': 'School Year 2017-2018',
'startDate': '2017-08-28',
'endDate': '2018-05-25',
'timeZone': 'America/Chicago',
'numWeeks': 1,
'bellScheduleEntries': [{
'entryNum': 0,
'ringListId': 'f94d1622-6a65-11e8-9030-0d319c188f5d'
}
, {
'entryNum': 1,
'ringListId': '04e253b6-6a66-11e8-9030-055159f85cae'
}
, {
'entryNum': 2,
'ringListId': '0a5c4df9-6a66-11e8-9030-e5fd3c7e9500'
}
, {
'entryNum': 3,
'ringListId': '1140387c-6a66-11e8-9030-f52fea97f89c'
}
, {
'entryNum': 4,
'ringListId': '16240d3f-6a66-11e8-9030-bfa905b4cd81'
}
],
'bellScheduleExceptions': [{
'description': 'Snow Day',
'ringListId': '68c1f806-650e-11e8-a57e-bf0edde4bce4',
'startDate': '2018-01-03',
'endDate': '2018-01-03'
}
]
}
try:
bell_schedule = requests.put(url, headers=headers, data=json.dumps(data)).json()
print(bell_schedule)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules/cc01447c-650f-11e8-a57e-332c8cdd597f"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'name': 'School Year 17-18'
,
'description': 'School Year 2017-2018'
,
'startDate': '2017-08-28'
,
'endDate': '2018-05-25'
,
'timeZone': 'America/Chicago'
,
'numWeeks': 1
,
'bellScheduleEntries': [{
'entryNum': 0
,
'ringListId': 'f94d1622-6a65-11e8-9030-0d319c188f5d'
}
, {
'entryNum': 1
,
'ringListId': '04e253b6-6a66-11e8-9030-055159f85cae'
}
, {
'entryNum': 2
,
'ringListId': '0a5c4df9-6a66-11e8-9030-e5fd3c7e9500'
}
, {
'entryNum': 3
,
'ringListId': '1140387c-6a66-11e8-9030-f52fea97f89c'
}
, {
'entryNum': 4
,
'ringListId': '16240d3f-6a66-11e8-9030-bfa905b4cd81'
}
]
,
'bellScheduleExceptions': [{
'description': 'Snow Day'
,
'ringListId': '68c1f806-650e-11e8-a57e-bf0edde4bce4'
,
'startDate': '2018-01-03'
,
'endDate': '2018-01-03'
}
]
}
begin:
bell_schedule = JSON.parse(HTTParty.put(url, headers: headers, body: JSON.dump(body)))
puts(bell_schedule)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/bell-schedules/cc01447c-650f-11e8-a57e-332c8cdd597f" \
-X PUT \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"name": "School Year 17-18", \
"description": "School Year 2017-2018", \
"startDate": "2017-08-28", \
"endDate": "2018-05-25", \
"timeZone": "America/Chicago", \
"numWeeks": 1, \
"bellScheduleEntries": [{"entryNum": 0, \
"ringListId": "f94d1622-6a65-11e8-9030-0d319c188f5d"}, {"entryNum": 1, \
"ringListId": "04e253b6-6a66-11e8-9030-055159f85cae"}, {"entryNum": 2, \
"ringListId": "0a5c4df9-6a66-11e8-9030-e5fd3c7e9500"}, {"entryNum": 3, \
"ringListId": "1140387c-6a66-11e8-9030-f52fea97f89c"}, {"entryNum": 4, \
"ringListId": "16240d3f-6a66-11e8-9030-bfa905b4cd81"}], \
"bellScheduleExceptions": [{"description": "Snow Day", \
"ringListId": "68c1f806-650e-11e8-a57e-bf0edde4bce4", \
"startDate": "2018-01-03", \
"endDate": "2018-01-03"}]}'
{
"description": "School Year 2017-2018",
"bellScheduleExceptions": [
{
"id": "788b62cb-69c3-11e8-9e0e-37bff5ca251f",
"description": "Snow Day",
"ringListId": "68c1f806-650e-11e8-a57e-bf0edde4bce4",
"startDate": "2018-01-03",
"endDate": "2018-01-03",
"ringListName": "Snow Day"
}
],
"timeZone": "America/Chicago",
"permissions": [
"delete",
"put",
"get"
],
"bellScheduleEntries": [
{
"ringListId": "f94d1622-6a65-11e8-9030-0d319c188f5d",
"entryNum": 0,
"ringListName": "Monday"
},
{
"ringListId": "04e253b6-6a66-11e8-9030-055159f85cae",
"entryNum": 1,
"ringListName": "Tuesday"
},
{
"ringListId": "0a5c4df9-6a66-11e8-9030-e5fd3c7e9500",
"entryNum": 2,
"ringListName": "Wednesday"
},
{
"ringListId": "1140387c-6a66-11e8-9030-f52fea97f89c",
"entryNum": 3,
"ringListName": "Thursday"
},
{
"ringListId": "16240d3f-6a66-11e8-9030-bfa905b4cd81",
"entryNum": 4,
"ringListName": "Friday"
}
],
"name": "School Year 17-18",
"startDate": "2017-08-28",
"createdAt": "2018-05-31T20:18:35.635Z",
"updatedAt": "2018-05-32T09:21:34.457Z",
"numWeeks": 1,
"endDate": "2018-05-25",
"id": "cc01447c-650f-11e8-a57e-332c8cdd597f"
}
Updates an existing bell schedule.
HTTP Request
PUT /bell-schedules/{bellScheduleId}
Consumes
multipart/form-data
, application/x-www-form-urlencoded
, application/json
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
bellScheduleId | The id of the Bell Schedule to update. |
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
name | String | N/A | A unique name for the bell schedule. |
description | String | null |
An optional description for the bell schedule. |
startDate | Date | N/A | The start date for your bell schedule in ISO 8601 YYYY-MM-DD format. |
endDate | Date | N/A | The end date for your bell schedule in ISO 8601 YYYY-MM-DD format. |
timeZone | String | N/A | A timezone such as “America/Chicago”. This list is too long to enumerate here. |
numWeeks | Integer | N/A | The number of weeks in a bell schedule. Value can only be 1, 2, or 3 which corresponds to a weekly, bi-weekly, or tri-weekly schedule respectively. |
bellScheduleEntries | Array[Object] | [] | An array of the configured ring list entries attached to a bell schedule. Please see here for detailed information about bell schedule entries. |
bellScheduleExceptions | Array[Object] | [] | An array of exceptions attached to the bell schedule. Please see here for detailed information about bell schedule exceptions. |
Response
The bell schedule response format is detailed here.
Remove a Bell Schedule
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules/cc01447c-650f-11e8-a57e-332c8cdd597f"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
print(requests.delete(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules/cc01447c-650f-11e8-a57e-332c8cdd597f"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
puts(JSON.parse(HTTParty.delete(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/bell-schedules/cc01447c-650f-11e8-a57e-332c8cdd597f" \
-X DELETE \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Accept: application/json"
{
"status": 200,
"message": "deleted cc01447c-650f-11e8-a57e-332c8cdd597f"
}
Deletes an existing bell schedule.
HTTP Request
DELETE /bell-schedules/{bellScheduleId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
bellScheduleId | The id of the Bell Schedule to delete. |
Response
The deletion response format is detailed here.
Bell Schedule Entries
Bell schedule entries are the configured ring list for a particular day within a rolling schedule. A bell schedule will respect the rolling schedule within the bounds of the bell schedules startDate
and endDate
.
For example: a bell schedule with numWeeks
set to 1, and a startDate
on a Wednesday will use the ring list entries in the following order: 2,3,4,5,6,0,1,2,3,4,5,6… These values correspond to the ring list entries entryNum
.
A bell schedule entry does not have its own endpoint, and is strictly a nested resource within a bell schedule.
Attribute | Type | Description |
---|---|---|
ringListId | String | The id of the Ring List applied on entryNum day. If no rings are needed, this can be null . |
ringListName | String | The name of the ring list applied on entryNum day. This is present in the response as a convenience, do not send it in a PUT or POST , it would be ignored. |
entryNum | Integer | The day in a rolling schedule in which a ring list is applied. entryNum must be an integer between 0-20 which corresponds to a day in a rolling schedule. A rolling schedule can be one week (0-6), two weeks (0-13), or three weeks (0-20). Rolling schedules start on Monday, so 0 is the first Monday in the rolling schedule, 1 is the first Tuesday, etc. |
Bell Schedule Exceptions
Bell schedule exceptions are overrides to one or more bell schedule entries attached to a bell schedule. For the dates bounded by the bell schedule exceptions startDate
and endDate
, the bell schedule will use the ring list defined in the bell schedule exception instead of the bell schedule entry.
A bell schedule exception does not have its own endpoint, and is strictly a nested resource within a bell schedule.
Attribute | Type | Description |
---|---|---|
id | String | The id of the Bell Schedule Exception. |
description | String | null |
ringListId | String | The id of the Ring List that overrides the bell schedule entries ring list between the bell schedule exception’s startDate and endDate . If no rings are needed, this can be null . |
startDate | Date | The start date of the bell schedule exception in ISO 8601 YYYY-MM-DD format. |
endDate | Date | The end date of the bell schedule exception in ISO 8601 YYYY-MM-DD format. |
ringListName | String | The name of the ring list overriding the ring list of the bell schedule entry. This is present in the response as a convenience, do not send it in a PUT or POST , it would be ignored. |
Bell Schedule Response
The JSON document used to represent a bell schedule resource has the following content:
Attribute | Type | Description |
---|---|---|
id | String | The id of this specific bell schedule, allowing it to be manipulated or retrieved individually. |
name | String | The name of the bell schedule. |
description | String | The description of the bell schedule. |
numWeeks | Integer | The number of weeks in a bell schedule. Value can only be 1, 2, or 3 which corresponds to a weekly, bi-weekly, or tri-weekly schedule respectively. |
startDate | Date | The start date of the bell schedule in ISO 8601 YYYY-MM-DD format. |
endDate | Date | The end date of the bell schedule in ISO 8601 YYYY-MM-DD format. |
timeZone | String | A timezone such as “America/Chicago”. This list is too long to enumerate here. |
syncState | Array[Object] | The endpoints’ sync state. Only applicable if fusion servers are configured and query param assoc-sync-state is true . |
endpointSyncState | Object | The specific endpoint’s sync state. Only applicable if fusion servers are configured and query param assoc-sync-state-for-endpoint is true . |
bellScheduleEntries | Array[Object] | An array of the configured ring list entries attached to a bell schedule. Please see here for detailed information about bell schedule entries. |
bellScheduleExceptions | Array[Object] | An array of exceptions attached to the bell schedule. Please see here for detailed information about bell schedule exceptions. |
createdAt | ISO 8601 date/time | When this bell schedule was created. |
updatedAt | ISO 8601 date/time | When this bell schedule was last updated. |
Bell Schedule Domains
Domains allow for hierarchical delegation of authority over supported resources. When they are in use, Bell Schedules are assigned to at least one Domain, and can be associated with more than one. This resource lets you see and adjust which Bell Schedules are assigned to which Domains.
List All Bell Schedule Domains
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules/c54e4241-299b-11e8-94d3-2be9464da125/domains"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
print(requests.get(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules/c54e4241-299b-11e8-94d3-2be9464da125/domains"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
puts(JSON.parse(HTTParty.get(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/bell-schedules/c54e4241-299b-11e8-94d3-2be9464da125/domains" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"total": 2,
"previous": null,
"next": null,
"partial": false,
"data": [
{
"id": "a4e9e56c-28df-11e8-8c38-738c606ef19c",
"parentId": "9ca35dab-28df-11e8-8c38-235a5737f6bb",
"name": "Vending",
"path": "/90de0f6a-28df-11e8-8c38-e9fe0f3683de/9ca35dab-28df-11e8-8c38-235a5737f6bb/a4e9e56c-28df-11e8-8c38-738c606ef19c/",
"namePath": "/West Campus/Stadium/Vending/",
"bellScheduleId": "c54e4241-299b-11e8-94d3-2be9464da125",
"permissions": [
"delete",
"put",
"get"
],
"createdAt": "2018-03-16T06:02:44.441Z"
},
{
"id": "f04e3599-295b-11e8-b54b-abb9a309846e",
"parentId": "9ca35dab-28df-11e8-8c38-235a5737f6bb",
"name": "Grounds",
"path": "/90de0f6a-28df-11e8-8c38-e9fe0f3683de/9ca35dab-28df-11e8-8c38-235a5737f6bb/f04e3599-295b-11e8-b54b-abb9a309846e/",
"namePath": "/West Campus/Stadium/Grounds/",
"bellScheduleId": "c54e4241-299b-11e8-94d3-2be9464da125",
"permissions": [
"delete",
"put",
"get"
],
"createdAt": "2018-03-16T20:52:28.522Z"
}
]
}
Retrieves the list of all Domains to which the Bell Schedule belongs. (The permissions associated with the request, through the user attached to the access token, may limit the visibility of results.)
HTTP Request
GET /bell-schedules/{bellScheduleId}/domains
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
bellScheduleId | The id of the Bell Schedule whose associated Domains are to be listed. |
Query Parameters
In this example, There were a total of 2 Domains that the specified Bell Schedule belonged to when the request was made, and both were returned. The Informacast Mobile API offers a standard pagination mechanism for list requests like this.
Additionally, you can request the subdomains of any Domain attached to the specified Bell Schedule using a query parameter, and/or filter the results by matching on the Domain name:
Parameter | Type | Description |
---|---|---|
name | String | Returns only Domains whose names exactly match the supplied value. |
recursive | Boolean | If true , in addition to Domains that are directly attached to the specified Bell Schedule, any subdomains will be returned. |
Response
The domain response format is detailed here.
Additionally, the id
of the bell schedule whose domains were
requested is returned under the key bellScheduleId
inside each
domain response.
Check if a Bell Schedule contains a Domain
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules/c54e4241-299b-11e8-94d3-2be9464da125/domains/f04e3599-295b-11e8-b54b-abb9a309846e"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
domain = requests.get(url, headers=headers).json()
print(domain)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules/c54e4241-299b-11e8-94d3-2be9464da125/domains/f04e3599-295b-11e8-b54b-abb9a309846e"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
domain = JSON.parse(HTTParty.get(url, headers: headers))
puts(domain)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/bell-schedules/c54e4241-299b-11e8-94d3-2be9464da125/domains/f04e3599-295b-11e8-b54b-abb9a309846e" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"id": "f04e3599-295b-11e8-b54b-abb9a309846e",
"parentId": "9ca35dab-28df-11e8-8c38-235a5737f6bb",
"name": "Grounds",
"path": "/90de0f6a-28df-11e8-8c38-e9fe0f3683de/9ca35dab-28df-11e8-8c38-235a5737f6bb/f04e3599-295b-11e8-b54b-abb9a309846e/",
"namePath": "/West Campus/Stadium/Grounds/",
"bellScheduleId": "c54e4241-299b-11e8-94d3-2be9464da125",
"permissions": [
"delete",
"put",
"get"
],
"createdAt": "2018-03-16T20:52:28.522Z"
}
Retrieves a single Bell Schedule Domain by id
. Since this is not a list
request, there is no pagination wrapper around the result.
HTTP Request
GET /bell-schedules/{bellScheduleId}/domains/{id}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
bellScheduleId | The id of the Bell Schedule whose Domains are of interest. |
id | The id of the Domain you want to know whether the Bell Schedule belongs to. |
Additionally, you can check if the Bell Schedule is attached to any subdomains of the specified Domain using a query parameter:
Parameter | Type | Description |
---|---|---|
recursive | boolean | If true , in addition to Domains that are directly attached to the specified Bell Schedule, any of their subdomains will be considered. |
Response
If the Bell Schedule is part of the Domain (or its subdomains, if
recursive
is true
), a response will be returned. The Domain
response format is detailed here. If
the list is not in the Domain, the response status will indicate that
the requested resource cannot be found.
Add a Bell Schedule Domain
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules/c54e4241-299b-11e8-94d3-2be9464da125/domains"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'id': 'a4e9e56c-28df-11e8-8c38-738c606ef19c'
}
try:
domain = requests.post(url, headers=headers, data=json.dumps(data)).json()
print(domain)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules/c54e4241-299b-11e8-94d3-2be9464da125/domains"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'id': 'a4e9e56c-28df-11e8-8c38-738c606ef19c'
}
begin:
domain = JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body)))
puts(domain)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/bell-schedules/c54e4241-299b-11e8-94d3-2be9464da125/domains" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"id": "a4e9e56c-28df-11e8-8c38-738c606ef19c"}'
{
"id": "a4e9e56c-28df-11e8-8c38-738c606ef19c",
"parentId": "9ca35dab-28df-11e8-8c38-235a5737f6bb",
"name": "Vending",
"path": "/90de0f6a-28df-11e8-8c38-e9fe0f3683de/9ca35dab-28df-11e8-8c38-235a5737f6bb/a4e9e56c-28df-11e8-8c38-738c606ef19c/",
"namePath": "/West Campus/Stadium/Vending/",
"bellScheduleId": "c54e4241-299b-11e8-94d3-2be9464da125",
"permissions": [
"delete",
"put",
"get"
],
"createdAt": "2018-03-16T06:02:44.441Z"
}
Puts the Bell Schedule into the specified Domain. As described below, this may be considered a promotion or demotion, which would require additional request parameters in order to validate.
HTTP Request
POST /bell-schedules/{bellScheduleId}/domains
Produces
application/json
Path Parameters
Parameter | Type | Description |
---|---|---|
bellScheduleId | String | The id of the Bell Schedule to be added to the Domain. |
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
demote | Boolean | false |
Allow this request to proceed even if it will demote the Bell Schedule out of a parent Domain? |
id | String | n/a | The id of the Domain to which the Bell Schedule should be added. |
promote | Boolean | false |
Allow this request to proceed even if it will promote the Bell Schedule out of one or more child Domains? |
A Bell Schedule is not allowed to be explicitly part of any Domain
that it is implicitly granted membership to by belonging to a
parent Domain. For example, if you take a Bell Schedule that is in
Domains /West Campus/
and /East Campus/
, and try to add it to
/West Campus/Gym/
that request will fail because it is already
implicitly in that domain through belonging to the parent
/West Campus/
Domain. See the full explanation of
promotion and demotion
in the context of Domains and Users for more details and illustrations.
Remove a Bell Schedule Domain
# Continuing with the domain object from the
# previous example:
try:
print(requests.delete(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
# Continuing with the domain object from the
# previous example:
begin:
puts(JSON.parse(HTTParty.delete(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/bell-schedules/c54e4241-299b-11e8-94d3-2be9464da125/domains/f04e3599-295b-11e8-b54b-abb9a309846e" \
-X DELETE \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Accept: application/json"
{
"status": 200,
"message": "deleted Domain Bell Schedule c54e4241-299b-11e8-94d3-2be9464da125"
}
Removes the specified Bell Schedule from the specified Domain. As described below, if this is the only Domain that the Bell Schedule currently belongs to, you need to supply an additional request parameter to confirm the deletion of the Bell Schedule itself.
HTTP Request
DELETE /bell-schedules/{bellScheduleId}/domains/{id}
Produces
application/json
Path Parameters
Parameter | Type | Description |
---|---|---|
bellScheduleId | The id of the Bell Schedule whose Domain should be removed. |
|
id | The id of the Domain to be removed from the Bell Schedule. |
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
orphans | String | fail |
Option: delete , fail . What to do if this would leave the Bell Schedule in no Domain. |
A Bell Schedule must always belong to at least one Domain, so if you try to
remove the Bell Schedule from the only Domain that it belongs to, the request
must either fail, or delete the Bell Schedule. The request parameter orphans
lets you control which of those takes place. The default, if you
supply no instructions, is for the request to fail, and you will
receive a validation error explaining why. If you pass a value of
delete
for the orphans
request parameter, then taking a Bell Schedule out
of its last Domain will delete the Bell Schedule.
Response
The deletion response format is detailed here.
Bell Schedules Bulk Exceptions
This resource is a shortcut for adding the same exception to multiple bell schedules in a single operation. It will adjust each schedule whose date ranges have any overlap with the exception to include the new exception in the appropriate place, shortening, removing, or splitting any existing exceptions which would have conflicted with the new one.
The only operation supported is POST
.
Add an Exception to Multiple Bell Schedules
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules-bulk-exceptions"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'description': 'Snow Day',
'startDate': '2021-02-04',
'endDate': '2021-02-04',
'ringListId': '68c1f806-650e-11e8-a57e-bf0edde4bce4',
'bellScheduleIds': ['cc01447c-650f-11e8-a57e-332c8cdd597f', 'f94d1622-6a65-11e8-9030-0d319c188f5d']
}
try:
affected = requests.post(url, headers=headers, data=json.dumps(data)).json()
print(affected)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules-bulk-exceptions"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'description': 'Snow Day'
,
'startDate': '2021-02-04'
,
'endDate': '2021-02-04'
,
'ringListId': '68c1f806-650e-11e8-a57e-bf0edde4bce4'
,
'bellScheduleIds': ['cc01447c-650f-11e8-a57e-332c8cdd597f'
, 'f94d1622-6a65-11e8-9030-0d319c188f5d'
]
}
begin:
affected = JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body)))
puts(affected)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/bell-schedules-bulk-exceptions" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"description": "Snow Day", \
"startDate": "2021-02-04", \
"endDate": "2021-02-04", \
"ringListId": "68c1f806-650e-11e8-a57e-bf0edde4bce4", \
"bellScheduleIds": ["cc01447c-650f-11e8-a57e-332c8cdd597f", "f94d1622-6a65-11e8-9030-0d319c188f5d"]}'
{
"schedulesAffected": [
{"id": "cc01447c-650f-11e8-a57e-332c8cdd597f",
"name": "Pelham Elementary",
"syncId": "cc01447c-650f-11e8-a57e-332c8cdd597f:1599612837889"},
{"id": "f94d1622-6a65-11e8-9030-0d319c188f5d",
"name": "Ridgemont High",
"syncId": "f94d1622-6a65-11e8-9030-0d319c188f5d:1599610192210"}
]
}
Adds an exception with the specified date range and ring list (which
can be null
to suppress ringing entirely) to the specified bell
schedules. In order to perform this operation the user must have
POST
permission to the /bell-schedules-bulk-exceptions
resource
but only needs GET
permission to the ring list and bell schedules.
This allows delegation of exception assignment without other bell
schedule editing powers.
HTTP Request
POST /bell-schedules-bulk-exceptions
Consumes
multipart/form-data
, application/x-www-form-urlencoded
, application/json
Produces
application/json
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
description | String | N/A | A description for the exception to be added to each schedule. |
startDate | Date | N/A | The start date for the exception ISO 8601 YYYY-MM-DD format. |
endDate | Date | N/A | The end date for the exception in ISO 8601 YYYY-MM-DD format. |
ringListId | String | null | The id of the Ring List that overrides the bell schedule entries ring list between the exception’s startDate and endDate . If no rings are needed, this can be null . |
bellScheduleIds | Array of Strings | N/A | The id s of the Bell Schedules to which this exception should be added. If any schedule’s date range does not overlap the exception, it will be left unchanged. Required unless allBellSchedules is true. |
allBellSchedules | Boolean | false | If true, will apply the exception to all bell schedules, regardless of the value of bellScheduleIds . |
Response
Information about the affected schedules is returned as a JSON
document with a single attribute schedulesAffected
attribute, which
contains an array of objects with the following content:
Attribute | Type | Description |
---|---|---|
id | String | The id of a bell schedule to which the exception was added. |
name | String | The name of the affected bell schedule. |
syncId | String | The current sync ID of the bell schedule, which Fusion servers can use to verify their data is up to date. |
Bell Schedule Cloning
This resource is used to make a copy of the Bell Schedule specified by id in the request path.
The only operation supported is POST
.
Clone a Bell Schedule
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules/cc01447c-650f-11e8-a57e-332c8cdd597f/clone"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
print(requests.post(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/bell-schedules/cc01447c-650f-11e8-a57e-332c8cdd597f/clone"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
puts(JSON.parse(HTTParty.post(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/bell-schedules/cc01447c-650f-11e8-a57e-332c8cdd597f/clone" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Accept: application/json"
{
"description": "School Year 2017-2018",
"bellScheduleExceptions": [
{
"id": "788b62cb-69c3-11e8-9e0e-37bff5ca251f",
"description": "Snow Day",
"ringListId": "68c1f806-650e-11e8-a57e-bf0edde4bce4",
"startDate": "2018-01-03",
"endDate": "2018-01-03",
"ringListName": "Snow Day"
}
],
"timeZone": "America/Chicago",
"permissions": [],
"bellScheduleEntries": [
{
"ringListId": "f94d1622-6a65-11e8-9030-0d319c188f5d",
"entryNum": 0,
"ringListName": "Monday"
},
{
"ringListId": "04e253b6-6a66-11e8-9030-055159f85cae",
"entryNum": 1,
"ringListName": "Tuesday"
},
{
"ringListId": "0a5c4df9-6a66-11e8-9030-e5fd3c7e9500",
"entryNum": 2,
"ringListName": "Wednesday"
},
{
"ringListId": "1140387c-6a66-11e8-9030-f52fea97f89c",
"entryNum": 3,
"ringListName": "Thursday"
},
{
"ringListId": "16240d3f-6a66-11e8-9030-bfa905b4cd81",
"entryNum": 4,
"ringListName": "Friday"
}
],
"name": "School Year 17-18 (Copy)",
"startDate": "2017-08-28",
"createdAt": "2018-05-31T20:19:35.635Z",
"numWeeks": 1,
"endDate": "2018-05-25",
"id": "cd21447c-650f-11e8-a57e-111c8cdd59bb"
}
Creates a copy of the specified Bell Schedule. The name of the
new copy is simply the original Bell Schedule’s name with “ (Copy)”
appended. In order to perform this operation, the user must have both
POST
permission to the /bell-schedules
resource and GET
permission
to the Bell Schedule they wish to copy.
HTTP Request
POST /bell-schedules/{bellScheduleId}/clone
Produces
application/json
Request Parameters
Parameter | Type | Description |
---|---|---|
bellScheduleId | String | The id of the Bell Schedule to copy. |
Response
The Bell Schedule response format is detailed here.
Brandings
Provides access to Brandings resources for Fusion customers. Brandings provide a way to customize UI. One Branding can exist per Provider and are not ‘domainified’. Brandings are created when Providers are bootstrapped.
List All Brandings
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/brandings"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
brandings = requests.get(url, headers=headers).json()
print(brandings)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/brandings"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
brandings = JSON.parse(HTTParty.get(url, headers: headers))
puts(brandings)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/brandings" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"total": 1,
"partial": false,
"previous": null,
"next": null,
"data": [
{
"logo": "logoFile",
"companyPhone": "+16085551212",
"secondaryColor": "#123",
"companyEmail": "bar@bazz.com",
"primaryColor": "#456789",
"companyName": "Foo",
"customUrl": "https://www.quux.com"
}
]
}
Retrieves a list of all Brandings.
HTTP Request
GET /brandings
Produces
application/json
Response
When a list is retrieved, the default response is wrapped in the pagination wrapper with totals, etc. This response example does not include the pagination wrapper.
Get a Branding
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/brandings/2601234b-a1e6-11ea-b7db-f3cc7d266a8e"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
branding = requests.get(url, headers=headers).json()
print(branding)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/brandings/2601234b-a1e6-11ea-b7db-f3cc7d266a8e"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
branding = JSON.parse(HTTParty.get(url, headers: headers))
puts(branding)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/brandings/2601234b-a1e6-11ea-b7db-f3cc7d266a8e" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"logo": "logoFile",
"companyPhone": "+16085551212",
"secondaryColor": "#123",
"companyEmail": "bar@bazz.com",
"primaryColor": "#456789",
"companyName": "Foo",
"customUrl": "https://www.quux.com"
}
Retrieves a single Branding by id
. Since this is not a list request, there is no pagination wrapper around the result.
HTTP Request
GET /brandings/{id}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
id | The id of the Branding. |
Response
The Brandings response format is detailed here.
Update a Branding
# Continuing with the branding object from
# the previous example:
try:
updated = requests.put(url, headers=headers, data=json.dumps(data)).json()
print(updated)
except RequestException as e:
print('Unexpected error!', e)
# Continuing with the branding object from
# the previous example:
begin:
updated = JSON.parse(HTTParty.put(url, headers: headers, body: JSON.dump(body)))
puts(updated)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/brandings/2601234b-a1e6-11ea-b7db-f3cc7d266a8e" \
-X PUT \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"name": "Changes to any branding"}'
{
"logo": "logoFile",
"companyPhone": "+16085551212",
"secondaryColor": "#123",
"companyEmail": "bar@bazz.com",
"primaryColor": "#456789",
"companyName": "Foo",
"customUrl": "https://www.quux.com"
}
Updates an existing Branding.
HTTP Request
PUT /brandings/{id}
Consumes
multipart/form-data, application/x-www-form-urlencoded, application/json
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
Id | The id of the Branding being altered. |
Request Parameters
Name | Type | Required | Doc |
---|---|---|---|
logo | File | false | A logo file as a BMP, GIF, JPEG, PNG, TIF or TIFF. |
primaryColor | String | false | Hex color value for the Branding’s primary color. |
secondaryColor | String | false | Hex color value for the Branding’s secondary color. |
companyName | String | false | Name of the company that owns the Branding. |
companyEmail | String | false | The Branding contact’s email address. |
companyPhone | String | false | The Branding contact’s phone number. |
customUrl | String | false | A web link to custom help content for Brandings customers. |
Response
The Brandings response format is detailed here.
Brandings Response
The JSON document used to represent a Brandings resource has the following content:
Attribute | Type | Description |
---|---|---|
permissions | Array[String] | Options: get put . What operations are possible on the Branding resource. |
logo | Integer | Size of the logo for the Branding. |
companyPhone | String | Company phone number. |
createdAt | ISO 8601 date/time | When this Branding was created. |
secondaryColor | String | The secondary color for the Branding. A Hex value like ’#abcdef’. |
defaults | Object | An object including the default logo size, primary and secondary color for every Provider. |
companyEmail | String | The saved company email value. |
id | UUID | The unique identifier for a Branding. |
primaryColor | String | The primary color for a Branding, a three- or six-character Hex value like ’#123’. |
companyName | String | The name of the company associated with the Branding. |
customUrl | String | An HTTP or HTTPS URL link to custom help content for the Branding. |
Bulk Upload
The bulk upload endpoint is a moderately non-standard endpoint in the API. While its GET functionality is similar to that of other endpoints, its POST provides a URL to which .zip files can be delivered to an S3 bucket to proceed through the remainder of the bulk upload process.
List Bulk Uploads
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/bulk-upload"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
params = {
'limit': 1
}
try:
print(requests.get(url, headers=headers, params=params).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/bulk-upload"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
query = {
'limit': 1
}
begin:
puts(JSON.parse(HTTParty.get(url, headers: headers, query: query)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/bulk-upload?limit=1" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"total": 1,
"previous": null,
"next": null,
"partial": true,
"data": [
{
"directoryId": "e229c4ae-5f28-11ea-8aa8-053bf8c7b046",
"permissions": [
"delete",
"get"
],
"endpointId": "efea94d8-5f28-11ea-8aa8-4b0ddc9506ce",
"status": "COMPLETE",
"id": "efcb9b27-5f28-11ea-8aa8-0bb2f3879538",
"resourceType": "message-templates",
"createdAt": "2020-03-05T21:33:21.670Z",
"testMode": false
}
]
}
Gets a list of all bulk uploads to the current user. (The Permissions and Security Groups associated with the request, through the user attached to the access token, may limit the resources returned. Upload information is cleared daily, so records may not be retained.
HTTP Request
GET /bulk-upload
Consumes
multipart/form-data
, application/x-www-form-urlencoded
, application/json
Produces
application/json
Response
The bulk upload response format is detailed here.
Get a Bulk Upload Instance
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/bulk-upload/efcb9b27-5f28-11ea-8aa8-0bb2f3879538"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
print(requests.get(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/bulk-upload/efcb9b27-5f28-11ea-8aa8-0bb2f3879538"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
puts(JSON.parse(HTTParty.get(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/bulk-upload/efcb9b27-5f28-11ea-8aa8-0bb2f3879538" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"id": "efcb9b27-5f28-11ea-8aa8-0bb2f3879538",
"endpointId": "efea94d8-5f28-11ea-8aa8-4b0ddc9506ce",
"directoryId": "e229c4ae-5f28-11ea-8aa8-053bf8c7b046",
"createdAt": "2020-03-05T21:33:21.670Z",
"testMode": false,
"resourceType": "message-templates",
"status": "COMPLETE",
"permissions": [
"delete",
"get"
]
}
Retrieves a single bulk upload by id
. Since this is not a list request, there is no pagination wrapper around the result.
HTTP Request
GET /bulk-upload/{bulkUploadId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
bulkUploadId | The id of the bulk upload instance to retrieve. |
Response
The bulk upload response format is detailed here.
Generate a POST URL
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/bulk-upload"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'resourceType': 'message-templates'
}
try:
print(requests.post(url, headers=headers, data=json.dumps(data)).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/bulk-upload"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'resourceType': 'message-templates'
}
begin:
puts(JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body))))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/bulk-upload" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"resourceType": "message-templates"}'
{
"url": "https://examplebucket.s3.us-east-2.amazonaws.com/40257fff-5f3b-11ea-8e69-21b3848f39e0.zip?x-amz-meta-resourcetype=message-templates&x-amz-meta-usebackup=true&x-amz-meta-endpointid=&x-amz-meta-directoryid=40257fff-5f3b-11ea-8e69-21b3848f39e0&x-amz-meta-testmode=true&x-amz-meta-provider=SarahFusion&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20200305T234427Z&X-Amz-SignedHeaders=content-type%3Bhost&X-Amz-Expires=899&X-Amz-Credential=AKIAW7U2WXNLCHGMC6F7%2F20200305%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Signature=998dc0cfd2d3ea43e2aee6faff4de4b17f8bf0b1d815b86f4de81276aff30691",
"permissions": [
"delete",
"get"
]
}
Provides an authenticated URL to post a zip file to an S3 bucket.
HTTP Request
POST /bulk-upload
Consumes
multipart/form-data
, application/x-www-form-urlencoded
, application/json
Produces
application/json
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
resourceType | String | N/A | The type of resource to be bulk uploaded. The types currently supported are message-templates for Message Templates, Confirmation Requests (when appropriate), and Notification Profiles (when appropriate), device-groups for Device Groups (Fusion-only), ring-lists for Ring Lists, bell-schedules for Bell Schedules, dialing-configurations (a Fusion-only proxied resource), and speakers (another Fusion-only proxied resource). |
endpointId | String | N/A | The fusion server that the resource should be created on. Only used for proxied resources; these are currently speakers and dialing-configurations . |
Response
Attribute | Type | Description |
---|---|---|
url | String | The url that points to the appropriate AWS S3 bucket. |
permissions | Array[String] | Options: get put delete . Which operations are possible on this resource, given the authentication token being used to access the API. |
Bulk Upload Response
The JSON document used to represent a Bulk Upload resource has the following content:
Attribute | Type | Description |
---|---|---|
createdAt | ISO 8601 date/time | When this bulk upload was initiated. |
endpointId | String | The endpointId of the resource. Only exists for proxied resources (speakers). |
id | String | The id of the bulk upload instance, for efficient retrieval, manipulation, or looking up sub-resources attached to the bulk upload. |
resourceType | String | The resource type of the bulk upload. The types currently supported are message-templates for Message Templates, Confirmation Requests (when appropriate), and Notification Profiles (when appropriate), device-groups for Device Groups (Fusion-only), ring-lists for Ring Lists, bell-schedules for Bell Schedules, dialing-configurations (a Fusion-only proxied resource), and speakers (another Fusion-only proxied resource). |
directoryId | String | The id of the directory in the S3 bucket associated with this resource. |
testMode | Boolean | Whether or not the resources associated with the bulk upload were actually created or not. |
permissions | Array[String] | Options: get put delete . Which operations are possible on this resource, given the authentication token being used to access the API. |
Bulk Upload Commit
Bulk Upload Commit is called on an existing Bulk Upload instance. This can be used to create the resources associated with a test without needing to post resources to S3 again.
Commit a Bulk Upload Test
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/bulk-upload/efcb9b27-5f28-11ea-8aa8-0bb2f3879538/commit"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
print(requests.post(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/bulk-upload/efcb9b27-5f28-11ea-8aa8-0bb2f3879538/commit"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
puts(JSON.parse(HTTParty.post(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/bulk-upload/efcb9b27-5f28-11ea-8aa8-0bb2f3879538/commit" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Accept: application/json"
{
"id": "efcb9b27-5f28-11ea-8aa8-0bb2f3879538",
"endpointId": "efea94d8-5f28-11ea-8aa8-4b0ddc9506ce",
"directoryId": "e229c4ae-5f28-11ea-8aa8-053bf8c7b046",
"createdAt": "2020-03-05T21:33:21.670Z",
"testMode": false,
"resourceType": "message-templates",
"status": "COMPLETE",
"permissions": []
}
Takes an existing test bulk upload and commits the resources to the database.
HTTP Request
POST /bulk-upload/{bulkUploadId}/commit
Consumes
multipart/form-data
, application/x-www-form-urlencoded
, application/json
Produces
application/json
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
bulkUploadId | String | N/A | The id of the associated bulk upload. |
Response
Attribute | Type | Description |
---|---|---|
id | String | The id of the associated bulk upload. |
endpointId | String | The id of the endpoint to be committed to, if a proxied resource (speakers). |
directoryId | String | The id of the directory in the S3 bucket associated with this resource. |
createdAt | ISO 8601 date/time | When this bulk upload was initiated. |
testMode | Boolean | Whether or not the bulk upload being committed had been committed previously. |
resourceType | String | The resource type of the bulk upload. The types currently supported are message-templates for Message Templates, Confirmation Requests (when appropriate), and Notification Profiles (when appropriate), device-groups for Device Groups (Fusion-only), ring-lists for Ring Lists, bell-schedules for Bell Schedules, dialing-configurations (a Fusion-only proxied resource), and speakers (another Fusion-only proxied resource). |
status | String | The status of the bulk upload being committed. |
permissions | Array[String] | Which operations are possible on this resource, given the authentication token being used to access the API. |
Bulk Upload Logs
Bulk Upload Logs are created to store information about each resource that is either created or ran as a test through a Bulk Upload.
List All Bulk Upload Logs
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/bulk-upload/efcb9b27-5f28-11ea-8aa8-0bb2f3879538/logs"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
print(requests.get(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/bulk-upload/efcb9b27-5f28-11ea-8aa8-0bb2f3879538/logs"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
puts(JSON.parse(HTTParty.get(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/bulk-upload/efcb9b27-5f28-11ea-8aa8-0bb2f3879538/logs" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"total": 4,
"previous": null,
"next": null,
"partial": false,
"data": [
{
"id": "f02d432c-5f28-11ea-8aa8-1569ae3ffa2c",
"createdAt": "2020-03-05T21:33:22.108Z",
"bulkUploadId": "efcb9b27-5f28-11ea-8aa8-0bb2f3879538",
"resourceCreated": true,
"resourceName": "Example Hammer - Profile",
"resourceResponse": null,
"permissions": [
"get"
]
},
{
"id": "f02d432d-5f28-11ea-8aa8-c19ede5e8e35",
"createdAt": "2020-03-05T21:33:22.108Z",
"bulkUploadId": "efcb9b27-5f28-11ea-8aa8-0bb2f3879538",
"resourceCreated": false,
"resourceName": "Example Hammer - Profile Desktop/IP Phone Display",
"resourceResponse": "Must be a valid, six-digit hexadecimal color value e.g. #FFFFFF (mainWindow.backgroundColor), Must be one of the following values: Arial, ArialBlack, ComicSansMS, Courier, CourierNew, Georgia, Helvetica, Impact, Times, TimesNewRoman, TrebuchetMS, Verdana (mainWindow.subject.font), Must be one of the following values: 8, 9, 10, 11, 12, 14, 16, 18, 20, 24, 30 (mainWindow.subject.size)",
"permissions": [
"get"
]
},
{
"id": "f02d432e-5f28-11ea-8aa8-d1a4866285e0",
"createdAt": "2020-03-05T21:33:22.108Z",
"bulkUploadId": "efcb9b27-5f28-11ea-8aa8-0bb2f3879538",
"resourceCreated": false,
"resourceName": "Example Hammer - Profile Fusion Server",
"resourceResponse": "One of the following files was missing from zip: mainAudio-40.wav, icon-40.jpg ()",
"permissions": [
"get"
]
},
{
"id": "f02d6a3f-5f28-11ea-8aa8-47a83464eb34",
"createdAt": "2020-03-05T21:33:22.108Z",
"bulkUploadId": "efcb9b27-5f28-11ea-8aa8-0bb2f3879538",
"resourceCreated": true,
"resourceName": "Example Hammer",
"resourceResponse": null,
"permissions": [
"get"
]
}
]
}
Gets a list of all bulk upload logs for a specific bulk upload instance to the current user. (The Permissions and Security Groups associated with the request, through the user attached to the access token, may limit the resources returned. Upload information is cleared daily, so records may not be retained.
HTTP Request
GET /bulk-upload/{bulkUploadId}/logs
Consumes
multipart/form-data
, application/x-www-form-urlencoded
, application/json
Produces
application/json
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
bulkUploadId | String | N/A | The ID of the bulk upload the logs are associated with. |
Response
The bulk upload response format is detailed here.
Get a Bulk Upload Instance
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/bulk-upload/bf5f4f46-2bb5-11e9-8180-5fe10bc30744/logs/f02d432c-5f28-11ea-8aa8-1569ae3ffa2c"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
print(requests.get(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/bulk-upload/bf5f4f46-2bb5-11e9-8180-5fe10bc30744/logs/f02d432c-5f28-11ea-8aa8-1569ae3ffa2c"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
puts(JSON.parse(HTTParty.get(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/bulk-upload/bf5f4f46-2bb5-11e9-8180-5fe10bc30744/logs/f02d432c-5f28-11ea-8aa8-1569ae3ffa2c" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"id": "f02d432c-5f28-11ea-8aa8-1569ae3ffa2c",
"createdAt": "2020-03-05T21:33:22.108Z",
"bulkUploadId": "efcb9b27-5f28-11ea-8aa8-0bb2f3879538",
"resourceCreated": true,
"resourceName": "Example Hammer - Profile",
"resourceResponse": null,
"permissions": [
"get"
]
}
Retrieves a single bulk upload by id
. Since this is not a list request, there is no pagination wrapper around the result.
HTTP Request
GET /bulk-upload/{bulkUploadId}/logs/{bulkUploadLogId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
bulkUploadId | The id of the bulk upload log to retrieve. |
bulkUploadLogId | The id of the bulk upload instance log is associated with. |
Response
The bulk upload response format is detailed here.
Bulk Upload Logs Response
The JSON document used to represent a Bulk Upload Log resource has the following content:
Attribute | Type | Description |
---|---|---|
createdAt | ISO 8601 date/time | When this bulk upload was initiated. |
bulkUploadId | String | The id of the associated bulk upload instance. |
id | String | The id of the bulk upload log, for efficient retrieval, manipulation, or looking up sub-resources attached to the bulk upload. |
resourceCreated | Boolean | Whether or not the resource’s creation (or attempted creation) was successful. |
resourceName | String | The name of the resource that was created (or attempted to be created). |
resourceResponse | String | A string describing the response from the resource when it was created (or attempted to be created). This will be null on a success, but it will be a string of errors in the case of a failure. |
permissions | Array[String] | Options: get . Which operations are possible on this resource, given the authentication token being used to access the API. |
Collaboration Groups
Collaboration Groups serve as a means of initiating group conversations, such as via a conference call, a Cisco Webex Teams space, Twitter, Outbound CAP, and Outbound RSS. Other integrations will likely be added in the future.
Conference Call
A conference call collaboration group must define a Join
PIN. This Join PIN will be sent to all of the collaboration
group’s members’ text-capable devices, along with the
conference call phone number to dial. The members’ phone-call
devices will instead be called, and the person answering the call will
be prompted to join the conference call without the need to enter a
Join PIN.
Unless otherwise noted, conference calls can be joined via the campaign number defined in The Numbers Report (all outbound phone calls will originate from this number as well). A conference call based collaboration group can optionally be configured with a Create PIN or to Bypass IVR.
A Create PIN allows users to start the conference call by calling into
the same number described above and entering a *
followed by the
Create PIN. When a Create PIN is specified and used in this way, calls
are placed to the group’s phone-call
devices, and a basic
notification is sent to non-phone-call
devices, giving them
instructions on how to join the conference call. If no Create PIN is
configured, users will not be able to start the collaboration group by
calling, and will always need to do so by sending a
Notification.
When Bypass IVR is selected in the collaboration group configuration,
all phone-call
devices will be dropped immediately into the
conference call as soon as the call is answered. In other words, the
users will not be prompted to join the call through an IVR (the
default behavior). This holds true unless the user is asked to join
multiple conference calls, in which case they would receive the IVR
prompt regardless.
Cisco Webex Teams
A Cisco Webex Teams collaboration group two different modes: specificSpace
and
newSpace
.
When a notification is sent to a newSpace
, the Webex Teams integration
will create a new Webex Teams space using the mandatory name field in
newSpace.name
. It will also suffix the name with a generated
timestamp. Then, it will invite all of the users and distribution
lists to join the Webex Teams space.
When a notification is sent to a specificSpace
, it will invite the
configured recipients to specificSpace.spaceId
. Note that recipients
are optional in this mode. Also, the InformaCast bot must be a member
of this space.
To better construct the properties for these types of collaboration groups, please see the Webex Teams API .
Twitter collaboration groups allow notifications to be sent as tweets for a specified Twitter account.
In order to create a Twitter collaboration group, you must specify the twitter
collaboration group type and provide the required set of properties specified
in the examples below.
Outbound CAP
Outbound CAP collaboration groups are used to reach endpoints that support receiving CAP notifications. Like outbound RSS collaboration groups, this is meant mostly for use with digital signage.
This particular variety of collaboration group has locations and connection configurations which allows for communication with endpoints that require authentication. Further, in order to further tailor notifications received by these endpoints, notification profiles can be used to send more information about any given notification to its CAP recipients.
Note that a connection configuration must be created in order to create an outbound
CAP collaboration group. Likewise, when creating a collaboration group of this variety,
ensure that you specify the outbound-cap
collaboration group type.
Outbound RSS
Outbound RSS collaborations groups are meant to consume notifications and convert those into an RSS feed for consumption. This is primarily used for digital signage, which can take in RSS data and produce a feed of notifications that can be read by users.
When a new outbound RSS feed is created, a URL is generated. Based on selections during the creation process, this feed will either contain just the most recent message sent to the outbound RSS collaboration group or it will contain all the messages that have been sent to the feed. You may also disable the feed, which will prevent display, but will not stop notifications from being delivered to said feed.
In order to create an outbound RSS collaboration group, you must specify the
outbound-rss
collaboration group type, provide its view policy, and whether
or not the feed is disabled.
Microsoft Teams
Using Microsoft Teams collaboration groups, send mass notifications to Teams
channels. Collaboration groups do that by providing a collaboration
group type, msteams-channel
. Sending a notification to an msteams-channel
collaboration group launches a notification to the corresponding
Teams channel.
Type msteams-channel
collaboration groups require InformaCast Fusion, the InformaCast
bot must be added to a Microsoft Teams tenant and connected to a provider, and
the Microsoft Teams Channel feature needs to be activated. Creating an
msteams-channel
collaboration group only works for teams that have a connected
InformaCast bot.
Creating an msteams-channel
collaboration group requires a unique set of
request parameters, as seen in the example.
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/collaboration-groups"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'name': 'foo',
'type': 'msteams-channel',
'properties': {
'channelId': 'bar',
'channelName': 'bazz',
'disabled': false,
'teamId': 'buzz',
'teamName': 'quux'
}
}
try:
list = requests.post(url, headers=headers, data=json.dumps(data)).json()
print(list)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/collaboration-groups"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'name': 'foo'
,
'type': 'msteams-channel'
,
'properties': {
'channelId': 'bar'
,
'channelName': 'bazz'
,
'disabled': false
,
'teamId': 'buzz'
,
'teamName': 'quux'
}
}
begin:
list = JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body)))
puts(list)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/collaboration-groups" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"name": "foo", \
"type": "msteams-channel", \
"properties": {"channelId": "bar", \
"channelName": "bazz", \
"disabled": false, \
"teamId": "buzz", \
"teamName": "quux"}}'
{
"total":1,
"previous":null,
"next":null,
"partial":false,
"data":[{
"properties": {
"channelId":"bar",
"channelName":"bazz",
"disabled":false,
"teamId":"buzz",
"teamName":"quux"
},
"permissions":["put","delete","get"],
"name":"foo",
"createdAt":"2021-01-13T12:00:00.000Z",
"type":"msteams-channel",
"distributionListIds":[],
"id":"quuux",
"distributionLists":[],
"userIds":[],
"users":[]}]
}
HTTP Request
POST /collaboration-groups
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
name | String | N/A | The name to give the new collaboration group. May be up to 140 characters long. |
type | String | N/A | msteams-channel . Specifies the type of collaboration group. |
properties[channelName] | String | N/A | Required when type is msteams-channel . |
properties[channelId] | String | N/A | Required when type is msteams-channel . |
properties[disabled] | boolean | N/A | Required when type is msteams-channel . |
properties[teamId] | String | N/A | Required when type is msteams-channel . |
properties[teamName] | String | N/A | Required when type is msteams-channel . |
Response
The collaboration group response format is detailed here.
Get All Collaboration Groups
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/collaboration-groups"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
params = {
'limit': 1
}
try:
print(requests.get(url, headers=headers, params=params).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/collaboration-groups"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
query = {
'limit': 1
}
begin:
puts(JSON.parse(HTTParty.get(url, headers: headers, query: query)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/collaboration-groups?limit=1" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"total": 3,
"partial": false,
"previous": null,
"next": null,
"data": [
{
"properties": {
"joinPin": "1234",
"createPin": null,
"bypassIvr": false
},
"permissions": ["delete", "put", "get"],
"name": "Security Officers",
"createdAt": "2016-01-07T15:54:09.065Z",
"type": "conference-call",
"distributionListIds": ["3875f8ae-139c-11e6-9cd0-ef8b5b11547d"],
"id": "e3579191-b556-11e5-ab29-bdfc7d2b6ed8",
"distributionLists": [
{
"id": "3875f8ae-139c-11e6-9cd0-ef8b5b11547d",
"name": "Security Officers",
"campaign": null,
"createdAt": "2016-05-06T15:07:16.446Z"
}
],
"userIds": [],
"users": []
},
{
"properties": {
"mode": "specificSpace",
"enableCreate": false,
"specificSpace": {
"spaceId": "Y2lzY29zcGFyazovL3VzL1JPT00vYjczY2Q2OTAtMmMyMS0xMWU3LTg4MjktMmRiY2EzYmYzMTE0"
}
},
"permissions": ["delete", "put", "get"],
"name": "Security Webex Team",
"createdAt": "2017-04-13T13:21:56.273Z",
"type": "cisco-spark",
"distributionListIds": [],
"id": "2a9e9ad1-204c-11e7-b964-8f83c5e03f72",
"distributionLists": [],
"userIds": [],
"users": []
},
{
"properties": {
"handle": "acmeSchoolDistrict",
"name": "Acme School District",
"objectId": "1234567890123456789",
"valid": true
},
"permissions": ["delete", "put", "get"],
"name": "Acme School District Twitter Account",
"createdAt": "2018-04-13T13:21:56.273Z",
"type": "twitter",
"distributionListIds": [],
"id": "3aa99ad1-204c-22e7-b734-8f83c5e03f73",
"distributionLists": [],
"userIds": [],
"users": []
}
]
}
Gets a list of all collaboration groups available to the current user. (The Permissions and Security Groups associated with the request, through the user attached to the access token, may limit the resources returned. Controlling access to collaboration groups allows administrators to decide with whom users can collaborate.)
HTTP Request
GET /collaboration-groups
Produces
application/json
Query Parameters
You can retrieve only collaboration groups of a specific type by
adding a type
query parameter whose value is the collaboration group
type you are interested in. For example, to get only conference calls,
?type=conference-call
.
To make this example more manageable, only the first collaboration group was requested using the API’s pagination parameters. The response reflects this, as well as the fact that there were a total of two available when the request was made. The Informacast Mobile API offers a standard pagination mechanism for list requests like this.
Parameter | Type | Description |
---|---|---|
includeDomains | Boolean | If true , include the list of Domains to which each collaboration group belongs. |
Response
The collaboration group response format is detailed here.
Get One Collaboration Group
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/collaboration-groups/e3579191-b556-11e5-ab29-bdfc7d2b6ed8"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
list = requests.get(url, headers=headers).json()
print(list)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/collaboration-groups/e3579191-b556-11e5-ab29-bdfc7d2b6ed8"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
list = JSON.parse(HTTParty.get(url, headers: headers))
puts(list)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/collaboration-groups/e3579191-b556-11e5-ab29-bdfc7d2b6ed8" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"properties": {
"joinPin": "1234",
"createPin": null,
"bypassIvr": false
},
"permissions": [
"delete",
"put",
"get"
],
"name": "Security Officers",
"createdAt": "2016-01-07T15:54:09.065Z",
"type": "conference-call",
"distributionListIds": ["3875f8ae-139c-11e6-9cd0-ef8b5b11547d"],
"id": "e3579191-b556-11e5-ab29-bdfc7d2b6ed8",
"distributionLists": [
{
"id": "3875f8ae-139c-11e6-9cd0-ef8b5b11547d",
"name": "Security Officers",
"campaign": null,
"createdAt": "2016-05-06T15:07:16.446Z"
}
],
"userIds": [],
"users": []
}
Retrieves a single collaboration group by its id
. Since this is not a list request, there is no pagination wrapper around the result.
HTTP Request
GET /collaboration-groups/{collaborationGroupId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
collaborationGroupId | The id of the collaboration group to retrieve. |
Query Parameters
Parameter | Type | Description |
---|---|---|
includeDomains | Boolean | If true , include the list of Domains to which the collaboration group belongs. |
Response
The collaboration group response format is detailed here.
Create a Collaboration Group
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/collaboration-groups"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'name': 'Security Officers',
'type': 'conference-call',
'distributionListIds': ['3875f8ae-139c-11e6-9cd0-ef8b5b11547d'],
'userIds': [],
'properties': {
'joinPin': '1234',
'bypassIvr': false
}
}
try:
list = requests.post(url, headers=headers, data=json.dumps(data)).json()
print(list)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/collaboration-groups"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'name': 'Security Officers'
,
'type': 'conference-call'
,
'distributionListIds': ['3875f8ae-139c-11e6-9cd0-ef8b5b11547d'
]
,
'userIds': []
,
'properties': {
'joinPin': '1234'
,
'bypassIvr': false
}
}
begin:
list = JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body)))
puts(list)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/collaboration-groups" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"name": "Security Officers", \
"type": "conference-call", \
"distributionListIds": ["3875f8ae-139c-11e6-9cd0-ef8b5b11547d"], \
"userIds": [], \
"properties": {"joinPin": "1234", \
"bypassIvr": false}}'
{
"properties": {
"joinPin": "1234",
"createPin": null,
"bypassIvr": false
},
"permissions": [
"delete",
"put",
"get"
],
"name": "Security Officers",
"createdAt": "2016-01-07T15:54:09.065Z",
"type": "conference-call",
"distributionListIds": ["3875f8ae-139c-11e6-9cd0-ef8b5b11547d"],
"id": "e3579191-b556-11e5-ab29-bdfc7d2b6ed8",
"distributionLists": [
{
"id": "3875f8ae-139c-11e6-9cd0-ef8b5b11547d",
"name": "Security Officers",
"campaign": null,
"createdAt": "2016-05-06T15:07:16.446Z"
}
],
"userIds": [],
"users": []
}
Creates a new collaboration group. As described above, depending on the nature of the group, user or distribution list IDs may need to be present in order for the group to be successfully created.
HTTP Request
POST /collaboration-groups
Consumes
multipart/form-data, application/x-www-form-urlencoded, application/json
Produces
application/json
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
name | String | N/A | The name to give the new collaboration group. May be up to 140 characters long. |
type | String | N/A | Options: conference-call , cisco-spark , twitter , outbound-cap , outbound-rss or msteams-channel . Specifies the type of collaboration group. |
distributionListIds | Array[UUID] | N/A | A list of id s of Distribution Lists which should, by default, receive notifications based on this collaboration group. |
userIds | Array[UUID] | N/A | A list of id s of Users which should, by default, receive notifications based on this collaboration group. |
properties[bypassIvr] | boolean | N/A | Optional when type is conference-call . Can be used to skip the IVR when there is only a single conference call to join for phone-call devices. |
properties[createPin] | String | N/A | Optional when type is conference-call . Must be between 4 and 8 digits and be unique. |
properties[joinPin] | String | N/A | Required when type is conference-call . Must be between 4 and 8 digits and be unique. |
properties[mode] | String | N/A | Required when type is cisco-spark . Options: newSpace or specificSpace |
properties[newSpace][name] | String | N/A | Required when type is cisco-spark and properties[mode] is newSpace . This is the prefix of the name of the Webex Teams space that will be created during send time. |
properties[specificSpace][spaceId] | String | N/A | Required when type is cisco-spark and properties[mode] is specificSpace . This is the space id by which the notification will be posted to at send time. |
properties[accessToken] | String | N/A | Required when type is twitter . This is the access token used for authenticating requests to twitter for the specified Twitter account. |
properties[accessTokenSecret] | String | N/A | Required when type is twitter . This is the access token secret for the Twitter access token. |
properties[handle] | String | N/A | Required when type is twitter . This is the Twitter account handle. |
properties[name] | String | N/A | Required when type is twitter . This is the Twitter account name. |
properties[objectId] | String | N/A | Required when type is twitter . This is the Twitter account ID. |
properties[valid] | boolean | N/A | Required when type is twitter . This denotes whether the access token and access token secret are valid. |
properties[location] | String | N/A | Required when type is outbound-cap . This is a description of the location of the event, which can be used by other systems for routing the CAP message to the correct location. |
properties[connection] | String | N/A | The name of the connection configuration to use to send the CAP message. This value must match the name of a connection configuration defined on the Outbound CAP extension. |
properties[disabled] | boolean | N/A | Required when type is outbound-rss . |
properties[displayPolicy] | String | N/A | Required when type is outbound-rss . Must be either display-all or most-recent . |
Response
The collaboration group response format is detailed here.
Update a Collaboration Group
# Continuing with the collaboration group object
# from the previous example:
try:
list = requests.put(url, headers=headers, data=json.dumps(data)).json()
print(list)
except RequestException as e:
print('Unexpected error!', e)
# Continuing with the collaboration group object
# from the previous example:
begin:
list = JSON.parse(HTTParty.put(url, headers: headers, body: JSON.dump(body)))
puts(list)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/collaboration-groups/e3579191-b556-11e5-ab29-bdfc7d2b6ed8" \
-X PUT \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"properties": {"joinPin": "865301", \
"bypassIvr": true}}'
{
"properties": {
"joinPin": "865301",
"createPin": null,
"bypassIvr": true
},
"permissions": [
"delete",
"put",
"get"
],
"name": "Security Officers",
"createdAt": "2016-01-07T15:54:09.065Z",
"type": "conference-call",
"distributionListIds": ["3875f8ae-139c-11e6-9cd0-ef8b5b11547d"],
"id": "e3579191-b556-11e5-ab29-bdfc7d2b6ed8",
"distributionLists": [
{
"id": "3875f8ae-139c-11e6-9cd0-ef8b5b11547d",
"name": "Security Officers",
"campaign": null,
"createdAt": "2016-05-06T15:07:16.446Z"
}
],
"userIds": [],
"users": []
}
Modifies the type or properties of a collaboration group.
HTTP Request
PUT /collaboration-groups/{collaborationGroupId}
Consumes
multipart/form-data, application/x-www-form-urlencoded, application/json
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
collaborationGroupId | The id of the collaboration group to update. |
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
name | String | N/A | The name to give the new collaboration group. May be up to 140 characters long. |
type | String | N/A | Options: conference-call , cisco-spark , twitter , outbound-cap , outbound-rss or msteams-channel . Specifies the type of collaboration group. |
distributionListIds | Array[UUID] | N/A | A list of id s of Distribution Lists which should, by default, receive notifications based on this collaboration group. |
userIds | Array[UUID] | N/A | A list of id s of Users which should, by default, receive notifications based on this collaboration group. |
properties[bypassIvr] | boolean | N/A | Optional when type is conference-call . Can be used to skip the IVR when there is only a single conference call to join for phone-call devices. |
properties[createPin] | String | N/A | Optional when type is conference-call . Must be between 4 and 8 digits and be unique. |
properties[joinPin] | String | N/A | Required when type is conference-call . Must be between 4 and 8 digits and be unique. |
properties[mode] | String | N/A | Required when type is cisco-spark . Options: newSpace or specificSpace |
properties[newSpace][name] | String | N/A | Required when type is cisco-spark and properties[mode] is newSpace . This is the prefix of the name of the Webex Teams space that will be created during send time. |
properties[specificSpace][spaceId] | String | N/A | Required when type is cisco-spark and properties[mode] is specificSpace . This is the space id by which the notification will be posted to at send time. |
properties[handle] | String | N/A | Required when type is twitter . This is the Twitter account handle. |
properties[name] | String | N/A | Required when type is twitter . This is the Twitter account name. |
properties[objectId] | String | N/A | Required when type is twitter . This is the Twitter account ID. |
properties[valid] | boolean | N/A | Required when type is twitter . This denotes whether the access token and access token secret are valid. |
properties[location] | String | N/A | Required when type is outbound-cap . This is a description of the location of the event, which can be used by other systems for routing the CAP message to the correct location. |
properties[connection] | String | N/A | The name of the connection configuration to use to send the CAP message. This value must match the name of a connection configuration defined on the Outbound CAP extension. |
properties[disabled] | boolean | N/A | Required when type is outbound-rss . |
properties[displayPolicy] | String | N/A | Required when type is outbound-rss . Must be either display-all or most-recent . |
Response
The collaboration group response format is detailed here.
Remove a Collaboration Group
# Continuing with the collaboration group object
# from the previous example:
try:
print(requests.delete(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
# Continuing with the collaboration group object
# from the previous example:
begin:
puts(JSON.parse(HTTParty.delete(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/collaboration-groups/e3579191-b556-11e5-ab29-bdfc7d2b6ed8" \
-X DELETE \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Accept: application/json"
{
"status": 200,
"message": "deleted {:name \"CollaborationGroups\"} e3579191-b556-11e5-ab29-bdfc7d2b6ed8"
}
Removes a collaboration group.
HTTP Request
DELETE /collaboration-groups/{collaborationGroupId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
collaborationGroupId | The id of the collaboration group to delete. |
Response
The deletion response format is detailed here.
Collaboration Group Response
The JSON document used to represent a collaboration group resource has the following content:
Attribute | Type | Description |
---|---|---|
createdAt | ISO 8601 date/time | When this collaboration group was created. |
distributionListIds | Array[String] | The id s of the distribution lists which are members of the group. |
distributionLists | Array[DistributionList] | The Distribution Lists that are members of the group. |
id | String | The id of this specific collaboration group, allowing it to be manipulated or retrieved individually. |
name | String | The collaboration group name. May be up to 140 characters long. |
permissions | Array[String] | Options: get put delete . Which operations are possible on this resource, given the authentication token being used to access the API. |
type | String | Options: conference-call , cisco-spark , twitter , outbound-cap , outbound-rss or msteams-channel . Specifies the type of collaboration group. |
userIds | Array[String] | The id s of the users which are members of the group. |
users | Array[User] | The Users that are members of the group. |
properties[bypassIvr] | boolean | The conference call Skip IVR setting. |
properties[createPin] | String | The conference call Create PIN. |
properties[joinPin] | String | The conference call Join PIN. |
properties[mode] | String | The Cisco Webex Teams mode. Either newSpace or specificSpace . |
properties[newSpace][name] | String | The Webex Teams space name prefix of the Webex Teams space that will be created during send time. |
properties[specificSpace][spaceId] | String | The Webex Teams space id (that the InformaCast Bot belongs to) by which the notification will be posted to at send time. |
properties[handle] | String | The Twitter account handle. |
properties[name] | String | The Twitter account name. |
properties[objectId] | String | The Twitter account ID. |
properties[valid] | boolean | Whether the stored Twitter account tokens are valid. |
properties[location] | String | The Outbound CAP event location. |
properties[connection] | String | The name of the Outbound CAP connection configuration being used to send the CAP message. |
properties[disabled] | boolean | Whether or not the Outbound RSS feed is enabled/disabled. |
properties[displayPolicy] | boolean | The Outbound RSS feed display policy. Must be either display-all , which will show all active notifications in the feed, or most-recent , which will only show the most recent notification if it’s active, or an empty feed if the most recent notification is not active. |
Collaboration Group Domains
Domains allow for hierarchical delegation of authority over supported resources. When they are in use, Collaboration Groups are assigned to at least one Domain, and can be associated with more than one. This resource lets you see and adjust which Collaboration Groups are assigned to which Domains.
List All Collaboration Group Domains
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/collaboration-groups/c54e4241-299b-11e8-94d3-2be9464da125/domains"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
print(requests.get(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/collaboration-groups/c54e4241-299b-11e8-94d3-2be9464da125/domains"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
puts(JSON.parse(HTTParty.get(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/collaboration-groups/c54e4241-299b-11e8-94d3-2be9464da125/domains" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"total": 2,
"previous": null,
"next": null,
"partial": false,
"data": [
{
"id": "a4e9e56c-28df-11e8-8c38-738c606ef19c",
"parentId": "9ca35dab-28df-11e8-8c38-235a5737f6bb",
"name": "Vending",
"path": "/90de0f6a-28df-11e8-8c38-e9fe0f3683de/9ca35dab-28df-11e8-8c38-235a5737f6bb/a4e9e56c-28df-11e8-8c38-738c606ef19c/",
"namePath": "/West Campus/Stadium/Vending/",
"collaborationGroupId": "c54e4241-299b-11e8-94d3-2be9464da125",
"permissions": [
"delete",
"put",
"get"
],
"createdAt": "2018-03-16T06:02:44.441Z"
},
{
"id": "f04e3599-295b-11e8-b54b-abb9a309846e",
"parentId": "9ca35dab-28df-11e8-8c38-235a5737f6bb",
"name": "Grounds",
"path": "/90de0f6a-28df-11e8-8c38-e9fe0f3683de/9ca35dab-28df-11e8-8c38-235a5737f6bb/f04e3599-295b-11e8-b54b-abb9a309846e/",
"namePath": "/West Campus/Stadium/Grounds/",
"collaborationGroupId": "c54e4241-299b-11e8-94d3-2be9464da125",
"permissions": [
"delete",
"put",
"get"
],
"createdAt": "2018-03-16T20:52:28.522Z"
}
]
}
Retrieves the list of all Domains to which the Collaboration Group belongs. (The permissions associated with the request, through the user attached to the access token, may limit the visibility of results.)
HTTP Request
GET /collaboration-groups/{collaborationGroupId}/domains
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
collaborationGroupId | The id of the Collaboration Group whose associated Domains are to be listed. |
Query Parameters
In this example, There were a total of 2 Domains that the specified Collaboration Group belonged to when the request was made, and both were returned. The Informacast Mobile API offers a standard pagination mechanism for list requests like this.
Additionally, you can request the subdomains of any Domain attached to the specified Collaboration Group using a query parameter, and/or filter the results by matching on the Domain name:
Parameter | Type | Description |
---|---|---|
name | String | Returns only Domains whose names exactly match the supplied value. |
recursive | Boolean | If true , in addition to Domains that are directly attached to the specified Collaboration Group, any subdomains will be returned. |
Response
The Domain response format is detailed here.
Additionally, the id
of the collaboration group whose domains were
requested is returned under the key collaborationGroupId
inside each
domain response.
Check if a Collaboration Group contains a Domain
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/collaboration-groups/c54e4241-299b-11e8-94d3-2be9464da125/domains/f04e3599-295b-11e8-b54b-abb9a309846e"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
domain = requests.get(url, headers=headers).json()
print(domain)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/collaboration-groups/c54e4241-299b-11e8-94d3-2be9464da125/domains/f04e3599-295b-11e8-b54b-abb9a309846e"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
domain = JSON.parse(HTTParty.get(url, headers: headers))
puts(domain)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/collaboration-groups/c54e4241-299b-11e8-94d3-2be9464da125/domains/f04e3599-295b-11e8-b54b-abb9a309846e" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"id": "f04e3599-295b-11e8-b54b-abb9a309846e",
"parentId": "9ca35dab-28df-11e8-8c38-235a5737f6bb",
"name": "Grounds",
"path": "/90de0f6a-28df-11e8-8c38-e9fe0f3683de/9ca35dab-28df-11e8-8c38-235a5737f6bb/f04e3599-295b-11e8-b54b-abb9a309846e/",
"namePath": "/West Campus/Stadium/Grounds/",
"collaborationGroupId": "c54e4241-299b-11e8-94d3-2be9464da125",
"permissions": [
"delete",
"put",
"get"
],
"createdAt": "2018-03-16T20:52:28.522Z"
}
Retrieves a single Collaboration Group Domain by id
. Since this is not a list
request, there is no pagination wrapper around the result.
HTTP Request
GET /collaboration-groups/{collaborationGroupId}/domains/{id}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
collaborationGroupId | The id of the Collaboration Group whose Domains are of interest. |
id | The id of the Domain you want to know whether the Collaboration Group belongs to. |
Additionally, you can check if the Collaboration Group is attached to any subdomains of the specified Domain using a query parameter:
Parameter | Type | Description |
---|---|---|
recursive | boolean | If true , in addition to Domains that are directly attached to the specified Collaboration Group, any of their subdomains will be considered. |
Response
If the Collaboration Group is part of the Domain (or its subdomains, if
recursive
is true
), a response will be returned. The Domain
response format is detailed here. If
the list is not in the Domain, the response status will indicate that
the requested resource cannot be found.
Add a Collaboration Group Domain
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/collaboration-groups/c54e4241-299b-11e8-94d3-2be9464da125/domains"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'id': 'a4e9e56c-28df-11e8-8c38-738c606ef19c'
}
try:
domain = requests.post(url, headers=headers, data=json.dumps(data)).json()
print(domain)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/collaboration-groups/c54e4241-299b-11e8-94d3-2be9464da125/domains"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'id': 'a4e9e56c-28df-11e8-8c38-738c606ef19c'
}
begin:
domain = JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body)))
puts(domain)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/collaboration-groups/c54e4241-299b-11e8-94d3-2be9464da125/domains" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"id": "a4e9e56c-28df-11e8-8c38-738c606ef19c"}'
{
"id": "a4e9e56c-28df-11e8-8c38-738c606ef19c",
"parentId": "9ca35dab-28df-11e8-8c38-235a5737f6bb",
"name": "Vending",
"path": "/90de0f6a-28df-11e8-8c38-e9fe0f3683de/9ca35dab-28df-11e8-8c38-235a5737f6bb/a4e9e56c-28df-11e8-8c38-738c606ef19c/",
"namePath": "/West Campus/Stadium/Vending/",
"collaborationGroupId": "c54e4241-299b-11e8-94d3-2be9464da125",
"permissions": [
"delete",
"put",
"get"
],
"createdAt": "2018-03-16T06:02:44.441Z"
}
Puts the Collaboration Group into the specified Domain. As described below, this may be considered a promotion or demotion, which would require additional request parameters in order to validate.
HTTP Request
POST /collaboration-groups/{collaborationGroupId}/domains
Produces
application/json
Path Parameters
Parameter | Type | Description |
---|---|---|
collaborationGroupId | String | The id of the Collaboration Group to be added to the Domain. |
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
demote | Boolean | false |
Allow this request to proceed even if it will demote the Collaboration Group out of a parent Domain? |
id | String | n/a | The id of the Domain to which the Collaboration Group should be added. |
promote | Boolean | false |
Allow this request to proceed even if it will promote the Collaboration Group out of one or more child Domains? |
A Collaboration Group is not allowed to be explicitly part of any Domain
that it is implicitly granted membership to by belonging to a
parent Domain. For example, if you take a Collaboration Group that is in
Domains /West Campus/
and /East Campus/
, and try to add it to
/West Campus/Gym/
that request will fail because it is already
implicitly in that domain through belonging to the parent
/West Campus/
Domain. See the full explanation of
promotion and demotion
in the context of Domains and Users for more details and illustrations.
Remove a Collaboration Group Domain
# Continuing with the domain object from the
# previous example:
try:
print(requests.delete(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
# Continuing with the domain object from the
# previous example:
begin:
puts(JSON.parse(HTTParty.delete(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/collaboration-groups/c54e4241-299b-11e8-94d3-2be9464da125/domains/f04e3599-295b-11e8-b54b-abb9a309846e" \
-X DELETE \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Accept: application/json"
{
"status": 200,
"message": "deleted Domain Collaboration Group c54e4241-299b-11e8-94d3-2be9464da125"
}
Removes the specified Collaboration Group from the specified Domain. As described below, if this is the only Domain that the Collaboration Group currently belongs to, you need to supply an additional request parameter to confirm the deletion of the Collaboration Group itself.
HTTP Request
DELETE /collaboration-groups/{collaborationGroupId}/domains/{id}
Produces
application/json
Path Parameters
Parameter | Type | Description |
---|---|---|
collaborationGroupId | The id of the Collaboration Group whose Domain should be removed. |
|
id | The id of the Domain to be removed from the Collaboration Group. |
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
orphans | String | fail |
Option: delete , fail . What to do if this would leave the Collaboration Group in no Domain. |
A Collaboration Group must always belong to at least one Domain, so if you try to
remove the Collaboration Group from the only Domain that it belongs to, the request
must either fail, or delete the Collaboration Group. The request parameter orphans
lets you control which of those takes place. The default, if you
supply no instructions, is for the request to fail, and you will
receive a validation error explaining why. If you pass a value of
delete
for the orphans
request parameter, then taking a Collaboration Group out
of its last Domain will delete the Collaboration Group.
Response
The deletion response format is detailed here.
Confirmation Requests
Confirmation requests provide a mechanism by which recipients of a Notification can be asked a question, with a list of options from which they may choose a response.
Confirmation requests may also have Escalation Rules attached to them, which can lead to further notifications being sent unless suitable responses are received within a specified time frame. Additionally, any Dynamic Replies attached may reply immediately to a confirmation response to provide confirmation feedback.
List All Confirmation Requests
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/confirmation-requests"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
params = {
'limit': 1
}
try:
print(requests.get(url, headers=headers, params=params).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/confirmation-requests"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
query = {
'limit': 1
}
begin:
puts(JSON.parse(HTTParty.get(url, headers: headers, query: query)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/confirmation-requests?limit=1" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"total": 2,
"partial": true,
"previous": null,
"next": "WyJoYWlsIiwiMzdmMGY1MDAtMWJlMC0xMWU0LTkxODEtM2M5NzBlN2ZmNTYwIl0=",
"data": [
{
"permissions": ["delete", "put", "get"],
"escalationRules": [
{
"optionLabel": "Yes, I saw seen the intruder",
"subject": "The intruder has been spotted!",
"distributionListIds": ["af94ef60-1d9a-11e4-a054-3c970e7ff560"],
"comparison": "LT",
"image": null,
"audio": null,
"delay": 600,
"comparisonValue": 5,
"confirmationRequestId": "c7bc65e0-1bde-11e4-9181-3c970e7ff560",
"createdAt": "2014-08-11T14:03:45.434Z",
"messageTemplateId": null,
"body": "",
"id": "4f062fa0-2160-11e4-ba87-3c970e7ff560"
}
],
"dynamicReplies": [
{
"createdAt": "2014-08-11T14:17:48.343Z",
"quota": 5,
"confirmationRequestId": "c7bc65e0-1bde-11e4-9181-3c970e7ff560",
"id": "453b8e00-2162-11e4-986a-2707a9326e84",
"optionLabel": "Yes, I saw the intruder",
"first": "Let's get 'em, Gumshoes!",
"rest": "Stand by. We're already on the case.",
"every": null
}
],
"id": "c7bc65e0-1bde-11e4-9181-3c970e7ff560",
"createdAt": "2014-08-04T13:53:57.566Z",
"expirationPeriod": 3600,
"options": ["Yes, I saw the intruder", "No, I have not"],
"initiateTrackingOptions": [true, false],
"name": "Have you seen the intruder?"
}
]
}
Retrieves all confirmation requests available to the user. (The Permissions and Security Groups associated with the request, through the user attached to the access token, may limit the resources returned. Controlling access to confirmation requests allows administrators to decide which responses are available to notifications they send, although an even simpler approach is to tie an appropriate confirmation request to a Message Template and not allow it to be changed when sending notifications based on that template.)
HTTP Request
GET /confirmation-requests
Produces
application/json
Query Parameters
To make this example more concise, only the first confirmation request was requested using the API’s pagination parameters. The response reflects this, as well as the fact that there were a total of two available when the request was made. The Informacast Mobile API offers a standard pagination mechanism for list requests like this.
Parameter | Type | Description |
---|---|---|
includeDomains | Boolean | If true , include the list of Domains to which each confirmation request belongs. |
Response
The confirmation request response format is detailed here.
Get a Confirmation Request
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/confirmation-requests/c7bc65e0-1bde-11e4-9181-3c970e7ff560"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
cr = requests.get(url, headers=headers).json()
print(cr)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/confirmation-requests/c7bc65e0-1bde-11e4-9181-3c970e7ff560"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
cr = JSON.parse(HTTParty.get(url, headers: headers))
puts(cr)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/confirmation-requests/c7bc65e0-1bde-11e4-9181-3c970e7ff560" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"permissions": ["delete", "put", "get"],
"escalationRules": [
{
"optionLabel": "Yes, I saw the intruder",
"subject": "The intruder has been spotted!",
"distributionListIds": ["af94ef60-1d9a-11e4-a054-3c970e7ff560"],
"comparison": "GT",
"image": null,
"audio": null,
"delay": 600,
"comparisonValue": 0,
"confirmationRequestId": "c7bc65e0-1bde-11e4-9181-3c970e7ff560",
"createdAt": "2014-08-11T14:03:45.434Z",
"body": "",
"id": "4f062fa0-2160-11e4-ba87-3c970e7ff560"
}
],
"dynamicReplies": [
{
"createdAt": "2014-08-11T14:17:48.343Z",
"quota": 5,
"confirmationRequestId": "c7bc65e0-1bde-11e4-9181-3c970e7ff560",
"id": "453b8e00-2162-11e4-986a-2707a9326e84",
"optionLabel": "Yes, I saw the intruder",
"first": "Let's get 'em, Gumshoes!",
"rest": "Stand by. We're already on the case.",
"every": null
}
],
"id": "c7bc65e0-1bde-11e4-9181-3c970e7ff560",
"createdAt": "2014-08-04T13:53:57.566Z",
"expirationPeriod": 3600,
"options": ["Yes, I saw the intruder", "No, I have not"],
"initiateTrackingOptions": [true, false],
"name": "Have you seen the intruder?"
}
Retrieves a single confirmation request by its id
. Since this is not a list request, there is no pagination wrapper around the result.
HTTP Request
GET /confirmation-requests/{confirmationRequestId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
confirmationRequestId | The id of the specific confirmation request to retrieve. |
Query Parameters
Parameter | Type | Description |
---|---|---|
includeDomains | Boolean | If true , include the list of Domains to which this confirmation request belongs. |
Response
The confirmation request response format is detailed here.
Create a Confirmation Request
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/confirmation-requests"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'name': 'Are you safe?',
'options': ['No, please call me!', 'Yes, I am safe.'],
'initiate-tracking-options': [true, false]
}
try:
cr = requests.post(url, headers=headers, data=json.dumps(data)).json()
print(cr)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/confirmation-requests"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'name': 'Are you safe?'
,
'options': ['No, please call me!'
, 'Yes, I am safe.'
]
,
'initiate-tracking-options': [true
, false
]
}
begin:
cr = JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body)))
puts(cr)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/confirmation-requests" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"name": "Are you safe?", \
"options": ["No, please call me!", "Yes, I am safe."], \
"initiate-tracking-options": [true, false]}'
{
"permissions": ["delete", "put", "get"],
"escalationRules": [ ],
"createdAt": "2014-08-11T16:22:14.333Z",
"id": "a7838ed0-2173-11e4-ba87-3c970e7ff560",
"options": ["No, please call me!", "Atop Mount Olympus"],
"initiateTrackingOptions": [true, false],
"expirationPeriod": 36000,
"name": "Are you safe?"
}
Creates a confirmation request
HTTP Request
POST /confirmation-requests
Consumes
multipart/form-data, application/x-www-form-urlencoded, application/json
Produces
application/json
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
name | String | N/A | The name of the confirmation request, which is the prompt that will be presented to the user. May be up to 140 characters long, and should likely end with a question mark. |
options | Array[String] | N/A | A list of all the response choices that will be available to the recipient. At most 16 options may be provided. |
initiateTrackingOptions | Array[boolean] | N/A | Matched with options you can specify which options should initiate tracking. |
expirationPeriod | Integer | 0 | Duration in seconds for which the confirmation request will be active and responses will be accepted. Defaults to 0, which means the confirmation request is available to accept responses indefinitely. |
Response
The confirmation request response format is detailed here.
Update a Confirmation Request
# Continuing with the confirmation request
# object from the previous example:
try:
print(requests.put(url, headers=headers, data=json.dumps(data)).json())
except RequestException as e:
print('Unexpected error!', e)
# Continuing with the confirmation request
# object from the previous example:
begin:
puts(JSON.parse(HTTParty.put(url, headers: headers, body: JSON.dump(body))))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/confirmation-requests/a7838ed0-2173-11e4-ba87-3c970e7ff560" \
-X PUT \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"name": "Are you sure?", \
"options": ["Yes, I am sure.", "No, I am not sure."]}'
{
"permissions": ["delete", "put", "get"],
"escalationRules": [ ],
"createdAt": "2014-08-11T16:22:14.333Z",
"id": "a7838ed0-2173-11e4-ba87-3c970e7ff560",
"options": ["Yes, I am sure.", "No, I am not sure."],
"initiateTrackingOptions": [true, false],
"expirationPeriod": 36000,
"name": "Are you sure?"
}
Updates an existing confirmation request.
HTTP Request
PUT /confirmation-request/{confirmationRequestId}
Consumes
multipart/form-data, application/x-www-form-urlencoded, application/json
Produces
application/json
Path Parameters
Parameter | Required | Default | Description |
---|---|---|---|
confirmationRequestId | true | N/A | The id of the confirmation request to update. |
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
name | String | N/A | The name of the confirmation request, which is the prompt that will be presented to the user. May be up to 140 characters long, and should likely end with a question mark. |
options | Array[String] | N/A | A list of all the response choices that will be available to the recipient. At most 16 options may be provided. |
initiateTrackingOptions | Array[boolean] | N/A | Matched with options you can specify which options should initiate tracking. |
expirationPeriod | Integer | 0 | Duration in seconds for which the confirmation request will be active and responses will be accepted. Defaults to 0, which means the confirmation request is available to accept responses indefinitely. |
Response
The confirmation request response format is detailed here.
Remove a Confirmation Request
# Continuing with the confirmation request
# object from the previous example:
try:
print(requests.delete(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
# Continuing with the confirmation request
# object from the previous example:
begin:
puts(JSON.parse(HTTParty.delete(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/confirmation-requests/a7838ed0-2173-11e4-ba87-3c970e7ff560" \
-X DELETE \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Accept: application/json"
curl "https://api.icmobile.singlewire.com/api/v1/confirmation-requests/a7838ed0-2173-11e4-ba87-3c970e7ff560" \
-X DELETE \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
# Continuing with confirmation request
# object from the previous example:
puts JSON.parse(icm_client.message_templates(cr['id']).delete)
{
"status": 200,
"message": "deleted {:name \"ConfirmationRequests\"} a7838ed0-2173-11e4-ba87-3c970e7ff560"
}
Removes a confirmation request
HTTP Request
DELETE /confirmation-requests/{confirmationRequestId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
confirmationRequestId | The id of the confirmation request to delete. |
Response
The deletion response format is detailed here.
Confirmation Request Response
The JSON document used to represent a confirmation request resource has the following content:
Attribute | Type | Description |
---|---|---|
createdAt | ISO 8601 date/time | When this confirmation request was created. |
domains | Array[Domain] | When Domains are in use and includeDomains was true in your request, this response will list the Domains to which the confirmation request belongs. |
escalationRules | Array[EscalationRule] | A list of Escalation Rules attached to this confirmation request, which determine post-response behavior. |
dynamicReplies | Array[DynamicReply] | A list of Dynamic Replies attached to this confirmation request, which determine immediate reply behavior. |
expirationPeriod | Integer | The time in seconds after a notification is sent when this confirmation request expires and no longer accepts responses. |
id | String | The id of this specific confirmation request, allowing it to be manipulated or retrieved individually, and providing access to its Escalation Rules. |
name | String | The name of the confirmation request, which is the prompt that will be presented to the user. May be up to 140 characters long, and should likely end with a question mark. |
options | Array[String] | A list of all the response choices that will be available to the recipient. At most 16 options may be present. |
initiateTrackingOptions | Array[boolean] | Matched with options you can specify which options should initiate tracking. |
permissions | Array[String] | Options: get put delete . Which operations are possible on this resource, given the authentication token being used to access the API. |
Confirmation Request Cloning
This resource is used to make a copy of the Confirmation Request specified by id in the request path.
The only operation supported is POST
.
Clone a Confirmation Request
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/confirmation-requests/0a6b60a0-0e4a-11eb-986a-55883885ddfb/clone"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
print(requests.post(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/confirmation-requests/0a6b60a0-0e4a-11eb-986a-55883885ddfb/clone"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
puts(JSON.parse(HTTParty.post(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/confirmation-requests/0a6b60a0-0e4a-11eb-986a-55883885ddfb/clone" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Accept: application/json"
{
"dynamicReplies": [],
"permissions": [],
"initiateTrackingOptions": [
false,
false
],
"escalationRules": [],
"name": "Health Check - Status (Copy)",
"createdAt": "2021-07-23T15:24:31.663Z",
"expirationPeriod": null,
"id": "14038c65-ebca-11eb-81b3-fdb244340480",
"options": [
"I am OK",
"I am sick"
]
}
Creates a copy of the specified Confirmation Request. The name of the
new copy is simply the original Confirmation Request’s name with “ (Copy)”
appended. In order to perform this operation, the user must have both
POST
permission to the /confirmation-requests
resource and GET
permission
to the Confirmation Request they wish to copy.
HTTP Request
POST /confirmation-requests/{confirmationRequestId}/clone
Produces
application/json
Request Parameters
Parameter | Type | Description |
---|---|---|
confirmationRequestId | String | The id of the Confirmation Request to copy. |
Response
The confirmation request response format is detailed here.
Confirmation Request Domains
Domains allow for hierarchical delegation of authority over supported resources. When they are in use, Confirmation Requests are assigned to at least one Domain, and can be associated with more than one. This resource lets you see and adjust which Confirmation Requests are assigned to which Domains.
List All Confirmation Request Domains
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/confirmation-requests/c54e4241-299b-11e8-94d3-2be9464da125/domains"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
print(requests.get(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/confirmation-requests/c54e4241-299b-11e8-94d3-2be9464da125/domains"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
puts(JSON.parse(HTTParty.get(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/confirmation-requests/c54e4241-299b-11e8-94d3-2be9464da125/domains" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"total": 2,
"previous": null,
"next": null,
"partial": false,
"data": [
{
"id": "a4e9e56c-28df-11e8-8c38-738c606ef19c",
"parentId": "9ca35dab-28df-11e8-8c38-235a5737f6bb",
"name": "Vending",
"path": "/90de0f6a-28df-11e8-8c38-e9fe0f3683de/9ca35dab-28df-11e8-8c38-235a5737f6bb/a4e9e56c-28df-11e8-8c38-738c606ef19c/",
"namePath": "/West Campus/Stadium/Vending/",
"confirmationRequestId": "c54e4241-299b-11e8-94d3-2be9464da125",
"permissions": [
"delete",
"put",
"get"
],
"createdAt": "2018-03-16T06:02:44.441Z"
},
{
"id": "f04e3599-295b-11e8-b54b-abb9a309846e",
"parentId": "9ca35dab-28df-11e8-8c38-235a5737f6bb",
"name": "Grounds",
"path": "/90de0f6a-28df-11e8-8c38-e9fe0f3683de/9ca35dab-28df-11e8-8c38-235a5737f6bb/f04e3599-295b-11e8-b54b-abb9a309846e/",
"namePath": "/West Campus/Stadium/Grounds/",
"confirmationRequestId": "c54e4241-299b-11e8-94d3-2be9464da125",
"permissions": [
"delete",
"put",
"get"
],
"createdAt": "2018-03-16T20:52:28.522Z"
}
]
}
Retrieves the list of all Domains to which the Confirmation Request belongs. (The permissions associated with the request, through the user attached to the access token, may limit the visibility of results.)
HTTP Request
GET /confirmation-requests/{confirmationRequestId}/domains
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
confirmationRequestId | The id of the Confirmation Request whose associated Domains are to be listed. |
Query Parameters
In this example, there were a total of 2 Domains that the specified Confirmation Request belonged to when the request was made, and both were returned. The Informacast Mobile API offers a standard pagination mechanism for list requests like this.
Additionally, you can request the subdomains of any Domain attached to the specified Confirmation Request using a query parameter, and/or filter the results by matching on the Domain name:
Parameter | Type | Description |
---|---|---|
name | String | Returns only Domains whose names exactly match the supplied value. |
recursive | Boolean | If true , in addition to Domains that are directly attached to the specified Confirmation Request, any subdomains will be returned. |
Response
The Domain response format is detailed here.
Additionally, the id
of the confirmation request whose domains were
requested is returned under the key confirmationRequestId
inside
each domain response.
Check if a Confirmation Request contains a Domain
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/confirmation-requests/c54e4241-299b-11e8-94d3-2be9464da125/domains/f04e3599-295b-11e8-b54b-abb9a309846e"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
domain = requests.get(url, headers=headers).json()
print(domain)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/confirmation-requests/c54e4241-299b-11e8-94d3-2be9464da125/domains/f04e3599-295b-11e8-b54b-abb9a309846e"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
domain = JSON.parse(HTTParty.get(url, headers: headers))
puts(domain)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/confirmation-requests/c54e4241-299b-11e8-94d3-2be9464da125/domains/f04e3599-295b-11e8-b54b-abb9a309846e" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"id": "f04e3599-295b-11e8-b54b-abb9a309846e",
"parentId": "9ca35dab-28df-11e8-8c38-235a5737f6bb",
"name": "Grounds",
"path": "/90de0f6a-28df-11e8-8c38-e9fe0f3683de/9ca35dab-28df-11e8-8c38-235a5737f6bb/f04e3599-295b-11e8-b54b-abb9a309846e/",
"namePath": "/West Campus/Stadium/Grounds/",
"confirmationRequestId": "c54e4241-299b-11e8-94d3-2be9464da125",
"permissions": [
"delete",
"put",
"get"
],
"createdAt": "2018-03-16T20:52:28.522Z"
}
Retrieves a single Confirmation Request Domain by id
. Since this is not a list
request, there is no pagination wrapper around the result.
HTTP Request
GET /confirmation requests/{confirmationRequestId}/domains/{id}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
confirmationRequestId | The id of the Confirmation Request whose Domains are of interest. |
id | The id of the Domain you want to know whether the Confirmation Request belongs to. |
Additionally, you can check if the Confirmation Request is attached to any subdomains of the specified Domain using a query parameter:
Parameter | Type | Description |
---|---|---|
recursive | boolean | If true , in addition to Domains that are directly attached to the specified Confirmation Request, any of their subdomains will be considered. |
Response
If the Confirmation Request is part of the Domain (or its subdomains,
if recursive
is true
), a response will be returned. The Domain
response format is detailed here. If the list is
not in the Domain, the response status will indicate that the
requested resource cannot be found.
Add a Confirmation Request Domain
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/confirmation-requests/c54e4241-299b-11e8-94d3-2be9464da125/domains"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'id': 'a4e9e56c-28df-11e8-8c38-738c606ef19c'
}
try:
domain = requests.post(url, headers=headers, data=json.dumps(data)).json()
print(domain)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/confirmation-requests/c54e4241-299b-11e8-94d3-2be9464da125/domains"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'id': 'a4e9e56c-28df-11e8-8c38-738c606ef19c'
}
begin:
domain = JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body)))
puts(domain)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/confirmation-requests/c54e4241-299b-11e8-94d3-2be9464da125/domains" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"id": "a4e9e56c-28df-11e8-8c38-738c606ef19c"}'
{
"id": "a4e9e56c-28df-11e8-8c38-738c606ef19c",
"parentId": "9ca35dab-28df-11e8-8c38-235a5737f6bb",
"name": "Vending",
"path": "/90de0f6a-28df-11e8-8c38-e9fe0f3683de/9ca35dab-28df-11e8-8c38-235a5737f6bb/a4e9e56c-28df-11e8-8c38-738c606ef19c/",
"namePath": "/West Campus/Stadium/Vending/",
"confirmationRequestId": "c54e4241-299b-11e8-94d3-2be9464da125",
"permissions": [
"delete",
"put",
"get"
],
"createdAt": "2018-03-16T06:02:44.441Z"
}
Puts the Confirmation Request into the specified Domain. As described below, this may be considered a promotion or demotion, which would require additional request parameters in order to validate.
HTTP Request
POST /confirmation requests/{confirmationRequestId}/domains
Produces
application/json
Path Parameters
Parameter | Type | Description |
---|---|---|
confirmationRequestId | String | The id of the Confirmation Request to be added to the Domain. |
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
demote | Boolean | false |
Allow this request to proceed even if it will demote the Confirmation Request out of a parent Domain? |
id | String | n/a | The id of the Domain to which the Confirmation Request should be added. |
promote | Boolean | false |
Allow this request to proceed even if it will promote the Confirmation Request out of one or more child Domains? |
A Confirmation Request is not allowed to be explicitly part of any Domain
that it is implicitly granted membership to by belonging to a
parent Domain. For example, if you take a Confirmation Request that is in
Domains /West Campus/
and /East Campus/
, and try to add it to
/West Campus/Gym/
that request will fail because it is already
implicitly in that domain through belonging to the parent
/West Campus/
Domain. See the full explanation of
promotion and demotion
in the context of Domains and Users for more details and illustrations.
Remove a Confirmation Request Domain
# Continuing with the domain object from the
# previous example:
try:
print(requests.delete(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
# Continuing with the domain object from the
# previous example:
begin:
puts(JSON.parse(HTTParty.delete(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/confirmation-requests/c54e4241-299b-11e8-94d3-2be9464da125/domains/f04e3599-295b-11e8-b54b-abb9a309846e" \
-X DELETE \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Accept: application/json"
{
"status": 200,
"message": "deleted Domain Confirmation Request c54e4241-299b-11e8-94d3-2be9464da125"
}
Removes the specified Confirmation Request from the specified Domain. As described below, if this is the only Domain that the Confirmation Request currently belongs to, you need to supply an additional request parameter to confirm the deletion of the Confirmation Request itself.
HTTP Request
DELETE /confirmation-requests/{confirmationRequestId}/domains/{id}
Produces
application/json
Path Parameters
Parameter | Type | Description |
---|---|---|
confirmationRequestId | The id of the Confirmation Request whose Domain should be removed. |
|
id | The id of the Domain to be removed from the Confirmation Request. |
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
orphans | String | fail |
Option: delete , fail . What to do if this would leave the Confirmation Request in no Domain. |
A Confirmation Request must always belong to at least one Domain, so if you try to
remove the Confirmation Request from the only Domain that it belongs to, the request
must either fail, or delete the Confirmation Request. The request parameter orphans
lets you control which of those takes place. The default, if you
supply no instructions, is for the request to fail, and you will
receive a validation error explaining why. If you pass a value of
delete
for the orphans
request parameter, then taking a Confirmation Request out
of its last Domain will delete the Confirmation Request.
Response
The deletion response format is detailed here.
CUCM Clusters
Specifies Cisco Unified Communications Manager Cluster Configurations for use with InformaCast Fusion
Get All CUCM Clusters
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
params = {
'limit': 1
}
try:
print(requests.get(url, headers=headers, params=params).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
query = {
'limit': 1
}
begin:
puts(JSON.parse(HTTParty.get(url, headers: headers, query: query)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/cucm-clusters?limit=1" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"total": 2,
"previous": null,
"next": null,
"partial": false,
"data": [
{
"secureConnection": false,
"axlUser": "axlUser",
"permissions": [
"put",
"delete",
"get"
],
"tftpPort": null,
"name": "East Cluster",
"capfAddress": null,
"createdAt": "2021-02-15T22:35:07.475Z",
"updatedAt": "2021-02-15T22:35:07.475Z",
"nextAuthenticationUrl": null,
"id": "0e171a6a-6fde-11eb-bd50-0b5d975a5196",
"tftpAddress": null,
"snmpVersion": "3",
"capfPort": null,
"axlAddress": null,
"snmpUsername": "Test",
"snmpCommunity": null,
"cucmClusterFusionServers": [
{
"cucmClusterFusionServerId": "0e17688b-6fde-11eb-bd50-d99a29f7761d",
"endpointId": "085cd868-6fdd-11eb-bd50-9bb27a3cc62a",
"endpointName": "Fusion3"
}
],
"axlId": "ucm125"
},
{
"secureConnection": true,
"axlUser": "axlUser",
"permissions": [
"put",
"delete",
"get"
],
"tftpPort": 69,
"name": "West Cluster",
"capfAddress": "172.30.207.49",
"createdAt": "2021-02-12T19:45:00.617Z",
"updatedAt": "2021-02-15T22:35:07.475Z",
"nextAuthenticationUrl": null,
"id": "cb16ec29-6d6a-11eb-a9cf-e19ac9da2489",
"tftpAddress": "172.30.207.49",
"snmpVersion": "2",
"capfPort": 3804,
"axlAddress": "172.30.207.49",
"snmpUsername": null,
"snmpCommunity": "ICVA",
"cucmClusterFusionServers": [
{
"cucmClusterFusionServerId": "1d278a0f-6fbb-11eb-b0f8-918d446445ab",
"endpointId": "7676f63f-6fba-11eb-b0f8-e51408f3ba06",
"endpointName": "Fusion"
},
{
"cucmClusterFusionServerId": "1d216f8a-6fbb-11eb-b0f8-933bf79c7bab",
"endpointId": "817b3e8b-6fba-11eb-b0f8-0bc70adb4bfa",
"endpointName": "Fusion2"
}
],
"axlId": null
}
]
}
Gets a list of all CUCM cluster configurations available to the current user. (The Permissions and Security Groups associated with the request, through the user attached to the access token, may limit the resources returned. Controlling access to CUCM clusters allows only those acting in an administrative capacity to modify these settings.)
HTTP Request
GET /cucm-clusters
Produces
application/json
Query Parameters
The InformaCast Mobile API offers a standard pagination mechanism for list requests like this.
Parameter | Type | Default | Description |
---|---|---|---|
assoc-sync-state | Boolean | false | If true , include the current synchronization state for fusion endpoints. |
Response
The CUCM Cluster response format is detailed here.
Get One CUCM Cluster
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/cb16ec29-6d6a-11eb-a9cf-e19ac9da2489"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
cluster = requests.get(url, headers=headers).json()
print(cluster)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/cb16ec29-6d6a-11eb-a9cf-e19ac9da2489"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
cluster = JSON.parse(HTTParty.get(url, headers: headers))
puts(cluster)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/cb16ec29-6d6a-11eb-a9cf-e19ac9da2489" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"secureConnection": true,
"axlUser": "axlUser",
"permissions": [
"put",
"delete",
"get"
],
"tftpPort": 69,
"name": "West Cluster",
"capfAddress": "172.30.207.49",
"createdAt": "2021-02-12T19:45:00.617Z",
"updatedAt": "2021-02-15T22:35:07.475Z",
"nextAuthenticationUrl": null,
"id": "cb16ec29-6d6a-11eb-a9cf-e19ac9da2489",
"tftpAddress": "172.30.207.49",
"snmpVersion": "2",
"capfPort": 3804,
"axlAddress": "172.30.207.49",
"snmpUsername": null,
"snmpCommunity": "ICVA",
"cucmClusterFusionServers": [
{
"cucmClusterFusionServerId": "1d278a0f-6fbb-11eb-b0f8-918d446445ab",
"endpointId": "7676f63f-6fba-11eb-b0f8-e51408f3ba06",
"endpointName": "Fusion"
},
{
"cucmClusterFusionServerId": "1d216f8a-6fbb-11eb-b0f8-933bf79c7bab",
"endpointId": "817b3e8b-6fba-11eb-b0f8-0bc70adb4bfa",
"endpointName": "Fusion2"
}
],
"axlId": null
}
Retrieves a single CUCM Cluster by its id
. Since this is not a list request, there is no pagination wrapper around the result.
HTTP Request
GET /cucm-clusters/{cucmClusterId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
cucmClusterId | The id of the CUCM Cluster to retrieve. |
Response
The CUCM Cluster response format is detailed here.
Create a CUCM Cluster
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'name': 'Example Cluster',
'axlUser': 'AXL User',
'axlPassword': 'AXL Password',
'axlAddress': '1.1.1.1,2.2.2.2',
'snmpVersion': '2',
'snmpCommunity': 'ICVA',
'secureConnection': false,
'nextAuthenticationUrl': 'http://cucm.domain.org:8080/ccmcip/authenticate.jsp'
}
try:
cluster = requests.post(url, headers=headers, data=json.dumps(data)).json()
print(cluster)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'name': 'Example Cluster'
,
'axlUser': 'AXL User'
,
'axlPassword': 'AXL Password'
,
'axlAddress': '1.1.1.1,2.2.2.2'
,
'snmpVersion': '2'
,
'snmpCommunity': 'ICVA'
,
'secureConnection': false
,
'nextAuthenticationUrl': 'http://cucm.domain.org:8080/ccmcip/authenticate.jsp'
}
begin:
cluster = JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body)))
puts(cluster)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/cucm-clusters" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"name": "Example Cluster", \
"axlUser": "AXL User", \
"axlPassword": "AXL Password", \
"axlAddress": "1.1.1.1,2.2.2.2", \
"snmpVersion": "2", \
"snmpCommunity": "ICVA", \
"secureConnection": false, \
"nextAuthenticationUrl": "http://cucm.domain.org:8080/ccmcip/authenticate.jsp"}'
{
"secureConnection": true,
"axlUser": "AXL User",
"permissions": [
"put",
"delete",
"get"
],
"tftpPort": 69,
"name": "Example Cluster",
"capfAddress": null,
"createdAt": "2021-02-12T19:45:00.617Z",
"updatedAt": "2021-02-15T22:35:07.475Z",
"nextAuthenticationUrl": "http://cucm.domain.org:8080/ccmcip/authenticate.jsp",
"id": "f16f8ef0-708a-11eb-9c8c-17221dd62a89",
"tftpAddress": null,
"snmpVersion": "2",
"capfPort": null,
"axlAddress": "1.1.1.1,2.2.2.2",
"snmpUsername": null,
"snmpCommunity": "ICVA",
"cucmClusterFusionServers": [],
"axlId": null
}
Creates a new CUCM Cluster global configuration, which can be shared across multiple Fusion Servers
HTTP Request
POST /cucm-clusters
Consumes
multipart/form-data, application/x-www-form-urlencoded, application/json
Produces
application/json
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
name | String | N/A | The name to give the new CUCM Cluster. May be up to 255 characters long. |
axlUser | String | N/A | The username with which InformaCast Fusion will attempt to contact the Administrative XML (AXL) service. Used to discover and configure phones. |
axlPassword | String | N/A | The password with which InformaCast Fusion will attempt to contact the Administrative XML (AXL) service. |
axlAddress | String | N/A | A comma-delimited list of IP Addresses that InformaCast Fusion will try when contacting the Administrative XML (AXL) service. These will always be tried in priority order, from left to right. |
snmpVersion | String | N/A | Specifies the version of SNMP InformaCast Fusion will use when discovering phones. Valid values are “2” or “3”. |
snmpCommunity | String | N/A | Only used with SNMP Version 2. The community name that was created in CUCM for InformaCast Fusion. SNMP is used to obtain the IP addresses of registered phones when building the phone cache. |
snmpUsername | String | N/A | Only used with SNMP Version 3. The username that was created in CUCM for InformaCast Fusion. SNMP is used to obtain the IP addresses of registered phones when building the phone cache. |
snmpAuthPassword | String | N/A | Only used with SNMP Version 3. The authentication password that was created in CUCM for InformaCast Fusion. SNMP is used to obtain the IP addresses of registered phones when building the phone cache. |
snmpEncryptPassword | String | N/A | Only used with SNMP Version 3. The privacy password that was created in CUCM for InformaCast Fusion. SNMP is used to obtain the IP addresses of registered phones when building the phone cache. |
secureConnection | Boolean | false | Specifies whether a secure CTI connection will be established with the Cisco Unified Communications Manager cluster, e.g. true=secure CTI connection, false=non-secure CTI connection. Secure CTI connections require Cisco Unified CM 12.5(1)SU7 or 14SU2 and later running in mixed mode. |
capfAddress | String | N/A | Only used when secureConnection is true. The address of the Certificate Authority Proxy Function (CAPF) Service, used for generating certificates. |
capfPort | Number | N/A | Only used when secureConnection is true. The port of the Certificate Authority Proxy Function (CAPF) Service, used for generating certificates. |
tftpAddress | String | N/A | Only used when secureConnection is true. The address of the Trivial File Transfer Protocol (TFTP) Service, used for downloading certificates. |
tftpPort | Number | N/A | Only used when secureConnection is true. The port of the Trivial File Transfer Protocol (TFTP) Service, used for downloading certificates. |
nextAuthenticationUrl | String | N/A | If InformaCast Fusion determines that it should not attempt to handle a phone authentication request, it will redirect those authentication requests to this location. |
Response
The CUCM Cluster response format is detailed here.
Update a CUCM Cluster
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/f16f8ef0-708a-11eb-9c8c-17221dd62a89"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'name': 'Example Cluster Prime',
'axlUser': 'AXL User Prime',
'axlPassword': 'AXL Password Prime',
'axlAddress': '1.1.1.1,2.2.2.2,3.3.3.3',
'snmpVersion': '2',
'snmpCommunity': 'ICVA2',
'secureConnection': false,
'nextAuthenticationUrl': 'http://cucm.domain.org:8080/ccmcip/authenticate.jsp'
}
try:
cluster = requests.put(url, headers=headers, data=json.dumps(data)).json()
print(cluster)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/f16f8ef0-708a-11eb-9c8c-17221dd62a89"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'name': 'Example Cluster Prime'
,
'axlUser': 'AXL User Prime'
,
'axlPassword': 'AXL Password Prime'
,
'axlAddress': '1.1.1.1,2.2.2.2,3.3.3.3'
,
'snmpVersion': '2'
,
'snmpCommunity': 'ICVA2'
,
'secureConnection': false
,
'nextAuthenticationUrl': 'http://cucm.domain.org:8080/ccmcip/authenticate.jsp'
}
begin:
cluster = JSON.parse(HTTParty.put(url, headers: headers, body: JSON.dump(body)))
puts(cluster)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/f16f8ef0-708a-11eb-9c8c-17221dd62a89" \
-X PUT \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"name": "Example Cluster Prime", \
"axlUser": "AXL User Prime", \
"axlPassword": "AXL Password Prime", \
"axlAddress": "1.1.1.1,2.2.2.2,3.3.3.3", \
"snmpVersion": "2", \
"snmpCommunity": "ICVA2", \
"secureConnection": false, \
"nextAuthenticationUrl": "http://cucm.domain.org:8080/ccmcip/authenticate.jsp"}'
{
"secureConnection": true,
"axlUser": "AXL User Prime",
"permissions": [
"put",
"delete",
"get"
],
"tftpPort": 69,
"name": "Example Cluster Prime",
"capfAddress": null,
"createdAt": "2021-02-12T19:45:00.617Z",
"updatedAt": "2021-02-15T22:35:07.475Z",
"nextAuthenticationUrl": "http://cucm.domain.org:8080/ccmcip/authenticate.jsp",
"id": "f16f8ef0-708a-11eb-9c8c-17221dd62a89",
"tftpAddress": null,
"snmpVersion": "2",
"capfPort": null,
"axlAddress": "1.1.1.1,2.2.2.2,3.3.3.3",
"snmpUsername": null,
"snmpCommunity": "ICVA2",
"cucmClusterFusionServers": [],
"axlId": null
}
Updates a new CUCM Cluster global configuration, which can be shared across multiple Fusion Servers
HTTP Request
PUT /cucm-clusters/{cucmClusterId}
Consumes
multipart/form-data, application/x-www-form-urlencoded, application/json
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
cucmClusterId | The id of the CUCM Cluster to update. |
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
name | String | N/A | The name to give the new CUCM Cluster. May be up to 255 characters long. |
axlUser | String | N/A | The username with which InformaCast Fusion will attempt to contact the Administrative XML (AXL) service. Used to discover and configure phones. |
axlPassword | String | N/A | The password with which InformaCast Fusion will attempt to contact the Administrative XML (AXL) service. |
axlAddress | String | N/A | A comma-delimited list of IP Addresses that InformaCast Fusion will try when contacting the Administrative XML (AXL) service. These will always be tried in priority order, from left to right. |
snmpVersion | String | N/A | Specifies the version of SNMP InformaCast Fusion will use when discovering phones. Valid values are “2” or “3”. |
snmpCommunity | String | N/A | Only used with SNMP Version 2. The community name that was created in CUCM for InformaCast Fusion. SNMP is used to obtain the IP addresses of registered phones when building the phone cache. |
snmpUsername | String | N/A | Only used with SNMP Version 3. The username that was created in CUCM for InformaCast Fusion. SNMP is used to obtain the IP addresses of registered phones when building the phone cache. |
snmpAuthPassword | String | N/A | Only used with SNMP Version 3. The authentication password that was created in CUCM for InformaCast Fusion. SNMP is used to obtain the IP addresses of registered phones when building the phone cache. |
snmpEncryptPassword | String | N/A | Only used with SNMP Version 3. The privacy password that was created in CUCM for InformaCast Fusion. SNMP is used to obtain the IP addresses of registered phones when building the phone cache. |
secureConnection | Boolean | false | Specifies whether a secure CTI connection will be established with the Cisco Unified Communications Manager cluster, e.g. true=secure CTI connection, false=non-secure CTI connection. Secure CTI connections require Cisco Unified CM 12.5(1)SU7 or 14SU2 and later running in mixed mode. |
capfAddress | String | N/A | Only used when secureConnection is true. The address of the Certificate Authority Proxy Function (CAPF) Service, used for generating certificates. |
capfPort | Number | N/A | Only used when secureConnection is true. The port of the Certificate Authority Proxy Function (CAPF) Service, used for generating certificates. |
tftpAddress | String | N/A | Only used when secureConnection is true. The address of the Trivial File Transfer Protocol (TFTP) Service, used for downloading certificates. |
tftpPort | Number | N/A | Only used when secureConnection is true. The port of the Trivial File Transfer Protocol (TFTP) Service, used for downloading certificates. |
nextAuthenticationUrl | String | N/A | The location that will be redirected to if InformaCast Fusion determines that it should not attempt to handle a phone push authentication request. |
Response
The CUCM Cluster response format is detailed here.
Remove a CUCM Cluster
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/f16f8ef0-708a-11eb-9c8c-17221dd62a89"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
print(requests.delete(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/f16f8ef0-708a-11eb-9c8c-17221dd62a89"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
puts(JSON.parse(HTTParty.delete(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/f16f8ef0-708a-11eb-9c8c-17221dd62a89" \
-X DELETE \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Accept: application/json"
{
"status": 200,
"message": "deleted f16f8ef0-708a-11eb-9c8c-17221dd62a89"
}
Removes a CUCM Cluster, discarding its configuration.
HTTP Request
DELETE /cucm-clusters/{cucmClusterId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
cucmClusterId | The id of the CUCM Cluster to delete. |
Response
The deletion response format is detailed here.
CUCM Cluster Response Format
The JSON document used to represent a CUCM Cluster resource has the following content:
Attribute | Type | Description |
---|---|---|
createdAt | ISO 8601 date/time | When this CUCM cluster was created. |
updatedAt | ISO 8601 date/time | When this CUCM cluster was last updated. |
id | String | The id of this specific CUCM cluster, allowing it to be manipulated or retrieved individually. |
name | String | The cluster name. May be up to 255 characters long. |
permissions | Array[String] | Options: get put delete . Which operations are possible on this resource, given the authentication token being used to access the API. |
syncState | Array[Object] | The endpoints’ sync state. Only applicable for Fusion Servers that this cluster is configured for, and if query param assoc-sync-state is true . |
axlUser | String | The username with which InformaCast Fusion will attempt to contact the Administrative XML (AXL) service. Used to discover and configure phones. |
axlAddress | String | A comma-delimited list of IP Addresses that InformaCast Fusion will try when contacting the Administrative XML (AXL) service. These will always be tried in priority order, from left to right. |
snmpVersion | String | Specifies the version of SNMP InformaCast Fusion will use when discovering phones. Valid values are “2” or “3”. |
snmpCommunity | String | Only used with SNMP Version 2. The community name that was created in CUCM for InformaCast Fusion. SNMP is used to obtain the IP addresses of registered phones when building the phone cache. |
snmpUsername | String | Only used with SNMP Version 3. The username that was created in CUCM for InformaCast Fusion. SNMP is used to obtain the IP addresses of registered phones when building the phone cache. |
secureConnection | Boolean | Specifies whether a secure CTI connection will be established with the Cisco Unified Communications Manager cluster, e.g. true=secure CTI connection, false=non-secure CTI connection. Secure CTI connections require Cisco Unified CM 12.5(1)SU7 or 14SU2 and later running in mixed mode. |
capfAddress | String | Only used when secureConnection is true. The address of the Certificate Authority Proxy Function (CAPF) Service, used for generating certificates. |
capfPort | Number | Only used when secureConnection is true. The port of the Certificate Authority Proxy Function (CAPF) Service, used for generating certificates. |
tftpAddress | String | Only used when secureConnection is true. The address of the Trivial File Transfer Protocol (TFTP) Service, used for downloading certificates. |
tftpPort | Number | Only used when secureConnection is true. The address of the Trivial File Transfer Protocol (TFTP) Service, used for downloading certificates. |
nextAuthenticationUrl | String | The location that will be redirected to if InformaCast Fusion determines that it should not attempt to handle a phone push authentication request. |
axlId | String | If this cluster was imported from an earlier version of InformaCast Fusion, will display the CUCM cluster ID from the AXL service |
cucmClusterFusionServers | Array[Object] | The current cluster’s configured CUCM Cluster Fusion Servers. |
CUCM Cluster Fusion Servers Format
The JSON document used to represent a CUCM Cluster Fusion Server Configuration has the following content:
Attribute | Type | Description |
---|---|---|
cucmClusterFusionServerId | String | ID of this record. |
endpointId | String | ID of the Fusion Server configured for this cluster. |
endpointName | String | Name of the Fusion Server configured for this cluster. |
CUCM Cluster Fusion Servers
Specifies Specific Fusion Servers configurations for a previously configured Cisco Unified Communications Manager Cluster.
Get All Fusion Server configurations for a CUCM Cluster
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/f16f8ef0-708a-11eb-9c8c-17221dd62a89/fusion-servers"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
params = {
'limit': 2
}
try:
servers = requests.get(url, headers=headers, params=params).json()
print(servers)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/f16f8ef0-708a-11eb-9c8c-17221dd62a89/fusion-servers"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
query = {
'limit': 2
}
begin:
servers = JSON.parse(HTTParty.get(url, headers: headers, query: query))
puts(servers)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/f16f8ef0-708a-11eb-9c8c-17221dd62a89/fusion-servers?limit=2" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"total": 2,
"previous": null,
"next": null,
"partial": false,
"data": [
{
"permissions": [
"put",
"delete",
"get"
],
"jtapiStaticTerminalsEnabled": false,
"createdAt": "2021-02-15T18:25:00.363Z",
"updatedAt": "2021-02-15T18:25:00.363Z",
"cmAddress": "172.30.207.49",
"syncId": "1d278a0f-6fbb-11eb-b0f8-918d446445ab:1613413642770",
"cmUsername": "cmUser",
"endpointId": "7676f63f-6fba-11eb-b0f8-e51408f3ba06",
"id": "1d278a0f-6fbb-11eb-b0f8-918d446445ab",
"jtapiPhoneActivationEnabled": false,
"makeCtiConnection": true,
"syncState": [
{
"name": "Fusion",
"status": "complete",
"updatedAt": "2021-02-15T18:30:23.189Z",
"errors": null
}
],
"endpoint": {
"id": "7676f63f-6fba-11eb-b0f8-e51408f3ba06",
"name": "Fusion"
},
"cucmClusterId": "f16f8ef0-708a-11eb-9c8c-17221dd62a89"
},
{
"permissions": [
"put",
"delete",
"get"
],
"jtapiStaticTerminalsEnabled": false,
"createdAt": "2021-02-15T18:25:00.323Z",
"updatedAt": "2021-02-15T18:25:00.363Z",
"cmAddress": "172.30.207.49",
"syncId": "1d216f8a-6fbb-11eb-b0f8-933bf79c7bab:1613413676919",
"cmUsername": "JamieDA2",
"endpointId": "817b3e8b-6fba-11eb-b0f8-0bc70adb4bfa",
"id": "1d216f8a-6fbb-11eb-b0f8-933bf79c7bab",
"jtapiPhoneActivationEnabled": false,
"makeCtiConnection": true,
"syncState": [
{
"name": "Fusion2",
"status": "complete",
"updatedAt": "2021-02-15T18:28:26.217Z",
"errors": null
}
],
"endpoint": {
"id": "817b3e8b-6fba-11eb-b0f8-0bc70adb4bfa",
"name": "Fusion2"
},
"cucmClusterId": "f16f8ef0-708a-11eb-9c8c-17221dd62a89"
}
]
}
Gets a list of all Fusion Server configurations for a particular CUCM cluster available to the current user. (The Permissions and Security Groups associated with the request, through the user attached to the access token, may limit the resources returned. Controlling access to CUCM clusters allows only those acting in an administrative capacity to modify these settings.)
HTTP Request
GET /cucm-clusters/{cucmClusterId}/fusion-servers
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
cucmClusterId | The id of the CUCM Cluster to retrieve. |
Query Parameters
The InformaCast Mobile API offers a standard pagination mechanism for list requests like this.
Parameter | Type | Default | Description |
---|---|---|---|
assoc-sync-state | Boolean | false | If true , include the current synchronization state for the fusion endpoint associated with this configuration. |
Response
The CUCM Cluster Fusion Server configuration response format is detailed here.
Get one Fusion Server configuration for a CUCM Cluster
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/cb16ec29-6d6a-11eb-a9cf-e19ac9da2489/fusion-servers/1d216f8a-6fbb-11eb-b0f8-933bf79c7bab"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
server = requests.get(url, headers=headers).json()
print(server)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/cb16ec29-6d6a-11eb-a9cf-e19ac9da2489/fusion-servers/1d216f8a-6fbb-11eb-b0f8-933bf79c7bab"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
server = JSON.parse(HTTParty.get(url, headers: headers))
puts(server)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/cb16ec29-6d6a-11eb-a9cf-e19ac9da2489/fusion-servers/1d216f8a-6fbb-11eb-b0f8-933bf79c7bab" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"permissions": [
"put",
"delete",
"get"
],
"jtapiStaticTerminalsEnabled": false,
"createdAt": "2021-02-15T18:25:00.323Z",
"updatedAt": "2021-02-15T18:25:00.363Z",
"cmAddress": "172.30.207.49",
"syncId": "1d216f8a-6fbb-11eb-b0f8-933bf79c7bab:1613413676919",
"cmUsername": "JamieDA2",
"endpointId": "817b3e8b-6fba-11eb-b0f8-0bc70adb4bfa",
"id": "1d216f8a-6fbb-11eb-b0f8-933bf79c7bab",
"jtapiPhoneActivationEnabled": false,
"makeCtiConnection": true,
"syncState": [
{
"name": "Fusion2",
"status": "complete",
"updatedAt": "2021-02-15T18:28:26.217Z",
"errors": null
}
],
"endpoint": {
"id": "817b3e8b-6fba-11eb-b0f8-0bc70adb4bfa",
"name": "Fusion2"
},
"cucmClusterId": "f16f8ef0-708a-11eb-9c8c-17221dd62a89"
}
Retrieves a single CUCM Cluster Fusion server configuration by its id
. Since this is not a list request, there is no pagination wrapper around the result.
HTTP Request
GET /cucm-clusters/{cucmClusterId}/fusion-servers/{cucmClusterFusionServerId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
cucmClusterId | The id of the CUCM Cluster to retrieve. |
cucmClusterFusionServerId | The id of the CUCM Cluster Fusion Server Configuration to retrieve. |
Response
The CUCM Cluster Fusion Server configuration response format is detailed here.
Create a CUCM Cluster Fusion Server Configuration
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/cb16ec29-6d6a-11eb-a9cf-e19ac9da2489/fusion-servers"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'endpointId': '817b3e8b-6fba-11eb-b0f8-0bc70adb4bfa',
'cmAddress': '1.1.1.1,2.2.2.2',
'cmUsername': 'cmUser',
'cmPassword': 'cmPassword',
'jtapiPhoneActivationEnabled': false,
'jtapiStaticTerminalsEnabled': false,
'makeCtiConnection': true,
'allowRestartForJTAPIUpdate': true
}
try:
print(requests.post(url, headers=headers, data=json.dumps(data)).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/cb16ec29-6d6a-11eb-a9cf-e19ac9da2489/fusion-servers"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'endpointId': '817b3e8b-6fba-11eb-b0f8-0bc70adb4bfa'
,
'cmAddress': '1.1.1.1,2.2.2.2'
,
'cmUsername': 'cmUser'
,
'cmPassword': 'cmPassword'
,
'jtapiPhoneActivationEnabled': false
,
'jtapiStaticTerminalsEnabled': false
,
'makeCtiConnection': true
,
'allowRestartForJTAPIUpdate': true
}
begin:
puts(JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body))))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/cb16ec29-6d6a-11eb-a9cf-e19ac9da2489/fusion-servers" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"endpointId": "817b3e8b-6fba-11eb-b0f8-0bc70adb4bfa", \
"cmAddress": "1.1.1.1,2.2.2.2", \
"cmUsername": "cmUser", \
"cmPassword": "cmPassword", \
"jtapiPhoneActivationEnabled": false, \
"jtapiStaticTerminalsEnabled": false, \
"makeCtiConnection": true, \
"allowRestartForJTAPIUpdate": true}'
{
"permissions": [
"put",
"delete",
"get"
],
"jtapiStaticTerminalsEnabled": false,
"createdAt": "2021-02-15T18:25:00.363Z",
"updatedAt": "2021-02-15T18:25:00.363Z",
"cmAddress": "1.1.1.1,2.2.2.2",
"syncId": "1d278a0f-6fbb-11eb-b0f8-918d446445ab:1613413642770",
"cmUsername": "cmUser",
"endpointId": "817b3e8b-6fba-11eb-b0f8-0bc70adb4bfa",
"id": "1d278a0f-6fbb-11eb-b0f8-918d446445ab",
"jtapiPhoneActivationEnabled": false,
"makeCtiConnection": true,
"endpoint": {
"id": "817b3e8b-6fba-11eb-b0f8-0bc70adb4bfa",
"name": "Fusion2"
},
"cucmClusterId": "cb16ec29-6d6a-11eb-a9cf-e19ac9da2489",
"ctiCertificates": [{"applicationUser": "appUser",
"instanceId": "instanceId",
"id": "f2dee550-70a9-11eb-9c8c-17221dd62a89"}]
}
Creates a new CUCM Cluster Fusion Server configuration, with fields that need to be unique to a single Fusion Server
HTTP Request
POST /cucm-clusters/{cucmClusterId}/fusion-servers
Consumes
multipart/form-data, application/x-www-form-urlencoded, application/json
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
cucmClusterId | The id of the CUCM Cluster associated with this Fusion Server configuration. |
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
endpointId | String | N/A | The Fusion Server ID with which this configuration should be associated |
cmAddress | String | N/A | A comma-delimited list of IP Addresses used to connect to the CUCM CTIManager service. These will always be tried in priority order, from left to right. |
cmUsername | String | N/A | The username used to connect to the CUCM CTIManager service. |
cmPassword | String | N/A | The password used to connect to the CUCM CTIManager service. |
makeCtiConnection | Boolean | false | Allows CTI connections to this CUCM cluster and makes this CUCM cluster the ‘Primary’ cluster for this Fusion Server. A Fusion Server must have exactly one Primary Cluster. Setting this value to true will unset it for any other CUCM cluster assigned to this Fusion Server. |
jtapiPhoneActivationEnabled | Boolean | false | Only used when makeCtiConnection is true. If true, phones are activated via JTAPI requests sent by InformaCast to the primary CUCM cluster. If false, phones are activated via HTTP requests sent from InformaCast to IP phones. |
jtapiStaticTerminalsEnabled | Boolean | false | Only used when jtapiPhoneActivationEnabled is true. If true, will eager create telephony terminals for all phones associated with the cluster and assigned to this Fusion Server by Activation Group, speeding up activation time. If false, terminals are created during activation and discarded afterward. |
allowRestartForJTAPIUpdate | Boolean | false | If true, will allow this operation even if the JTAPI version of the CUCM Cluster and Fusion Server do not match, which will restart the Fusion Server automatically when saved. Otherwise, throws a validation error if they do not match. |
Response
The CUCM Cluster Fusion Server configuration response format is detailed here.
Update a CUCM Cluster Fusion Server Configuration
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/cb16ec29-6d6a-11eb-a9cf-e19ac9da2489/fusion-servers/1d216f8a-6fbb-11eb-b0f8-933bf79c7bab"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'endpointId': '817b3e8b-6fba-11eb-b0f8-0bc70adb4bfa',
'cmAddress': '1.1.1.1,2.2.2.2,3.3.3.3',
'cmUsername': 'cmUser',
'cmPassword': 'cmPassword',
'jtapiPhoneActivationEnabled': false,
'jtapiStaticTerminalsEnabled': false,
'makeCtiConnection': true,
'allowRestartForJTAPIUpdate': true
}
try:
print(requests.put(url, headers=headers, data=json.dumps(data)).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/cb16ec29-6d6a-11eb-a9cf-e19ac9da2489/fusion-servers/1d216f8a-6fbb-11eb-b0f8-933bf79c7bab"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'endpointId': '817b3e8b-6fba-11eb-b0f8-0bc70adb4bfa'
,
'cmAddress': '1.1.1.1,2.2.2.2,3.3.3.3'
,
'cmUsername': 'cmUser'
,
'cmPassword': 'cmPassword'
,
'jtapiPhoneActivationEnabled': false
,
'jtapiStaticTerminalsEnabled': false
,
'makeCtiConnection': true
,
'allowRestartForJTAPIUpdate': true
}
begin:
puts(JSON.parse(HTTParty.put(url, headers: headers, body: JSON.dump(body))))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/cb16ec29-6d6a-11eb-a9cf-e19ac9da2489/fusion-servers/1d216f8a-6fbb-11eb-b0f8-933bf79c7bab" \
-X PUT \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"endpointId": "817b3e8b-6fba-11eb-b0f8-0bc70adb4bfa", \
"cmAddress": "1.1.1.1,2.2.2.2,3.3.3.3", \
"cmUsername": "cmUser", \
"cmPassword": "cmPassword", \
"jtapiPhoneActivationEnabled": false, \
"jtapiStaticTerminalsEnabled": false, \
"makeCtiConnection": true, \
"allowRestartForJTAPIUpdate": true}'
{
"permissions": [
"put",
"delete",
"get"
],
"jtapiStaticTerminalsEnabled": false,
"createdAt": "2021-02-15T18:25:00.363Z",
"updatedAt": "2021-02-15T19:12:32.321Z",
"cmAddress": "1.1.1.1,2.2.2.2,3.3.3.3",
"syncId": "1d278a0f-6fbb-11eb-b0f8-918d446445ab:1613413642770",
"cmUsername": "cmUserPrime",
"endpointId": "817b3e8b-6fba-11eb-b0f8-0bc70adb4bfa",
"id": "1d278a0f-6fbb-11eb-b0f8-918d446445ab",
"jtapiPhoneActivationEnabled": false,
"makeCtiConnection": true,
"endpoint": {
"id": "817b3e8b-6fba-11eb-b0f8-0bc70adb4bfa",
"name": "Fusion2"
},
"cucmClusterId": "cb16ec29-6d6a-11eb-a9cf-e19ac9da2489"
}
Updates an existing CUCM Cluster Fusion Server configuration, with fields that need to be unique to a single Fusion Server
HTTP Request
PUT /cucm-clusters/{cucmClusterId}/fusion-servers/{cucmClusterFusionServerId}
Consumes
multipart/form-data, application/x-www-form-urlencoded, application/json
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
cucmClusterId | The id of the CUCM Cluster associated with this Fusion Server configuration. |
cucmClusterFusionServerId | The id of the CUCM Cluster Fusion Server Configuration to retrieve. |
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
endpointId | String | N/A | The Fusion Server ID with which this configuration should be associated. This value may not be changed on subsequent requests. |
cmAddress | String | N/A | A comma-delimited list of IP Addresses used to connect to the CUCM CTIManager service. These will always be tried in priority order, from left to right. |
cmUsername | String | N/A | The username used to connect to the CUCM CTIManager service. |
cmPassword | String | N/A | The password used to connect to the CUCM CTIManager service. |
makeCtiConnection | Boolean | false | Allows CTI connections to this CUCM cluster and makes this CUCM cluster the 'Primary’ cluster for this Fusion Server. |
jtapiPhoneActivationEnabled | Boolean | false | If true, phones are activated via JTAPI requests sent by InformaCast to the primary CUCM cluster. If false, phones are activated via HTTP requests sent from InformaCast to IP phones. |
jtapiStaticTerminalsEnabled | Boolean | false | Only used when jtapiPhoneActivationEnabled is true. If true, will eager create telephony terminals for all phones associated with the cluster and assigned to this Fusion Server by Activation Group, speeding up activation time. If false, terminals are created during activation and discarded afterward. |
allowRestartForJTAPIUpdate | Boolean | false | If true, will allow this operation even if the JTAPI version of the Cluster and Fusion’s do not match, which will restart the cluster automatically when saved. Otherwise, throws a validation error if they do not match. |
Response
The CUCM Cluster Fusion Server response format is detailed here.
Remove a CUCM Cluster Fusion Server Configuration
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/f16f8ef0-708a-11eb-9c8c-17221dd62a89/fusion-servers/1d278a0f-6fbb-11eb-b0f8-918d446445ab"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
print(requests.delete(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/f16f8ef0-708a-11eb-9c8c-17221dd62a89/fusion-servers/1d278a0f-6fbb-11eb-b0f8-918d446445ab"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
puts(JSON.parse(HTTParty.delete(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/cucm-clusters/f16f8ef0-708a-11eb-9c8c-17221dd62a89/fusion-servers/1d278a0f-6fbb-11eb-b0f8-918d446445ab" \
-X DELETE \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Accept: application/json"
{
"status": 200,
"message": "deleted 1d278a0f-6fbb-11eb-b0f8-918d446445ab"
}
Removes a CUCM Cluster Fusion Server Configuration.
HTTP Request
DELETE /cucm-clusters/{cucmClusterId}/fusion-servers/{cucmClusterFusionServerId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
cucmClusterId | The id of the CUCM Cluster associated with this Configuration. |
cucmClusterFusionServerId | The id of the CUCM Cluster Fusion Server Configuration to retrieve. |
Response
The deletion response format is detailed here.
CUCM Cluster Fusion Server Configuration Response Format
The JSON document used to represent a CUCM Cluster Fusion Server configuration resource has the following content:
Attribute | Type | Description |
---|---|---|
createdAt | ISO 8601 date/time | When this CUCM cluster Fusion Server config was created. |
updatedAt | ISO 8601 date/time | When this CUCM cluster Fusion Server config was last updated. |
id | String | The id of this specific CUCM cluster Fusion Server config, allowing it to be manipulated or retrieved individually. |
name | String | The CUCM cluster name. May be up to 255 characters long. |
permissions | Array[String] | Options: get put delete . Which operations are possible on this resource, given the authentication token being used to access the API. |
syncState | Array[Object] | The endpoints’ sync state. Only applicable for Fusion Servers that this cluster is configured for, and if query param assoc-sync-state is true . |
endpointId | String | The Fusion Server ID with which this configuration should be associated. This value may not be changed on subsequent requests. |
endpoint | Object | An object containing the ID and name of the Fusion Server associated with this configuration |
cmAddress | String | A comma-delimited list of IP Addresses used to connect to the CUCM CTIManager service. These will always be tried in priority order, from left to right. |
cmUsername | String | The username used to connect to the CUCM CTIManager service. |
makeCtiConnection | Boolean | Allows CTI connections to this CUCM cluster and makes this CUCM cluster the 'Primary’ cluster for this Fusion Server. |
jtapiPhoneActivationEnabled | Boolean | If true, phones will be activated via Call Manager over CTI using the JTAPI protocol. If false, phones will be activated via HTTP. |
jtapiStaticTerminalsEnabled | Boolean | Only used when jtapiPhoneActivationEnabled is true. If true, will eager create telephony terminals for all phones associated with the cluster and assigned to this Fusion Server by Activation Group, speeding up activation time. If false, terminals are created during activation and discarded afterward. |
Devices
Provides a unified view of all endpoint devices connected to any Fusion server. This can be used to test filters, get individual device identifiers, etc.
List All Devices
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/devices"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
params = {
'limit': 2
}
try:
devices = requests.get(url, headers=headers, params=params).json()
print(devices)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/devices"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
query = {
'limit': 2
}
begin:
devices = JSON.parse(HTTParty.get(url, headers: headers, query: query))
puts(devices)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/devices?limit=2" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"total": 2,
"previous": null,
"next": null,
"data": [{
"name": "CiscoPhone-388382:SEP001D45E95D12",
"description": "Cisco IP Phone: 12002; DNs: ; SEP001D45E95D12",
"attributes": {
"PartitionNames": "[]",
"HasDisplay": "true",
"DirectoryNumbers": "[]",
"InformaCast4StyleRegExTarget": "name=SEP001D45E95D12\ndesc=12002\ncss=pnp system test\npool=Default\naddr=172.20.127.86\ntype=336",
"Location": "Hub_None",
"CallManagerDevicePool": "Default",
"CallManagerDeviceType": "336",
"Description": "12002",
"IPAddress": "172.20.127.86",
"CallManagerCSS": "pnp system test",
"Name": "SEP001D45E95D12",
"InformaCastDeviceType": "CiscoIPPhone",
"CallManagerClusterName": "BulkPhones",
"EndUserIdentifier": "jim.bob@acme.com"
},
"activationGroupId": null,
"defunct": false,
"id": "37c1fe0a-4b9c-11e7-8148-0242ac110002",
"isLicensed": true
}]
}
Retrieves a list of all Fusion devices. (The Permissions and Security Groups associated with the request, through the user attached to the access token, may limit the resources returned.)
HTTP Request
GET /devices
Produces
application/json
Query Parameters
As usual, the number of responses can be controlled using the API’s pagination parameters. In this case, although up to two devices were requested, there were only two available. The InformaCast Mobile API offers a standard pagination mechanism for list requests like this.
Response
The device response format is detailed here.
Get a Device
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/devices/37c1fe0a-4b9c-11e7-8148-0242ac110002"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
device = requests.get(url, headers=headers).json()
print(device)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/devices/37c1fe0a-4b9c-11e7-8148-0242ac110002"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
device = JSON.parse(HTTParty.get(url, headers: headers))
puts(device)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/devices/37c1fe0a-4b9c-11e7-8148-0242ac110002" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"name": "CiscoPhone-388382:SEP001D45E95D12",
"description": "Cisco IP Phone: 12002; DNs: ; SEP001D45E95D12",
"attributes": {
"PartitionNames": "[]",
"HasDisplay": "true",
"DirectoryNumbers": "[]",
"InformaCast4StyleRegExTarget": "name=SEP001D45E95D12\ndesc=12002\ncss=pnp system test\npool=Default\naddr=172.20.127.86\ntype=336",
"Location": "Hub_None",
"CallManagerDevicePool": "Default",
"CallManagerDeviceType": "336",
"Description": "12002",
"IPAddress": "172.20.127.86",
"CallManagerCSS": "pnp system test",
"Name": "SEP001D45E95D12",
"InformaCastDeviceType": "CiscoIPPhone",
"CallManagerClusterName": "BulkPhones",
"EndUserIdentifier": "jim.bob@acme.com"
},
"defunct": false,
"activationGroupId": null,
"id": "37c1fe0a-4b9c-11e7-8148-0242ac110002",
"isLicensed": true
}
Retrieves a single device by id
. Since this is not a list request, there is no pagination wrapper around the result.
HTTP Request
GET /devices/{deviceId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
deviceId | The id of the Device of interest. |
Response
The device response format is detailed here.
Device Response
The JSON document used to represent a device resource has the following content:
Attribute | Type | Description |
---|---|---|
id | String | The id of this specific device, allowing it to be manipulated or retrieved individually. |
name | String | The name of the device. |
description | String | The description of the device. |
defunct | Boolean | Whether the device is defunct (meaning no Fusion server currently knows about it, but it remains assigned to one or more device groups). |
isLicensed | Boolean | Whether the device is currently licensed to be used. |
attributes | Object | The specific device attributes as they come from a Fusion Server/CUCM. EndUserIdentifier is special: if specified, the device will be attached to the user, if any, whose email matches. |
activationGroupId | String | Used only with multicast-capable devices; the id of the activation group the device belongs to. |
Device Groups
Device Groups are named groups of Devices, and are the recipients of Notifications.
Device Groups are commonly composed of a set of filters that will match certain Devices.
Get All Device Groups
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/device-groups"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
params = {
'limit': 1
}
try:
print(requests.get(url, headers=headers, params=params).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/device-groups"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
query = {
'limit': 1
}
begin:
puts(JSON.parse(HTTParty.get(url, headers: headers, query: query)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/device-groups?limit=1" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"total": 1,
"previous": null,
"next": null,
"data": [
{
"baseDeviceGroups": [{
"id": "9fb8c937-fd05-11e6-a30e-e198ed79b70a",
"activationGroupIds": ["75e24102-a7fc-11e9-ad0a-6d25be5fdfe0"],
"name": "All Phones"
}],
"exclusionIds": ["CiscoPhone-External:SEP381C1ABA7908"],
"filterType": "OR",
"additionIds": ["CiscoPhone-External:SEP381C1ABA7908"],
"additions": [{
"axlError": false,
"defunct": false,
"description": "Cisco IP Phone: Auto 105022; DNs: 105022, 105000; SEP381C1ABA7908",
"deviceIdentifier": "CiscoPhone-External:SEP381C1ABA7908",
"icopId": "CiscoPhone-External:SEP381C1ABA7908",
"id": "9e6e7322-d65a-11e9-9733-3fbe4605e265",
"isLicensed": true,
"type": "phones"
}],
"permissions": ["delete", "put", "get"],
"filters": [{
"value": "john.doe@singlewire.com",
"attribute": "EndUserIdentifier",
"comparison": "EQUALS",
"complement": false,
"caseSensitive": false
}],
"name": "A Large Test",
"baseDeviceGroupIds": ["9fb8c937-fd05-11e6-a30e-e198ed79b70a"],
"exclusions": [{
"axlError": false,
"defunct": false,
"description": "Cisco IP Phone: Auto 105022; DNs: 105022, 105000; SEP381C1ABA7908",
"deviceIdentifier": "CiscoPhone-External:SEP381C1ABA7908",
"icopId": "CiscoPhone-External:SEP381C1ABA7908",
"id": "9e6e7322-d65a-11e9-9733-3fbe4605e265",
"isLicensed": true,
"type": "phones"
}],
"activationGroupIds": ["77828af8-8345-11ea-ac1d-104a7db133de",
"92a45d3e-8345-11ea-ac1d-104a7db133de"],
"activationGroups": [{
"name": "Primary",
"id": "75e24102-a7fc-11e9-ad0a-6d25be5fdfe0"
},{
"name": "Secondary",
"id": "92a45d3e-8345-11ea-ac1d-104a7db133de"
}],
"multicastConfigs": [{
"activationGroupId": "75e24102-a7fc-11e9-ad0a-6d25be5fdfe0",
"address": "224.0.0.1",
"port": 2345,
"type": "poly-ucs",
"channel": 1
},{
"activationGroupId": "92a45d3e-8345-11ea-ac1d-104a7db133de",
"address": "224.0.0.1",
"port": 2346,
"type": "poly-ucs",
"channel": 1
}],
"createdAt": "2017-03-10T22:00:58.290Z",
"updatedAt": "2017-03-10T22:00:58.290Z",
"id": "0aa9c9a4-05dd-11e7-aa6b-8b0e17d53fc7"
}
]
}
Gets a list of all Device Groups available to the current user. (The Permissions and Security Groups associated with the request, through the user attached to the access token, may limit the resources returned. Controlling access to device groups allows administrators to decide to whom users can send notifications.)
HTTP Request
GET /device-groups
Produces
application/json
Query Parameters
To make this example more manageable, only the first Device Group was requested using the API’s pagination parameters. The response reflects this, as well as the fact that there were a total of two available when the request was made. The Informacast Mobile API offers a standard pagination mechanism for list requests like this.
Parameter | Type | Description |
---|---|---|
include-device-counts | Boolean | If true , includes the matching device counts. |
assoc-sync-state | Boolean | If true , include the current synchronization state for fusion endpoints. |
assoc-sync-state-for-endpoint | String | Include the current synchronization state for a specific fusion endpoint. |
includeDomains | Boolean | If true , include the list of Domains to which each device group belongs. |
Response
The Device Group response format is detailed here.
Get One Device Group
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/device-groups/0aa9c9a4-05dd-11e7-aa6b-8b0e17d53fc7"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
group = requests.get(url, headers=headers).json()
print(group)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/device-groups/0aa9c9a4-05dd-11e7-aa6b-8b0e17d53fc7"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
group = JSON.parse(HTTParty.get(url, headers: headers))
puts(group)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/device-groups/0aa9c9a4-05dd-11e7-aa6b-8b0e17d53fc7" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"baseDeviceGroups": [{
"id": "9fb8c937-fd05-11e6-a30e-e198ed79b70a",
"activationGroupIds": ["75e24102-a7fc-11e9-ad0a-6d25be5fdfe0"],
"name": "All Phones"
}],
"exclusionIds": ["CiscoPhone-External:SEP381C1ABA7908"],
"filterType": "OR",
"additionIds": ["CiscoPhone-External:SEP381C1ABA7908"],
"additions": [{
"axlError": false,
"defunct": false,
"description": "Cisco IP Phone: Auto 105022; DNs: 105022, 105000; SEP381C1ABA7908",
"deviceIdentifier": "CiscoPhone-External:SEP381C1ABA7908",
"icopId": "CiscoPhone-External:SEP381C1ABA7908",
"id": "9e6e7322-d65a-11e9-9733-3fbe4605e265",
"isLicensed": true,
"type": "phones"
}],
"permissions": ["delete", "put", "get"],
"filters": [{
"value": "john.doe@singlewire.com",
"attribute": "EndUserIdentifier",
"comparison": "EQUALS",
"complement": false,
"caseSensitive": false
}],
"name": "A Large Test",
"baseDeviceGroupIds": ["9fb8c937-fd05-11e6-a30e-e198ed79b70a"],
"exclusions": [{
"axlError": false,
"defunct": false,
"description": "Cisco IP Phone: Auto 105022; DNs: 105022, 105000; SEP381C1ABA7908",
"deviceIdentifier": "CiscoPhone-External:SEP381C1ABA7908",
"icopId": "CiscoPhone-External:SEP381C1ABA7908",
"id": "9e6e7322-d65a-11e9-9733-3fbe4605e265",
"isLicensed": true,
"type": "phones"
}],
"activationGroupIds": ["77828af8-8345-11ea-ac1d-104a7db133de",
"92a45d3e-8345-11ea-ac1d-104a7db133de"],
"activationGroups": [{
"name": "Primary",
"id": "75e24102-a7fc-11e9-ad0a-6d25be5fdfe0"
},{
"name": "Secondary",
"id": "92a45d3e-8345-11ea-ac1d-104a7db133de"
}],
"multicastConfigs": [{
"activationGroupId": "75e24102-a7fc-11e9-ad0a-6d25be5fdfe0",
"address": "224.0.0.1",
"port": 2345,
"type": "poly-ucs",
"channel": 1
},{
"activationGroupId": "92a45d3e-8345-11ea-ac1d-104a7db133de",
"address": "224.0.0.1",
"port": 2346,
"type": "poly-ucs",
"channel": 1
}],
"createdAt": "2017-03-10T22:00:58.290Z",
"updatedAt": "2017-03-10T22:00:58.290Z",
"id": "0aa9c9a4-05dd-11e7-aa6b-8b0e17d53fc7"
}
Retrieves a single Device Group by its id
. Since this is not a list request, there is no pagination wrapper around the result.
HTTP Request
GET /device-groups/{deviceGroupId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
deviceGroupId | The id of the Device Group to retrieve. |
Query Parameters
Parameter | Type | Description |
---|---|---|
includeDomains | Boolean | If true , include the list of Domains to which the device group belongs. |
Response
The Device Group response format is detailed here.
Create a Device Group
import requests
from requests.exceptions import RequestException
import json
url = "https://api.icmobile.singlewire.com/api/v1/device-groups"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
data = {
'exclusionIds': ['CiscoPhone-External:SEP381C1ABA7908'],
'filterType': 'OR',
'additionIds': ['CiscoPhone-External:SEP381C1ABA7908'],
'filters': [{
'value': 'john.doe@singlewire.com',
'attribute': 'EndUserIdentifier',
'comparison': 'EQUALS',
'complement': false,
'caseSensitive': false
}
],
'name': 'A Large Test',
'baseDeviceGroupIds': ['9fb8c937-fd05-11e6-a30e-e198ed79b70a']
}
try:
group = requests.post(url, headers=headers, data=json.dumps(data)).json()
print(group)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/device-groups"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND=',
'Content-Type': 'application/json'
}
body = {
'exclusionIds': ['CiscoPhone-External:SEP381C1ABA7908'
]
,
'filterType': 'OR'
,
'additionIds': ['CiscoPhone-External:SEP381C1ABA7908'
]
,
'filters': [{
'value': 'john.doe@singlewire.com'
,
'attribute': 'EndUserIdentifier'
,
'comparison': 'EQUALS'
,
'complement': false
,
'caseSensitive': false
}
]
,
'name': 'A Large Test'
,
'baseDeviceGroupIds': ['9fb8c937-fd05-11e6-a30e-e198ed79b70a'
]
}
begin:
group = JSON.parse(HTTParty.post(url, headers: headers, body: JSON.dump(body)))
puts(group)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/device-groups" \
-X POST \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"exclusionIds": ["CiscoPhone-External:SEP381C1ABA7908"], \
"filterType": "OR", \
"additionIds": ["CiscoPhone-External:SEP381C1ABA7908"], \
"filters": [{"value": "john.doe@singlewire.com", \
"attribute": "EndUserIdentifier", \
"comparison": "EQUALS", \
"complement": false, \
"caseSensitive": false}], \
"name": "A Large Test", \
"baseDeviceGroupIds": ["9fb8c937-fd05-11e6-a30e-e198ed79b70a"]}'
{
"baseDeviceGroups": [{
"id": "9fb8c937-fd05-11e6-a30e-e198ed79b70a",
"name": "All Phones"
}],
"exclusionIds": ["CiscoPhone-External:SEP381C1ABA7908"],
"filterType": "OR",
"additionIds": ["CiscoPhone-External:SEP381C1ABA7908"],
"additions": [{
"axlError": false,
"defunct": false,
"description": "Cisco IP Phone: Auto 105022; DNs: 105022, 105000; SEP381C1ABA7908",
"deviceIdentifier": "CiscoPhone-External:SEP381C1ABA7908",
"icopId": "CiscoPhone-External:SEP381C1ABA7908",
"id": "9e6e7322-d65a-11e9-9733-3fbe4605e265",
"isLicensed": true,
"type": "phones"
}],
"permissions": ["delete", "put", "get"],
"filters": [{
"value": "john.doe@singlewire.com",
"attribute": "EndUserIdentifier",
"comparison": "EQUALS",
"complement": false,
"caseSensitive": false
}],
"name": "A Large Test",
"baseDeviceGroupIds": ["9fb8c937-fd05-11e6-a30e-e198ed79b70a"],
"exclusions": [{
"axlError": false,
"defunct": false,
"description": "Cisco IP Phone: Auto 105022; DNs: 105022, 105000; SEP381C1ABA7908",
"deviceIdentifier": "CiscoPhone-External:SEP381C1ABA7908",
"icopId": "CiscoPhone-External:SEP381C1ABA7908",
"id": "9e6e7322-d65a-11e9-9733-3fbe4605e265",
"isLicensed": true,
"type": "phones"
}],
"createdAt": "2017-03-10T22:00:58.290Z",
"updatedAt": "2017-03-10T22:00:58.290Z",
"id": "0aa9c9a4-05dd-11e7-aa6b-8b0e17d53fc7"
}
Creates a new Device Group (limit: 3500). In order to be useful, the filters (limit: 200 per Device Group) or additions should match at least one Device
HTTP Request
POST /device-groups
Consumes
multipart/form-data, application/x-www-form-urlencoded, application/json
Produces
application/json
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
name | String | N/A | The name to give the new Device Group. May be up to 140 characters long. |
exclusionIds | Array[String] | N/A | The specific device icop_id s that are excluded from the Device Group regardless of filters and other Device Groups. This is either the MAC Address (for speakers and idns) or the device identifier (for all other devices). |
filterType | String | N/A | Controls how the filters that define rules for dynamically determining the Devices in this Device Group are combined (i.e. AND or OR , REJECT , ACCEPT , or LOGICAL_EXPRESSION ). If this device group is also configured with baseDeviceGroupIds, the filters will further adjust the devices in the group. |
additionIds | Array[String] | N/A | The specific Device icop_id s that are in the Group regardless of filters and other Device Groups. This is either the MAC Address (for speakers and idns) or the device identifier (for all other devices). |
filters | Array[Object] | N/A | Defines rules to dynamically determine the Devices in this Device Group, combined as specified by filterType. If this Device Group is also filtered with baseDeviceGroupIds, these filters will further adjust the devices in the group. The filters format is detailed here. |
baseDeviceGroupIds | Array[UUID] | N/A | If present, contains the list of Device Group id s that form the starting Devices for this Device Group. The base Device Groups’ associations with Activation Groups will be carried over to the new Device Group; these carried over associations cannot be removed from the new Device Group unless they no longer exist in the base Device Groups. |
activationGroupIds | Array[UUID] | N/A | If present, contains the list of Activation Group id s that form the starting pool of Devices for this Device Group. Currently, this only affects what Poly® phones are included in the starting pool of Devices; all other device types are included in the pool regardless of what Activation Group the belong to. |
Response
The Device Group response format is detailed here.
Update a Device Group
# Continuing with the device group object from
# the previous example:
try:
print(requests.put(url, headers=headers, data=json.dumps(data)).json())
except RequestException as e:
print('Unexpected error!', e)
# Continuing with the device group object from
# the previous example:
begin:
puts(JSON.parse(HTTParty.put(url, headers: headers, body: JSON.dump(body))))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/device-groups/0aa9c9a4-05dd-11e7-aa6b-8b0e17d53fc7" \
-X PUT \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Content-Type: application/json" \
-d '{"exclusionIds": ["CiscoPhone-External:SEP381C1ABA7908"], \
"filterType": "OR", \
"additionIds": ["CiscoPhone-External:SEP381C1ABA7908"], \
"filters": [{"value": "john.doe@singlewire.com", \
"attribute": "EndUserIdentifier", \
"comparison": "EQUALS", \
"complement": false, \
"caseSensitive": false}], \
"name": "A Large Test", \
"baseDeviceGroupIds": ["9fb8c937-fd05-11e6-a30e-e198ed79b70a"]}'
{
"baseDeviceGroups": [{
"id": "9fb8c937-fd05-11e6-a30e-e198ed79b70a",
"name": "All Phones"
}],
"exclusionIds": ["CiscoPhone-External:SEP381C1ABA7908"],
"filterType": "OR",
"additionIds": ["CiscoPhone-External:SEP381C1ABA7908"],
"additions": [{
"axlError": false,
"defunct": false,
"description": "Cisco IP Phone: Auto 105022; DNs: 105022, 105000; SEP381C1ABA7908",
"deviceIdentifier": "CiscoPhone-External:SEP381C1ABA7908",
"icopId": "CiscoPhone-External:SEP381C1ABA7908",
"id": "9e6e7322-d65a-11e9-9733-3fbe4605e265",
"isLicensed": true,
"type": "phones"
}],
"permissions": ["delete", "put", "get"],
"filters": [{
"value": "john.doe@singlewire.com",
"attribute": "EndUserIdentifier",
"comparison": "EQUALS",
"complement": false,
"caseSensitive": false
}],
"name": "A Large Test",
"baseDeviceGroupIds": ["9fb8c937-fd05-11e6-a30e-e198ed79b70a"],
"exclusions": [{
"axlError": false,
"defunct": false,
"description": "Cisco IP Phone: Auto 105022; DNs: 105022, 105000; SEP381C1ABA7908",
"deviceIdentifier": "CiscoPhone-External:SEP381C1ABA7908",
"icopId": "CiscoPhone-External:SEP381C1ABA7908",
"id": "9e6e7322-d65a-11e9-9733-3fbe4605e265",
"isLicensed": true,
"type": "phones"
}],
"activationGroups": [],
"activationGroupIds": [],
"createdAt": "2017-03-10T22:00:58.290Z",
"updatedAt": "2017-03-11T12:21:22.874Z",
"id": "0aa9c9a4-05dd-11e7-aa6b-8b0e17d53fc7"
}
Modifies the details of the Device Group.
HTTP Request
PUT /device-groups/{deviceGroupId}
Consumes
multipart/form-data, application/x-www-form-urlencoded, application/json
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
deviceGroupId | The id of the device group to update. |
Request Parameters
Parameter | Type | Default | Description |
---|---|---|---|
name | String | N/A | The new name to give the Device Group. May be up to 140 characters long. |
exclusionIds | Array[String] | N/A | The specific device icop_id s that are excluded from the Device Group regardless of filters and other Device Groups. This is either the MAC Address (for speakers and idns) or the device identifier (for all other devices). |
filterType | String | N/A | Controls how the filters that define rules for dynamically determining the Devices in this Device Group are combined (i.e. AND or OR , REJECT , ACCEPT , or LOGICAL_EXPRESSION ). If this device group is also configured with baseDeviceGroupIds, the filters will further adjust the devices in the group. |
additionIds | Array[String] | N/A | The specific Device icop_id s that are in the Group regardless of filters and other Device Groups. This is either the MAC Address (for speakers and idns) or the device identifier (for all other devices). |
filters | Array[Object] | N/A | Defines rules to dynamically determine the Devices in this Device Group, combined as specified by filterType. If this Device Group is also filtered with baseDeviceGroupIds, these filters will further adjust the devices in the group. The filters format is detailed here. |
baseDeviceGroupIds | Array[UUID] | N/A | If present, contains the list of Device Group id s that form the starting Devices for this Device Group. |
activationGroupIds | Array[UUID] | N/A | If present, contains the list of Activation Group id s that form the starting pool of Devices for this Device Group. Currently, this only affects what Poly® phones are included in the starting pool of Devices; all other device types are included in the pool regardless of what Activation Group the belong to. |
Response
The Device Group response format is detailed here.
Remove a Device group
# Continuing with the device group object from
# the previous example:
try:
print(requests.delete(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
# Continuing with the device group object from
# the previous example:
begin:
puts(JSON.parse(HTTParty.delete(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/device-groups/3cf58710-2305-11e4-b544-3c970e7ff560" \
-X DELETE \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
-H "Accept: application/json"
{
"status": 200,
"message": "deleted {:name \"DeviceGroups\"} 3cf58710-2305-11e4-b544-3c970e7ff560"
}
Removes a Device Group, discarding its Device information.
HTTP Request
DELETE /device-groups/{deviceGroupId}
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
deviceGroupId | The id of the Device Group to delete. |
Response
The deletion response format is detailed here.
Device Group Response
The JSON document used to represent a Device Group resource has the following content:
Attribute | Type | Description |
---|---|---|
createdAt | ISO 8601 date/time | When this device group was created. |
updatedAt | ISO 8601 date/time | When this device group was last updated. |
id | String | The id of this specific device group, allowing it to be manipulated or retrieved individually. |
name | String | The device group name. May be up to 140 characters long. |
permissions | Array[String] | Options: get put delete . Which operations are possible on this resource, given the authentication token being used to access the API. |
syncState | Array[Object] | The endpoints’ sync state. Only applicable if fusion servers are configured and query param assoc-sync-state is true . |
endpointSyncState | Object | The specific endpoint’s sync state. Only applicable if fusion servers are configured and query param assoc-sync-state-for-endpoint is true . |
exclusionIds | Array[String] | The specific device icop_id s that are excluded from this device group regardless of filters and other device groups. This is either the MAC Address (for speakers and idns) or the device identifier (for all other devices). |
exclusions | Array[Object] | The specific devices that are excluded from this device group regardless of filters and other device groups. |
filterType | String | Controls how the filters that define rules for dynamically determining the Devices in this device group are combined (i.e. AND or OR , REJECT , ACCEPT , or LOGICAL_EXPRESSION ). If this device group is also configured with baseDeviceGroupIds, the filters will further adjust the devices in the group. |
additionIds | Array[String] | The specific device icop_id s that are in the Group regardless of filters and other Device Groups. This is either the MAC Address (for speakers and idns) or the device identifier (for all other devices). |
additions | Array[Object] | The specific devices that are in the group regardless of filters and other device groups. |
filters | Array[Object] | Defines rules to dynamically determine the Devices in this Device Group, combined as specified by filterType. If this Device Group is also filtered with baseDeviceGroupIds, these filters will further adjust the devices in the group. The filters format is detailed here. |
baseDeviceGroupIds | Array[UUID] | If present, contains a list of Device Group id s that form the starting Devices for this Device Group. |
baseDeviceGroups | Array[Object] | If present, contains a list of Device Groups that form the starting devices for this Device Group. |
activationGroupIds | Array[Object] | If present, contains a list ‘id’s of the Activation Groups whose Poly® phones can be added to this device group using additionIds or via rules used in the filters attribute. |
activationGroups | Array[Object] | If present, contains a list of Activation Groups whose Poly® phones can be added to this device group using additionIds or via rules used in the filters attribute. The format of the elements of this attribute is detailed here. |
multicastConfigs | Array[Object] | If present, contains the configurations that will be used for delivering audio notifications to the multicast capable members of this Device Group. The format of the elements of this attribute is detailed here. |
numIdns | Number | Number of matching IDNs. Included if query contains the include-device-counts set to true . |
numPhones | Number | Number of matching phones. Included if query contains the include-device-counts set to true . |
numPlugins | Number | Number of matching plugins. Included if query contains the include-device-counts set to true . |
numSpeakers | Number | Number of matching speakers. Included if query contains the include-device-counts set to true . |
Device Group Filters Format
The JSON document used to represent a Device Group Filter has the following content (see the InformaCast Documentation for more details):
Attribute | Type | Description |
---|---|---|
attribute | String | The attribute to filter. |
complement | Boolean | Controls whether the filter’s meaning is reversed. If true , it will match devices that do not meet the specified criteria. (You might use this when it is simpler to specify what to exclude; you can think of it as adding “does not” in front of the rule.) |
comparison | String | The comparison used for the filter (BEGINS_WITH , CONTAINS , ENDS_WITH , EQUALS , or MATCHES_REGEX ; legal values depend on the attribute). |
value | String | A text value for the comparison. |
caseSensitive | Boolean | Controls whether comparisons should care about capitalization. |
Activation Group Elements Format
The JSON document used to represent an Activation Group associated with a Device Group has the following format:
Attribute | Type | Description |
---|---|---|
name | String | The name of the Activation Group |
id | String | The id of the Activaion Group |
Multicast Configurations Format
The JSON document that describes an individual configuration used by a Device Group when delivering audio to its multicast capable members has the following format:
Attribute | Type | Description |
---|---|---|
activationGroupId | String | The id of the Activation Group whose members will be set up to use this configuration in order to receive audio notifications sent to the Device Group where they also appear as members. |
address | String | The multicast address to which the audio notifications will be sent. |
port | Number | The network port to which the audio notifications will be sent. |
type | String | The type of multicast audio format which will be used for encoding the audio notifications; currently supported formats are poly-ucs , which corresponds to the format used for Group Paging supported by Poly® phones with UCS firmware, and gms , which corresponds to the RTP ulaw format. |
channel | Number | If the type attribute’s value is set to poly , specifies the channel number the Poly® group members will be subscribed to in order to receive audio notifications. |
Device Group Domains
Domains allow for hierarchical delegation of authority over supported resources. When they are in use, Device Groups are assigned to at least one Domain, and can be associated with more than one. This resource lets you see and adjust which Device Groups are assigned to which Domains.
List All Device Group Domains
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/device-groups/c54e4241-299b-11e8-94d3-2be9464da125/domains"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
print(requests.get(url, headers=headers).json())
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/device-groups/c54e4241-299b-11e8-94d3-2be9464da125/domains"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
puts(JSON.parse(HTTParty.get(url, headers: headers)))
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/device-groups/c54e4241-299b-11e8-94d3-2be9464da125/domains" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"total": 2,
"previous": null,
"next": null,
"partial": false,
"data": [
{
"id": "a4e9e56c-28df-11e8-8c38-738c606ef19c",
"parentId": "9ca35dab-28df-11e8-8c38-235a5737f6bb",
"name": "Vending",
"path": "/90de0f6a-28df-11e8-8c38-e9fe0f3683de/9ca35dab-28df-11e8-8c38-235a5737f6bb/a4e9e56c-28df-11e8-8c38-738c606ef19c/",
"namePath": "/West Campus/Stadium/Vending/",
"deviceGroupId": "c54e4241-299b-11e8-94d3-2be9464da125",
"permissions": [
"delete",
"put",
"get"
],
"createdAt": "2018-03-16T06:02:44.441Z"
},
{
"id": "f04e3599-295b-11e8-b54b-abb9a309846e",
"parentId": "9ca35dab-28df-11e8-8c38-235a5737f6bb",
"name": "Grounds",
"path": "/90de0f6a-28df-11e8-8c38-e9fe0f3683de/9ca35dab-28df-11e8-8c38-235a5737f6bb/f04e3599-295b-11e8-b54b-abb9a309846e/",
"namePath": "/West Campus/Stadium/Grounds/",
"deviceGroupId": "c54e4241-299b-11e8-94d3-2be9464da125",
"permissions": [
"delete",
"put",
"get"
],
"createdAt": "2018-03-16T20:52:28.522Z"
}
]
}
Retrieves the list of all Domains to which the Device Group belongs. (The permissions associated with the request, through the user attached to the access token, may limit the visibility of results.)
HTTP Request
GET /device-groups/{deviceGroupId}/domains
Produces
application/json
Path Parameters
Parameter | Description |
---|---|
deviceGroupId | The id of the Device Group whose associated Domains are to be listed. |
Query Parameters
In this example, There were a total of 2 Domains that the specified Device Group belonged to when the request was made, and both were returned. The Informacast Mobile API offers a standard pagination mechanism for list requests like this.
Additionally, you can request the subdomains of any Domain attached to the specified Device Group using a query parameter, and/or filter the results by matching on the Domain name:
Parameter | Type | Description |
---|---|---|
name | String | Returns only Domains whose names exactly match the supplied value. |
recursive | Boolean | If true , in addition to Domains that are directly attached to the specified Device Group, any subdomains will be returned. |
Response
The Domain response format is detailed here.
Additionally, the id
of the device group whose domains were
requested is returned under the key deviceGroupId
inside each domain
response.
Check if a Device Group contains a Domain
import requests
from requests.exceptions import RequestException
url = "https://api.icmobile.singlewire.com/api/v1/device-groups/c54e4241-299b-11e8-94d3-2be9464da125/domains/f04e3599-295b-11e8-b54b-abb9a309846e"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
try:
domain = requests.get(url, headers=headers).json()
print(domain)
except RequestException as e:
print('Unexpected error!', e)
require 'httparty'
require 'json'
url = "https://api.icmobile.singlewire.com/api/v1/device-groups/c54e4241-299b-11e8-94d3-2be9464da125/domains/f04e3599-295b-11e8-b54b-abb9a309846e"
headers = {
'Authorization': 'Bearer S35QCVBN6S6TUQKHOND='
}
begin:
domain = JSON.parse(HTTParty.get(url, headers: headers))
puts(domain)
rescue StandardError => e
puts e
curl "https://api.icmobile.singlewire.com/api/v1/device-groups/c54e4241-299b-11e8-94d3-2be9464da125/domains/f04e3599-295b-11e8-b54b-abb9a309846e" \
-H "Authorization: Bearer S35QCVBN6S6TUQKHOND=" \
{
"id"