Skip to main content

Public APIs - Device and evidence retrieval

Overview

On the settings page, you can retrieve your organization API token to pull Swif data into 3rd party platform.

For general patterns and examples of using Swif APIs, see:
​APIs – Manage Employees

For retrieving device applications, see:
​APIs – Device Application Retrieval

For retrieving device browser extensions, see:
​APIs – Device Extensions

For APIs – Team Installer Retrieval, see:
​APIs – Team Installer Retrieval.

Migration and Performance Optimization

As of August 2026, the applicationInfo and extension field has been removed from the main Device Inventory API (GET /restful/organization/devices) to significantly improve performance and reduce payload sizes.

If your existing integration relies on application data, you will need to update your workflow as follows:

  1. Retrieve Device IDs: Continue using the /devices endpoint to get your list of managed devices.

  2. Fetch Applications Individually: Use the id from the device record to call the new dedicated endpoint:

    1. Device Application Retrieval
      ​/restful/organization/devices/:deviceId/applications.

    2. Device Extension Retrieval
      ​/restful/organization/devices/:deviceId/extensions

  3. Implement Pagination: The new endpoint supports limit and offset parameters, allowing you to efficiently handle devices with a large number of installed applications.

This change ensures faster response times and prevents "Repository Entity Not Found" errors that could previously occur when processing massive data payloads.

Regional Endpoints

Ensure you are using the correct base URL for your organization's data residency:

  • US / Global: https://api.swifteam.com

  • EU Tenant: https://api.eu.swifteam.com

Team filtering and team details

You can get your organization's teams and use a team ID to see only the devices or employees in that team. Requests that don't include teamId work exactly as before, so you don't need to change existing integrations.

How it works:

  1. Call GET /restful/organization/teams to get your team IDs.

  2. Add teamId=<id> to /devices or /employees.

List teams

GET /restful/organization/teams returns your organization's active teams, sorted by name and then by ID. It doesn't take any parameters.

CURL request

curl --location 'https://api.swifteam.com/restful/organization/teams' \
--header 'Authorization: Bearer {TOKEN}'

Sample JSON response

{
"records": [
{ "teamId": "6667d7c93300001200972f03", "teamName": "Engineering" },
{ "teamId": "68a71f053000001f00873d00", "teamName": "QA" }
],
"meta": {
"totalCount": 2,
"resultCount": 2,
"haveMore": false
}
}

Field

Type

Description

teamId

string

The team's ID (24 hexadecimal characters)

teamName

string (optional)

The team's name

Filter devices by team

Add the optional teamId parameter to GET /restful/organization/devices. You can still use q, offset (default 0) and limit (default 10) with it.

CURL request

curl --location 'https://api.swifteam.com/restful/organization/devices?teamId=6667d7c93300001200972f03&offset=0&limit=10' \
--header 'Authorization: Bearer {TOKEN}'

When you filter by team, you only get that team's devices. The meta counts include only the matching devices.

Filter employees by team

GET /restful/organization/employees also takes the optional teamId parameter, and works with q, offset and limit the same way. The filter only looks at each employee's primary team.

curl --location 'https://api.swifteam.com/restful/organization/employees?teamId=6667d7c93300001200972f03&offset=0&limit=10' \
--header 'Authorization: Bearer {TOKEN}'

Team fields in device and employee records

Each device and employee record now has two top-level fields, whether or not you filter by team:

"teamId": "6667d7c93300001200972f03",
"teamName": "Engineering"

teamName can be missing for older records whose team is no longer active.

Errors

HTTP status

Code

When it happens

400

PUBLIC_API_INVALID_TEAM_ID

teamId is empty or isn't 24 hexadecimal characters

404

PUBLIC_API_TEAM_NOT_FOUND

The team doesn't exist, was deleted, or belongs to another organization

Both errors include a friendlyMessage that you can show to users.

Also update the existing sample: in the "Sample JSON response and its type" block, add these two lines after systemPolicy, inside the device record:

"teamId": "6667d7c93300001200972f03",
"teamName": "Engineering"

Device and evidence retrieval

CURL request

curl --location 'https://api.swifteam.com/restful/organization/devices?q=C02WX0L0JG5H&offset=0&limit=1' \
--header 'Authorization: Bearer {TOKEN}'

Sample JSON response and its type

{
"records": [
{
"id": "6351ac3532000014004ad63f",
"isAntiVirusAppInstalled": true,
"isPasswordManagerAppInstalled": true,
"isActive": true,
"owner": {
"firstName": "Elon",
"lastName": "Huang",
"emails": [
"elon@swifteam.com"
]
},
"deviceInfo": {
"deviceName": "Admin’s MacBook Pro",
"status": "ACTIVE",
"osVersion": "15.7.1",
"osName": "macOS",
"osBuildVersion": "24G231",
"modelName": "MacBook Pro",
"modelId": "MacBookPro15,1",
"productName": "MacBookPro15,1",
"deviceType": "Laptop",
"serialNumber": "C02WX0L0JG5H",
"deviceCapacity": 250,
"availableDeviceCapacity": 230
},
"mdmDeviceInfo": {
"mdmDeviceId": "xxxxxxxx",
"mdm_LastEnrolledAt": "2025-11-02T23:09:51.075Z",
"mdm_LastPingAt": "2025-11-14T06:00:20.961Z",
"encryption": {
"encryptionStatus": "Unencrypted",
"encryptionEnabled": false
}
},
"osQueryDeviceInfo": {
"os": {
"arch": "x86_64",
"build": "20G1427",
"major": "11",
"minor": "7",
"name": "macOS",
"patch": "10",
"version": "11.7.10"
},
"hardware": {
"chipType": "",
"cpuType": "Dual-Core Intel Core i5",
"currentProcessorSpeed": "2.4 GHz",
"l2CacheCore": "256 KB",
"l3Cache": "3 MB",
"machineModel": "MacBookPro6,2",
"machineName": "MacBook Pro",
"modelNumber": "",
"modelSpec": {
"colors": [],
"fullName": "MacBook Pro (15-inch, Mid 2010)",
"imageURL": "https://cdsassets.apple.com/live/7WUAS350/images/macbook-pro/macbook-pro-mid-2010-15in-device.jpg",
"modelIdentifier": [
"MacBookPro6,2"
],
"newestOperatingSystem": "macOS High Sierra",
"partNumbers": [
"MC373xx/A",
"MC372xx/A",
"MC371xx/A"
],
"productYear": "2010",
"productYearInt": 2010,
"screenSize": "15-inch",
"techSpecsURL": "https://support.apple.com/en-us/112605",
"userGuideURL": "https://cdsassets.apple.com/live/6GJYWVAV/user/ma1527_macbook_pro_15inch_mid2010.pdf"
},
"numberProcessors": "2",
"physicalMemory": "8 GB"
}
},
"systemPolicy": {
"password": {
"minLength": 4,
"pinHistory": 0,
"allowSimple": true,
"maxInactivity": 0,
"maxGracePeriod": 0,
"minimumPasswordAge": 0,
"maximumPasswordAge": 0,
"minComplexChars": 0,
"maxFailedAttempts": 0,
"requireAlphanumeric": false,
"minutesUntilFailedLoginReset": 0,
"lockoutBadCount": 0,
"lockoutDuration": 0
},
"screenSaver": {
"idleTime": 0,
"askForPassword": false,
"askForPasswordDelay": -1,
"screenSaveActive": false,
"screenSaverExe": "",
"screenSaverGracePeriod": 0
}
}
}
],
"meta": {
"totalCount": 1,
"resultCount": 1,
"haveMore": false
}
}
Did this answer your question?