openapi: 3.2.0 info: version: 0.7.0 title: Aeris IoT Watchtower™ TAC Codes 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: TAC Codes paths: /watchtower/v1/tac-codes/search: post: summary: Search TAC Codes description: 'Returns a paginated list of TAC codes (Type Allocation Codes) observed across all devices in the account, including the device type, brand, model, and the total number of devices sharing that TAC. Sort by `totalDevices:DESC` (default) or any other response field in `asc`/`desc` order.' operationId: searchTACCodes tags: - TAC Codes parameters: - $ref: '#/components/parameters/authorization' - $ref: '#/components/parameters/accountId' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/sort' requestBody: content: application/json: schema: $ref: '#/components/schemas/TACCodeSearchFilter' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/PagedTACCodeList' '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/tac-codes/summary: get: summary: Get TAC Codes Metrics description: 'Returns a full summary of TAC code distributions across all devices in the account: device type breakdown (`summaryOfTypes`), manufacturer brand breakdown (`summaryOfBrands`), and model breakdown (`summaryOfModels`), plus the total device count with a recognised TAC (`totalTacCodeDevices`). No pagination — returns the complete result set in a single response.' operationId: getTACCodesSummary tags: - TAC Codes parameters: - $ref: '#/components/parameters/authorization' - $ref: '#/components/parameters/accountId' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/TACCodeMetrics' '401': $ref: '#/components/responses/401' '403': $ref: '#/components/responses/403' '429': $ref: '#/components/responses/429' '500': $ref: '#/components/responses/500' components: 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 '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 schemas: 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 accountId: description: Account Id. type: integer format: int32 example: 10407 minimum: 0 TACCodeSummaryEntry: type: object description: A name/count pair representing one category in a TAC code metric summary. properties: name: type: string description: Category label (device type, brand name, or model name). example: Modem total: type: integer description: Number of devices in this category. example: 405 TACCodeSearchFilter: type: object description: Optional filter body for searching TAC codes. All filters are optional; omit the body or send `{}` to retrieve all TAC codes for the account. properties: tac: type: array description: Filter by one or more exact TAC codes. items: type: string example: - '86471806' - '35691411' type: type: array description: Filter by device type (case-insensitive). items: type: string example: - Modem - IoT Device brand: type: array description: Filter by device brand/manufacturer (case-insensitive). items: type: string example: - Quectel - Fibocom model: type: array description: Filter by device model (case-insensitive). items: type: string example: - EC21 - MA510-GL 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 TACCodeMetrics: type: object description: Full TAC code distribution summary for the account. properties: totalTacCodeDevices: type: integer description: Total number of devices with a recognised TAC in the account. example: 478 summaryOfTypes: type: array description: Distribution of devices by device type (e.g. Modem, IoT Device). items: $ref: '#/components/schemas/TACCodeSummaryEntry' summaryOfBrands: type: array description: Distribution of devices by manufacturer brand. items: $ref: '#/components/schemas/TACCodeSummaryEntry' summaryOfModels: type: array description: Distribution of devices by model name. items: $ref: '#/components/schemas/TACCodeSummaryEntry' Pagination: type: object properties: total: $ref: '#/components/schemas/total' offset: $ref: '#/components/schemas/offset' limit: $ref: '#/components/schemas/limit' PagedTACCodeList: allOf: - $ref: '#/components/schemas/Pagination' - type: object properties: data: type: array description: List of TAC code entries observed in the account. items: $ref: '#/components/schemas/TACCodeEntry' TACCodeEntry: type: object description: TAC code entry with device type metadata and total device count. properties: tac: type: string description: TAC (Type Allocation Code) — first 8 digits of the IMEI. example: '86471806' type: type: string description: Device category derived from the TAC. example: Modem brand: type: string description: Device manufacturer derived from the TAC. example: Fibocom model: type: string description: Device model derived from the TAC. example: MA510-GL totalDevices: type: integer description: Number of devices in the account that share this TAC. example: 113 parameters: sort: name: sort in: query description: Use sort=comma-separated-fields[:asc|desc] to sort the result. example: deviceId,updateTime:desc schema: type: string 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' 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' securitySchemes: oAuth2ClientCredentials: type: oauth2 description: This API uses OAuth 2 with the Client Credentials flow. flows: clientCredentials: tokenUrl: /watchtower/v1/auth/token scopes: {}