openapi: 3.2.0
info:
version: 0.7.0
title: Aeris IoT Watchtowerâ„¢ Device Groups API
description: '## Introduction
The Aeris IoT Watchtowerâ„¢ API provides access to resources such as real-time events, aggregated events, risk assessment reports, and device group operations.'
termsOfService: https://www.aeris.com/services-terms-of-use/
contact:
email: support@aeris.net
url: https://www.aeris.com/support/
license:
name: Aeris License
url: https://www.aeris.com/services-terms-of-use/
x-audience: external-public
servers:
- url: https://watchtower-api-prd.aeriscloud.com
security:
- oAuth2ClientCredentials: []
tags:
- name: Device Groups
description: Endpoints for Device Groups
paths:
/watchtower/v1/device-groups:
post:
summary: Create a new device group
operationId: createDeviceGroup
tags:
- Device Groups
parameters:
- $ref: '#/components/parameters/authorization'
- $ref: '#/components/parameters/accountId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DeviceGroupCreateRequest'
responses:
'201':
description: Device group created successfully
content:
application/json:
schema:
type: integer
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'429':
$ref: '#/components/responses/429'
'500':
$ref: '#/components/responses/500'
/watchtower/v1/device-groups/search:
post:
summary: Get device groups
tags:
- Device Groups
operationId: getDeviceGroups
parameters:
- $ref: '#/components/parameters/authorization'
- $ref: '#/components/parameters/accountId'
- $ref: '#/components/parameters/startTime'
- $ref: '#/components/parameters/endTime'
- $ref: '#/components/parameters/offset'
- $ref: '#/components/parameters/limit'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DeviceGroupQueryRequest'
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/PagedDeviceGroupTable'
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'413':
$ref: '#/components/responses/413'
'429':
$ref: '#/components/responses/429'
'500':
$ref: '#/components/responses/500'
/watchtower/v1/device-groups/{deviceGroupId}:
get:
summary: Get device group details
tags:
- Device Groups
operationId: getDeviceGroup
parameters:
- $ref: '#/components/parameters/authorization'
- $ref: '#/components/parameters/accountId'
- $ref: '#/components/parameters/deviceGroupId'
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/DeviceGroup'
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'404':
$ref: '#/components/responses/404'
'429':
$ref: '#/components/responses/429'
'500':
$ref: '#/components/responses/500'
put:
summary: Update an existing device group
operationId: updateDeviceGroup
tags:
- Device Groups
parameters:
- $ref: '#/components/parameters/authorization'
- $ref: '#/components/parameters/accountId'
- $ref: '#/components/parameters/deviceGroupId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DeviceGroupUpdateRequest'
responses:
'204':
description: No content, the resource was successfully updated.
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'429':
$ref: '#/components/responses/429'
'500':
$ref: '#/components/responses/500'
delete:
summary: Delete a new device group
operationId: deleteDeviceGroup
tags:
- Device Groups
parameters:
- $ref: '#/components/parameters/authorization'
- $ref: '#/components/parameters/accountId'
- $ref: '#/components/parameters/deviceGroupId'
responses:
'204':
description: No content, the resource was successfully deleted.
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'429':
$ref: '#/components/responses/429'
'500':
$ref: '#/components/responses/500'
/watchtower/v1/device-groups/export:
post:
summary: Get Device Groups exported as CSV
tags:
- Device Groups
operationId: exportDeviceGroups
parameters:
- $ref: '#/components/parameters/authorization'
- $ref: '#/components/parameters/accountId'
- $ref: '#/components/parameters/startTime'
- $ref: '#/components/parameters/endTime'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DeviceGroupQueryRequest'
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/ScheduledReport'
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'429':
$ref: '#/components/responses/429'
'500':
$ref: '#/components/responses/500'
/watchtower/v1/device-groups/{deviceGroupId}/devices/export:
post:
summary: Get Device Group Devices exported as CSV
tags:
- Device Groups
operationId: exportDeviceGroupDevices
parameters:
- $ref: '#/components/parameters/authorization'
- $ref: '#/components/parameters/accountId'
- $ref: '#/components/parameters/deviceGroupId'
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/ScheduledReport'
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'429':
$ref: '#/components/responses/429'
'500':
$ref: '#/components/responses/500'
components:
parameters:
startTime:
name: startTime
in: query
required: true
description: The start timestamp. (inclusive)
example: '2021-07-01T06:30:00Z'
schema:
$ref: '#/components/schemas/dateTime'
endTime:
name: endTime
in: query
required: true
description: The end timestamp. (exclusive)
example: '2021-07-05T06:30:00Z'
schema:
$ref: '#/components/schemas/dateTime'
accountId:
name: X-Watchtower-Account-Id
in: header
description: Account Id
required: true
schema:
$ref: '#/components/schemas/accountId'
example: 1002000010
offset:
name: offset
in: query
description: The position in pagination. Specifies the starting row offset into the result set returned. For example, if the page size (limit) is 10, then to select the second page, pass the offset as 10 to retrieve items 11 to 20.
Search parameters must be consistent across pages.
schema:
$ref: '#/components/schemas/offset'
deviceGroupId:
name: deviceGroupId
in: path
required: true
description: The ID of the device group
schema:
type: integer
authorization:
name: Authorization
in: header
description: Bearer Token for authentication
required: true
schema:
type: string
pattern: ^Bearer [A-Za-z0-9-._~+/]+=*$
example: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ...
limit:
name: limit
in: query
description: The number of items to retrieve per page (10000 max).
schema:
$ref: '#/components/schemas/limit'
schemas:
DeviceGroupBase:
type: object
properties:
name:
type: string
description:
type: string
colorCode:
type: string
deviceAssigningType:
$ref: '#/components/schemas/DeviceGroupAssigningType'
customFields:
type: array
items:
$ref: '#/components/schemas/DeviceCustomField'
devices:
type: array
description: Information about devices. Fill if deviceAssigningType = MANUALLY, empty otherwise
items:
$ref: '#/components/schemas/Device'
tacCodes:
type: array
items:
$ref: '#/components/schemas/DeviceTACCodeInfo'
totalDevices:
type: integer
createdBy:
type: string
createdTime:
type: string
format: date-time
updatedBy:
type: string
updatedTime:
type: string
format: date-time
ranking:
type: integer
deviceGroupType:
$ref: '#/components/schemas/DeviceGroupType'
servicePlan:
type: string
deprecated: true
description: Deprecated. Use servicePlans.
servicePlans:
type: array
items:
type: string
enforcementRules:
type: array
items:
$ref: '#/components/schemas/EnforcementRuleBase'
locationListIds:
type: array
items:
type: integer
format: int64
total:
type: integer
format: int64
description: Total number of items available.
example: 1
minimum: 0
offset:
description: Position in pagination.
type: integer
format: int32
default: 0
minimum: 0
limit:
type: integer
format: int32
description: Number of items to retrieve (10000 max).
minimum: 1
maximum: 10000
default: 20
Device:
type: object
required:
- iccid
- imsi
properties:
iccid:
type: string
description: iccid of device
maxLength: 50
imsi:
type: string
description: imsi of device
maxLength: 50
accountId:
description: Account Id.
type: integer
format: int32
example: 10407
minimum: 0
DeviceCustomField:
type: object
description: Information about custom fields. Fill if deviceAssigningType = AUTO_BY_CUSTOM_FIELDS, empty otherwise
required:
- customFieldId
- customFieldValue
properties:
customFieldId:
type: integer
format: int64
description: custom field id of group
customFieldValue:
type: string
description: custom field value of group
maxLength: 256
DeviceGroupCreateRequest:
allOf:
- $ref: '#/components/schemas/DeviceGroupResourceBase'
- type: object
properties:
deviceGroupType:
$ref: '#/components/schemas/DeviceGroupType'
DeviceTACCodeInfo:
type: object
properties:
tac:
type: string
type:
type: string
brand:
type: string
model:
type: string
totalDevices:
type: integer
deviceGroups:
type: array
items:
$ref: '#/components/schemas/DeviceGroupInfo'
PagedDeviceGroupTable:
allOf:
- $ref: '#/components/schemas/Pagination'
- type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/DeviceGroup'
DeviceGroupQueryRequest:
type: object
description: Search for name, assign type and created time range (set to null if don't want to filter)
properties:
name:
type: string
maxLength: 1024
deviceAssigningType:
type: array
items:
$ref: '#/components/schemas/DeviceGroupAssigningType'
deviceGroupType:
type: array
items:
$ref: '#/components/schemas/DeviceGroupType'
enforcementRuleId:
type: array
items:
type: integer
enforcementRuleStatus:
type: array
items:
type: string
rankingMin:
type: integer
rankingMax:
type: integer
totalMin:
type: integer
totalMax:
type: integer
tac:
type: array
items:
type: string
brand:
type: array
items:
type: string
model:
type: array
items:
type: string
type:
type: array
items:
type: string
enforcementRuleApn:
type: array
items:
type: string
enforcementRuleApnNot:
type: array
items:
type: string
isCountingActiveOnly:
type: boolean
default: true
DeviceGroupResourceBase:
type: object
properties:
name:
type: string
description:
type: string
deviceAssigningType:
$ref: '#/components/schemas/DeviceGroupAssigningType'
customFields:
type: array
items:
$ref: '#/components/schemas/DeviceCustomField'
description: Information about custom fields. Fill if deviceAssigningType = AUTO_BY_CUSTOM_FIELDS, empty otherwise
devices:
type: array
description: Information about devices. Fill if deviceAssigningType = MANUALLY, empty otherwise
items:
$ref: '#/components/schemas/Device'
tacCodes:
type: array
items:
type: string
description: Information about tac codes. Fill if deviceAssigningType = AUTO_BY_TAC_CODES, empty otherwise
servicePlan:
type: string
deprecated: true
description: Deprecated. Use servicePlans.
servicePlans:
type: array
items:
type: string
ranking:
type: integer
Error:
type: object
properties:
code:
type: integer
description: HTTP code
example: 500
message:
type: string
description: Error message
example: An error encountered in processing the request
timestamp:
type: string
description: ISO DateTime
example: '2025-06-02 09:01:53.678'
path:
type: string
description: Endpoint path at which the error occured
example: /watchtower/v1/events
traceId:
type: string
description: Trace Id
example: ed81f29f-ea9b-4099-aa00-f8ed40b7a567
DeviceGroupType:
type: string
enum:
- REPORTING
- ENFORCEMENT
DeviceGroupAssigningType:
type: string
description: assign type
enum:
- AUTO_BY_TAC_CODES
- AUTO_BY_CUSTOM_FIELDS
- MANUALLY
- AUTO_BY_SERVICE_PLAN
example: AUTO_BY_TAC_CODES
DeviceGroupUpdateRequest:
allOf:
- $ref: '#/components/schemas/DeviceGroupResourceBase'
dateTime:
description: ISO 8601 date time
type: string
format: date-time
example: '2021-07-04T17:36:47Z'
Pagination:
type: object
properties:
total:
$ref: '#/components/schemas/total'
offset:
$ref: '#/components/schemas/offset'
limit:
$ref: '#/components/schemas/limit'
DeviceGroup:
allOf:
- type: object
properties:
id:
type: integer
- $ref: '#/components/schemas/DeviceGroupBase'
ScheduledReport:
type: object
properties:
reportId:
description: Report Id
type: string
example: 7ae9e22d-8ad4-4a69-950a-6b13d75f0c74
status:
$ref: '#/components/schemas/ReportStatus'
statusEndpoint:
description: Report Status URL
type: string
example: /watchtower/v1/scheduled-reports/7ae9e22d-8ad4-4a69-950a-6b13d75f0c74
ReportStatus:
description: Report status
type: string
example: Processing
enum:
- Success
- Processing
- Error
- NotStarted
enforcementRuleId:
description: Enforcement Rule identifier
type: integer
format: int64
example: 5102010
EnforcementRuleBase:
type: object
properties:
id:
$ref: '#/components/schemas/enforcementRuleId'
name:
type: string
status:
type: string
apn:
type: string
DeviceGroupInfo:
type: object
properties:
id:
type: integer
format: int64
name:
type: string
colorCode:
type: string
deviceGroupType:
type: string
responses:
'429':
description: Too many requests.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
code: 429
message: 'Rate Limit Exceeded (XX) for clientId: XXXXXX. Please retry after XXX seconds'
timestamp: 2025-06-01 13:28:03.967000
path: /watchtower/v1/...
traceId: c3db9d7a432317363c8bc5ddb5aadf4b
'401':
description: Not authorized.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
code: 401
message: Unauthorized
timestamp: 2025-06-01 13:28:03.967000
path: /watchtower/v1/...
traceId: c3db9d7a432317363c8bc5ddb5aadf4b
'403':
description: Forbidden.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
code: 403
message: Forbidden
timestamp: 2025-06-01 13:28:03.967000
path: /watchtower/v1/...
traceId: c3db9d7a432317363c8bc5ddb5aadf4b
'400':
description: Bad Request.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
code: 400
message: Bad Request
timestamp: 2025-06-01 13:28:03.967000
path: /watchtower/v1/...
traceId: c3db9d7a432317363c8bc5ddb5aadf4b
'404':
description: Not found.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
code: 404
message: Not found
timestamp: 2025-06-01 13:28:03.967000
path: /watchtower/v1/...
traceId: c3db9d7a432317363c8bc5ddb5aadf4b
'413':
description: Requested data too large
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
code: 413
message: Requested data too large. Please use /watchtower/v1/.../export for requesting larger amounts of data
timestamp: 2025-06-01 13:28:03.967000
path: /watchtower/v1/...
traceId: c3db9d7a432317363c8bc5ddb5aadf4b
'500':
description: Internal Server Error.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
code: 500
message: Internal Server Error
timestamp: 2025-06-01 13:28:03.967000
path: /watchtower/v1/...
traceId: c3db9d7a432317363c8bc5ddb5aadf4b
securitySchemes:
oAuth2ClientCredentials:
type: oauth2
description: This API uses OAuth 2 with the Client Credentials flow.
flows:
clientCredentials:
tokenUrl: /watchtower/v1/auth/token
scopes: {}