Get devices, optionally narrowed by a filter
Return the devices of your company as a paginated JSON list of full device objects — use it to look up, filter or answer questions about the devices themselves. Send an empty body to list everything; add a filter to narrow it. Every filter entry is keyed by a key from getDeviceFilterCatalog (GET /devices/filters-options) and its value is always a clause { "operationType": "INCLUDE" | "EXCLUDE", "values": [...] } — there are no comparison operators (no eq, gt, contains) and never a bare value (illustrative clauses are on the filter parameter). An unknown key is rejected with 400 — the criterion is never silently ignored. Add matchAny: true for OR instead of AND. search is free text over name, serial number, IMEI, owner and custom field values. Device objects are large, so pages are small (max 100), and leave out imeis and macAddress: read them with getDevice, or with exportDevices for many devices. To count devices, one total or a breakdown of up to 20 filters, use countDevices instead. To extract the whole inventory as a CSV file (spreadsheet, download, report), use exportDevices instead, or exportInventory for a file of devices and the employees holding them, with no device code. Retired devices are left out unless the filter has an availableStatus clause: INCLUDE keeps only the statuses it lists, EXCLUDE every other status, retired ones included. apnsTopic (macOS, iOS, iPadOS) is the uuid of the APNs certificate topic the device enrolled under, null when the MDM is not on.
Authorizations
Use your Primo API key in the Authorization header as Bearer <API_KEY>.
Body
One entry per criterion, keyed by the key returned by the filter catalog (GET /devices/filters-options) — a native key such as platform, availableStatus, assigned or mdmStatuses.online, or a custom field id. Every value is a clause { operationType, values } — never a bare value, never an operator like eq. availableStatus takes only IN_USE, IN_STOCK, RETIRED. Whether a device has an owner is assigned (true or false), never a status. Enrollment is mdmStatus: MDM_ON is enrolled, MDM_OFF, MISSING_AGENT, READY_ZTD and MDM_ON_IN_ANOTHER_MDM are the other states. A device name, serial number or IMEI goes in search. The device type is not a criterion: read type on the returned devices. An unknown key is rejected with 400 rather than ignored. Illustrative filters: devices free to hand out → {"availableStatus":{"operationType":"INCLUDE","values":["IN_STOCK"]},"assigned":{"operationType":"INCLUDE","values":[false]}}; devices offline for a week or more → {"mdmStatuses.online":{"operationType":"INCLUDE","values":["INACTIVE"]}}; macOS in use → {"platform":{"operationType":"INCLUDE","values":["MACOS"]},"availableStatus":{"operationType":"INCLUDE","values":["IN_USE"]}}; devices in use to encrypt, as the company metrics count them → {"availableStatus":{"operationType":"INCLUDE","values":["IN_USE"]},"mdmStatuses.encryption":{"operationType":"INCLUDE","values":["NOT_ENCRYPTED"]},"withMdmIssue":{"operationType":"INCLUDE","values":[true]}} (encrypted is what the disk inventory reports, not the compliance verdict); a custom field value → {"<customFieldId>":{"operationType":"INCLUDE","values":["<optionId>"]}}.
When true, a device matching ANY clause is returned (OR). Omitted or false means every clause must match (AND).
Free-text search over device name, serial number, IMEI, owner and custom field values.
1 <= x <= 9007199254740991Devices per page (default 25, max 100). Device payloads are large — keep pages small.
1 <= x <= 100