Tool Name: airdroid_business_policy_kiosk_configuration_apply_status_get
Risk Level: 🟢 Low Risk
Execution Mode: âš¡ Synchronous
Category: Policy & Kiosk Configuration
Quick Start (Copy & Use)
Summary: Get the per-device config file deployment status of a Policy/Kiosk configuration, with optional device filtering, sorting, and pagination. Per-device progress and online are English enum strings — progress is NOT a 0-100 percentage and online is NOT a boolean.
Prerequisites: A positive integer ConfigId (obtain via List Policy and Kiosk Configurations) + a valid OAuth2 AccessToken configured in the GI node Credential.
Success Criteria: StatusCode == 200 and ErrorMessage == ""; read ApplyInfo.open_status[].
What to Do Next: Treat a device's deployment as successful when its progress is "Success". For non-success states, inspect progress and fail_reason.
Minimal Request Example (recommended to copy directly):
{
"ConfigId": 10023,
"DeviceIds": [],
"Order": "update_time",
"Ascending": false,
"PageIndex": 1,
"PageSize": 50
}
Minimal Response Example:
{
"ApplyInfo": {
"open_status": [
{
"device_id": "abc123def456ghi789jkl012mno345pq",
"android_id": "9774d56d682e549c",
"imei": "356938035643809",
"imsi": "310150123456789",
"model": "Samsung Galaxy Tab A",
"online": "Online",
"progress": "Success",
"fail_reason": [],
"update_time": "2026-05-20 14:30:02",
"update_unix": 1779690602
}
],
"pagination": {
"total": 1,
"page_size": 50,
"page_index": 1,
"last_page": 1
}
},
"Hint": "",
"Retryable": false,
"OriginalStatusCode": 200,
"StatusCode": 200,
"ErrorMessage": ""
}
Recipes (Common Recipes)
Recipe 1: Check Rollout Status for a Whole Configuration
When to use: Verify how a configuration deployed across all its devices.
{
"ConfigId": 10023,
"DeviceIds": [],
"Order": "update_time",
"Ascending": false,
"PageIndex": 1,
"PageSize": 50
}
Recipe 2: Check Specific Devices Only
When to use: You only care about a few known devices (e.g. after a targeted apply).
{
"ConfigId": 10023,
"DeviceIds": ["abc123def456ghi789jkl012mno345pq", "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"],
"Order": "update_time",
"Ascending": false,
"PageIndex": 1,
"PageSize": 50
}
Recipe 3: Group Failures Together (Sort by Progress)
When to use: Triage a large rollout — sorting by progress clusters devices in the same state so failures are easy to scan.
{
"ConfigId": 10023,
"DeviceIds": [],
"Order": "progress",
"Ascending": true,
"PageIndex": 1,
"PageSize": 100
}
Recipe 4: Paginate a Large Fleet
When to use: More devices than one page. After each call, if ApplyInfo.pagination.page_index < ApplyInfo.pagination.last_page, call again with PageIndex + 1.
{
"ConfigId": 10023,
"DeviceIds": [],
"Order": "device_id",
"Ascending": true,
"PageIndex": 2,
"PageSize": 100
}
1. Overview
1.1 Description
Get per-device deployment status of a Policy/Kiosk configuration. Each record reports the device's identifiers, online state, deployment progress enum, optional failure details, and last update time.
1.2 When to Use
- Verify rollout: Check whether a configuration reached all target devices
- Triage failures: Inspect progress states and fail_reason on individual devices
- Monitor affected devices: Track online/offline status of devices under a configuration
- Targeted checks: Narrow to specific DeviceIds or browse large result sets page by page
Don't use when:
- You need the configuration's full settings — use Get a Configuration
- You don't have the configuration Id — call List Policy and Kiosk Configurations first
1.3 Execution Mode and Response
This operation is synchronous and returns:
- ApplyInfo.open_status: Array of per-device status records
- ApplyInfo.pagination: Pagination metadata (total, page_size, page_index, last_page)
- StatusCode / ErrorMessage / Hint / Retryable / OriginalStatusCode: Call status and error information
1.4 Prerequisites
| Condition | Description | How to Check |
|---|---|---|
| Valid credential | A valid OAuth2 AccessToken is required | Configure AirDroid Business OAuth2 credential in the GI node |
| Configuration Id known | A positive integer ConfigId must be provided | Query via List Policy and Kiosk Configurations |
1.5 Prerequisite Tools
| Dependency Tool | Purpose | Necessity |
|---|---|---|
| List Policy and Kiosk Configurations | Obtain config_id (used as ConfigId here) | If you don't have the Id |
| List Devices / Get a Device by Name | Obtain device_id values for the DeviceIds filter | Only if filtering by device |
1.6 Differences from Similar Tools
| Tool | Use Case | Key Difference |
|---|---|---|
| Get Config File Deployment Status | Per-device deployment status of one configuration | Returns progress/failure records per device |
| Get a Configuration | Full settings of one configuration | Returns the settings object, not rollout status |
| List Policy and Kiosk Configurations | Browse/search configurations | Returns the configuration inventory, not device status |
2. Inputs
2.1 Parameter List
| Parameter | Type | Required | Default | Description | ||
|---|---|---|---|---|---|---|
| ConfigId | number | Yes | - | Configuration Id to query. Must be a positive integer | ||
| DeviceIds | string-array | No | [] | Optional device Id filter; only status records for these devices are returned | ||
| Order | string | No | "update_time" | Sort field: device_id \ | update_time \ | progress |
| Ascending | bool | No | false | Sort direction: true = ascending, false = descending | ||
| PageIndex | number | No | 1 | Page index, starting from 1 | ||
| PageSize | number | No | 50 | Records per page, range 1-100 |
2.2 Parameter Details
`ConfigId`
- Type: number
- Required: Yes
- Format: Positive integer (≥ 1). 0, negative numbers, and non-integers are rejected locally with StatusCode = -1
- Source:
- List Policy and Kiosk Configurations → Configs[].base_setting.config_id
- AirDroid Business admin dashboard, Policy/Kiosk configuration pages
- How to fill in GI node:
- Constant: Enter the numeric Id directly, e.g. 10023
- Upstream reference: Map from the upstream list node's Configs[].base_setting.config_id output
- Example:
10023
`DeviceIds`
- Type: string-array
- Required: No (default: empty array = no device filter, all devices under the configuration are returned)
- Format: JSON array of device Id strings. Items are trimmed; empty entries are dropped
- Source: List Devices, Get a Device by Name, or Batch Resolve Device IDs by Name → device_id
- How to fill in GI node:
- Constant: Provide the array directly, e.g. ["abc123def456ghi789jkl012mno345pq"]
- Upstream reference: Map an upstream array output of device Ids
- Example:
["abc123def456ghi789jkl012mno345pq", "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"]
`Order`
- Type: string
- Allowed values (whitelist; any other value returns StatusCode = -1):
- device_id — sort by device Id
- update_time — sort by last status update time
- progress — sort by progress status
- Default: update_time
- Example: "progress"
`Ascending`
- Type: bool
- Values: true = ascending (A to Z, 0 to 9, oldest to newest); false = descending (Z to A, 9 to 0, newest to oldest)
- Default: false
- Example: false
> Use Order (field name) and Ascending (boolean) for sorting. Sort and SortType are not valid inputs.
`PageIndex`
- Type: number
- Format: Positive integer starting from 1. Values < 1 return StatusCode = -1
- Example: 1
`PageSize`
- Type: number
- Format: Integer 1-100 (note: larger than most list tools). Values outside this range return StatusCode = -1
- Default: 50
- Example: 100
2.3 Parameter Combination Logic
- ConfigId scopes the query to one configuration; DeviceIds further narrows to specific devices (AND relationship)
- Sorting (Order + Ascending) is applied to the filtered set, then pagination
- ApplyInfo.pagination.total reflects the count after the DeviceIds filter
3. Outputs
3.1 Response Example
Success response:
{
"ApplyInfo": {
"open_status": [
{
"device_id": "abc123def456ghi789jkl012mno345pq",
"android_id": "9774d56d682e549c",
"imei": "356938035643809",
"imsi": "310150123456789",
"model": "Samsung Galaxy Tab A",
"online": "Online",
"progress": "Success",
"fail_reason": [],
"update_time": "2026-05-20 14:30:02",
"update_unix": 1779690602
},
{
"device_id": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
"android_id": "3f1a9b7c5d2e8046",
"imei": "358240051111110",
"imsi": "310150987654321",
"model": "Lenovo Tab M10",
"online": "Offline",
"progress": "Kiosk Permission Error",
"fail_reason": {
"detail": "Kiosk launcher permission not granted"
},
"update_time": "2026-05-19 08:11:47",
"update_unix": 1779581507
}
],
"pagination": {
"total": 2,
"page_size": 50,
"page_index": 1,
"last_page": 1
}
},
"Hint": "",
"Retryable": false,
"OriginalStatusCode": 200,
"StatusCode": 200,
"ErrorMessage": ""
}
Error response (invalid ConfigId):
{
"ApplyInfo": {},
"Hint": "Obtain config_id via 'List Policy and Kiosk Configurations', then retry.",
"Retryable": false,
"OriginalStatusCode": 0,
"StatusCode": -1,
"ErrorMessage": "Invalid config_id. Must be a positive integer."
}
3.2 Field Descriptions
| Field Path | Type | Description | ||
|---|---|---|---|---|
| ApplyInfo | object | Deployment status object; empty object {} on error | ||
| ApplyInfo.open_status | array | Per-device status records | ||
| ApplyInfo.open_status[].device_id | string | Device unique identifier | ||
| ApplyInfo.open_status[].android_id | string | Android device Id | ||
| ApplyInfo.open_status[].imei | string | Device IMEI number | ||
| ApplyInfo.open_status[].imsi | string | Device IMSI number | ||
| ApplyInfo.open_status[].model | string | Device model name | ||
| ApplyInfo.open_status[].online | string | Online status — string enum, not a boolean: "Online" \ | "Offline" | |
| ApplyInfo.open_status[].progress | string | Deployment progress — string enum, NOT a 0-100 percentage. See 3.3 for all values | ||
| ApplyInfo.open_status[].fail_reason | array \ | object \ | null | Failure details. [] or null = no failure details. When present it is a loose object (schema not fixed) — do not assume stable field names |
| ApplyInfo.open_status[].update_time | string | Last status update time, format YYYY-MM-DD HH:mm:ss | ||
| ApplyInfo.open_status[].update_unix | number | Device last update Unix timestamp (seconds) | ||
| ApplyInfo.pagination.total | number | Total matching device status records | ||
| ApplyInfo.pagination.page_size | number | Records per page | ||
| ApplyInfo.pagination.page_index | number | Current page number (1-indexed) | ||
| ApplyInfo.pagination.last_page | number | Last page number | ||
| StatusCode | number | 200 = completed (check ErrorMessage), -1 = parameter validation error, 500 = network exception | ||
| ErrorMessage | string | Empty string on success; failure reason otherwise | ||
| Hint | string | Next-action guidance on error; empty on success | ||
| Retryable | boolean | true = transient error; false = persistent error or bad params | ||
| OriginalStatusCode | number | Upstream HTTP status code; 0 = no upstream request was made |
3.3 Status Code / Enum Value Mapping
`online` (string enum, not boolean)
| Value | Meaning |
|---|---|
| "Online" | Device is online |
| "Offline" | Device is offline |
`progress` (string enum — NOT a percentage)
Complete value list as defined by the tool:
| Value | Meaning |
|---|---|
| "Success" | Configuration applied successfully — treat deployment as successful only for this value |
| "Pending" | Application not yet completed |
| "Timed Out" | Application timed out |
| "Kiosk Permission Error" | Kiosk permission problem on the device |
| "Daemon Version Too Low" | Device daemon (Biz Daemon) version too low |
| "No Detailed Feedback" | Device gave no detailed feedback |
| "Kiosk Unsupported" | Device does not support Kiosk |
| "Device Limit Exceeded" | Device quota/limit exceeded |
| "Policy Unsupported" | Device does not support the policy |
| "Limited Permission" | Device permission limited (policy partially unsupported) |
| "Policy Applied Kiosk Permission Error" | Policy/security profile applied successfully, but Kiosk permissions are not properly enabled on the device |
| "Policy Applied Kiosk Unsupported" | Policy applied successfully, but the device does not support Kiosk |
| "Policy Permission Error and Kiosk Permission Error" | Some Policy settings failed because of a permission error, and Kiosk also failed because of a permission error |
| "Policy Permission Error and Kiosk Unsupported" | Some Policy settings failed because of a permission error, and the device does not support Kiosk |
| "Workflow Active" | A workflow is active on the device |
| "No Home Permission" | Missing Home (launcher) permission |
| "Waiting for Lost Mode Exit" | Waiting for the device to exit Lost Mode |
| "AirDroid Browser Not Installed" | Configuration applied, but AirDroid Browser is not installed, so some settings do not take effect |
`fail_reason`
[] or null means no failure details. When present, it is a loose object decoded from upstream whose schema is not fixed — surface it verbatim rather than parsing specific keys.
3.4 Pagination
| Field | Description |
|---|---|
| ApplyInfo.pagination.page_index | Current page index (starts at 1) |
| ApplyInfo.pagination.page_size | Records per page |
| ApplyInfo.pagination.total | Total matching records |
| ApplyInfo.pagination.last_page | Last page number |
Paging strategy:
- When page_index < last_page, call again with PageIndex + 1
- Use DeviceIds to narrow the result set before paginating
- PageSize range is 1-100 (default 50)
Note: unlike list tools whose Pagination is a top-level output, here pagination is nested inside ApplyInfo.
4. Examples
4.1 Basic Example: Full Rollout Status for a Configuration
Request Parameters:
{
"ConfigId": 10023,
"DeviceIds": [],
"Order": "update_time",
"Ascending": false,
"PageIndex": 1,
"PageSize": 50
}
Response: See the success response in Section 3.1.
4.2 Advanced Example: Triage Failures on Specific Devices
Request Parameters:
{
"ConfigId": 10023,
"DeviceIds": ["a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"],
"Order": "progress",
"Ascending": true,
"PageIndex": 1,
"PageSize": 50
}
What to read in the response: for each record where progress != "Success", report progress, online, and any fail_reason content; an "Offline" device may simply not have received the configuration yet.
4.3 Error Example: Unsupported Sort Field
Request Parameters (error — Order not in whitelist):
{
"ConfigId": 10023,
"DeviceIds": [],
"Order": "online",
"Ascending": true,
"PageIndex": 1,
"PageSize": 50
}
Response:
{
"ApplyInfo": {},
"Hint": "Set Order to device_id, update_time, or progress, then retry.",
"Retryable": false,
"OriginalStatusCode": 0,
"StatusCode": -1,
"ErrorMessage": "Invalid Order. Allowed values: device_id, update_time, progress."
}
5. Error Handling
5.1 AB Three-Layer Error Codes
| StatusCode | Meaning | Use Case | Agent Response |
|---|---|---|---|
| -1 | Parameter validation error | Invalid ConfigId/DeviceIds/Order/PageIndex/PageSize, or empty token (no request sent; OriginalStatusCode = 0) | Do not retry; fix parameters |
| 200 | Business success or business error | HTTP request succeeded; check ErrorMessage | Empty ErrorMessage = success; non-empty = business error (read Hint) |
| 500 | Network/request exception | Timeout (60s), connection failure, HTTP non-200 (including 429 rate limit) | Retry only when Retryable == true (max 2 times, 5-second interval) |
This Action's StatusCode semantics:
- HTTP 429 → StatusCode = 500, Retryable = true (wait 10-30 seconds, retry once)
- Other HTTP non-200 → StatusCode = 500; Retryable = true only for HTTP 500/502/503/504
- Business errors (code != 1 in the upstream body) → StatusCode = 200, non-empty ErrorMessage, Retryable = false
5.2 Common Errors
| StatusCode | ErrorMessage Example | Cause | Fix |
|---|---|---|---|
| -1 | Invalid config_id. Must be a positive integer. | ConfigId is 0, negative, or not an integer | Obtain a valid Id via List Policy and Kiosk Configurations |
| -1 | Invalid device_ids. Must be an array of device IDs. | DeviceIds is not an array | Provide a string array or omit the parameter |
| -1 | Invalid Order. Allowed values: device_id, update_time, progress. | Unsupported sort field | Use one of the three allowed values |
| -1 | Invalid page_size. Must be between 1 and 100. | PageSize out of range | Set PageSize to 1-100 |
| -1 | access_token is required and cannot be empty. | Credential not configured | Configure AirDroid Business OAuth2 Credential |
| 500 | Rate limited. Please retry after a few seconds. | HTTP 429 | Wait 10-30 seconds, retry once |
| 500 | Request timeout after 60 seconds. | Request timeout | Retry once; reduce PageSize or filter scope if persistent |
5.3 Agent Self-Healing Decision Table
| Condition | Handling Strategy |
|---|---|
| StatusCode == 200 and ErrorMessage == "" | Success; read ApplyInfo.open_status and ApplyInfo.pagination |
| StatusCode == 200 and ErrorMessage != "" | Business error; follow Hint |
| StatusCode == -1 | Fix input parameters or Credential; do not retry as-is |
| StatusCode == 500 and Retryable == true | Retry up to 2 times (5-second interval) |
| StatusCode == 500 and Retryable == false | Do not retry; escalate with ErrorMessage + OriginalStatusCode |
6. Best Practices
6.1 Performance Optimization
- Filter with DeviceIds when you only care about specific devices — this reduces pages and response size
- Use Order = "progress" to cluster identical states, making failure triage on large fleets faster
- PageSize up to 100 is supported — use larger pages to reduce round trips when scanning a full fleet
6.2 Security Considerations
🟢 Read operation: No destructive side effects.
- Records include hardware identifiers (imei, imsi, android_id) — treat them as sensitive device data and avoid unnecessary propagation.
6.3 Idempotency
Idempotency: Naturally idempotent. Read-only; identical parameters return the same result, though device statuses evolve over time — re-poll to observe rollout progress (e.g. Pending → Success).
7. Related Tools
7.1 Prerequisite Tools
| Tool Name | Purpose |
|---|---|
| List Policy and Kiosk Configurations | Obtain config_id (used as ConfigId here) |
| List Devices | Obtain device_id values for the DeviceIds filter |
| Get a Device by Name | Resolve one device name to device_id |
| Batch Resolve Device IDs by Name | Resolve multiple device names to device_ids |
7.2 Follow-up Tools
| Tool Name | Purpose |
|---|---|
| Get a Configuration | Inspect the configuration's full settings when devices report unexpected states |
| Get a Device by Name / List Devices | Check a failing device's broader state (online, daemon status) |
7.3 Similar Tool Comparison
| Tool Name | Use Case | Difference |
|---|---|---|
| Get Config File Deployment Status | Rollout verification per device | Progress/failure records for one configuration |
| Get a Configuration | Configuration content | Full settings object, no device status |
| List Policy and Kiosk Configurations | Inventory browsing | Configuration list, no device status |
8. Tool Chains
8.1 End-to-End Rollout Verification
Scenario: Find a configuration by name and verify its deployment across devices.
Tool Chain:
List Policy and Kiosk Configurations → Get Config File Deployment Status
Steps:
- Call List Policy and Kiosk Configurations with Name = "Retail Kiosk"
- Take Configs[0].base_setting.config_id as ConfigId
- Call Get Config File Deployment Status and iterate ApplyInfo.open_status[]
- Report devices whose progress != "Success" together with their fail_reason
8.2 Investigate a Failing Device
Scenario: One device shows a non-success progress state; gather context.
Tool Chain:
Get Config File Deployment Status → Get a Device by Name / List Devices → Get a Configuration
Steps:
- From Get Config File Deployment Status, note the failing record's device_id, progress, fail_reason, online
- Query the device via List Devices (or Get a Device by Name) to check daemon status and connectivity
- If settings themselves are suspect, call Get a Configuration with the same Id to review the applied settings
Appendix Reference:
- Field Reference: ./Field Reference.md
- Error Code Quick Reference: ./Error Codes.md
Leave a Reply.