This document aggregates all error codes that AirDroid Business tools may return, along with handling recommendations.
1. Error Code Overview
AirDroid Business uses a three-tier StatusCode strategy. All tools return one of the following three values:
| StatusCode | Category | Description | Retryable |
|---|---|---|---|
| -1 | Parameter Error | Input parameter validation failed (local validation, before HTTP request) | No |
| 200 | Success / Business Error | HTTP request succeeded; check ErrorMessage to determine actual result | No |
| 500 | Network / Request Exception | Timeout, connection failure, DNS error, or unexpected exception | Yes (cautiously) |
Key Rule: StatusCode == 200 does NOT always mean success. You must check ErrorMessage — empty string means success, non-empty means business error (including upstream HTTP errors like 401/403/404).
2. Detailed Error Descriptions
2.1 StatusCode: -1 — Parameter Validation Error
Description: Local parameter validation failed before sending the request to the API. The HTTP request was never made.
Common Causes (refer to actual ErrorMessage):
| Cause | Description | Fix Suggestion |
|---|---|---|
| Missing required parameter | Required parameter not provided | Check and add required parameters |
| Invalid parameter format | Format doesn't match expectations | Check parameter format (e.g., JSON array for SelectedColumns) |
| Value out of range | Value exceeds allowed range | Adjust value (e.g., PageSize must be 1-50) |
| Invalid enum value | Value not in allowed set | Check enum value list in the specific Action doc |
| Invalid access_token | Token is empty or malformed | Check credential configuration |
Example Response:
{
"StatusCode": -1,
"ErrorMessage": "device_id is required"
}
Agent Self-Healing Strategy:
- Do NOT retry — fix the parameters and call again
- Parse ErrorMessage for hints on which parameter is wrong
2.2 StatusCode: 200 — Success or Business Error
Description: The HTTP request completed. Check ErrorMessage to determine the actual result.
Success Criteria: StatusCode == 200 AND ErrorMessage == ""
Example Success Response:
{
"StatusCode": 200,
"ErrorMessage": "",
"Devices": [...]
}
Example Business Error Responses:
When the upstream API returns an error, StatusCode remains 200 but ErrorMessage contains the error detail:
{
"StatusCode": 200,
"ErrorMessage": "API returned error: Device not found"
}
{
"StatusCode": 200,
"ErrorMessage": "API returned HTTP 401: {\"code\":0,\"msg\":\"Unauthorized\"}"
}
{
"StatusCode": 200,
"ErrorMessage": "API returned HTTP 403: {\"code\":0,\"msg\":\"Permission denied\"}"
}
Common ErrorMessage Patterns:
| ErrorMessage Pattern | Root Cause | Fix Suggestion |
|---|---|---|
| API returned error: ... | Business logic error (e.g., device not found, group name already exists) | Parse the message and fix the request |
| API returned HTTP 401: ... | Token expired or invalid | Refresh credential and retry |
| API returned HTTP 403: ... | Insufficient permissions | Check account permissions |
| API returned HTTP 404: ... | Resource not found | Verify the resource ID is correct |
| API returned HTTP 429: ... | Rate limit exceeded | Wait and reduce request frequency |
| Invalid keyword field ... | Unsupported Keyword filter field | Refer to Field Reference for supported fields |
| Device is offline | Device not reachable | Wait for device to come online |
Agent Self-Healing Strategy:
- If ErrorMessage is empty → success, process the result
- If ErrorMessage contains HTTP 401 → refresh credentials and retry
- If ErrorMessage contains HTTP 429 → wait 60 seconds and retry
- Otherwise → do NOT retry, parse the message and take corrective action
2.3 StatusCode: 500 — Network / Request Exception
Description: A network-level or system-level error occurred. The request may not have reached the server, or the response could not be parsed.
Common Causes:
| Cause | Description | Fix Suggestion |
|---|---|---|
| Request timeout | No response within 60 seconds | Retry; if persistent, reduce request scope |
| Connection failure | Cannot connect to server | Check network connectivity |
| DNS resolution failure | Cannot resolve hostname | Check DNS configuration |
| Unexpected exception | Code-level error during execution | Report to technical support |
Example Responses:
{
"StatusCode": 500,
"ErrorMessage": "Request timeout after 60 seconds."
}
{
"StatusCode": 500,
"ErrorMessage": "Request error: ConnectionError"
}
{
"StatusCode": 500,
"ErrorMessage": "Unexpected error: ..."
}
Agent Self-Healing Strategy:
- May retry 1-2 times (5-second interval)
- If failure persists, log the error and stop retrying
- For timeout errors, try reducing request scope (e.g., fewer SelectedColumns, smaller PageSize)
3. Agent Self-Healing Decision Table
| StatusCode | ErrorMessage | Auto Retry | Retry Strategy | Manual Intervention |
|---|---|---|---|---|
| -1 | (any) | No | - | Fix parameters and retry |
| 200 | "" (empty) | - | - | Success, no action needed |
| 200 | Contains HTTP 401 | Conditional | Refresh credentials, then retry | Re-authorize if refresh fails |
| 200 | Contains HTTP 429 | Yes | Wait 60 seconds, then retry | Reduce request frequency |
| 200 | Other non-empty | No | - | Parse message and fix |
| 500 | (any) | Conditional | Max 2 retries, 5s interval | Report if persistent |
4. Error Handling Best Practices
4.1 Error Response Parsing
def handle_response(response):
status_code = response.get("StatusCode", 500)
error_msg = response.get("ErrorMessage", "")
if status_code == 200 and not error_msg:
return response
if status_code == -1:
raise ValidationError(error_msg)
if status_code == 500:
# Network error — may retry 1-2 times
raise NetworkError(error_msg)
if status_code == 200 and error_msg:
if "HTTP 401" in error_msg:
# Refresh token and retry
pass
elif "HTTP 429" in error_msg:
# Wait and retry
pass
else:
# Business error — do not retry
raise BusinessError(error_msg)
4.2 Logging Recommendations
When an error occurs, log the following information:
- StatusCode — error code (-1, 200, or 500)
- ErrorMessage — error description
- Request parameters (sanitized)
- Timestamp
- Action name
5. Operation-Specific Error Codes
5.1 Async Operation Progress Values
For async operations (Reboot, Lock, Lost Mode, etc.), use Get an Activity Log to track status:
| Progress | Meaning | Agent Action |
|---|---|---|
| Executing | Command queued or executing on device | Continue polling (5-10s interval) |
| Success | Operation completed successfully | Task complete |
| Failure | Operation failed | Check FailReason field |
| Overridden | Superseded by a newer command | No action needed |
5.2 Common FailReason Values
| FailReason | Meaning | Resolution |
|---|---|---|
| Device offline | Device was offline when command arrived | Wait for device to come online |
| Permission denied | Insufficient device-level permissions | Check device permissions |
| Operation timeout | Device did not respond in time | Retry the operation |
| Command rejected | Device rejected the command | Check device configuration |
6. FAQ
Q1: Why is my Keyword filter not working?
Possible causes:
- Used an unsupported filter field (e.g., group_id)
- Field name misspelled
- Value format incorrect (e.g., online should use "Online" not 1)
- Keyword passed as string instead of object
Solution:
Refer to Field Reference - Keyword Filtering Fields to confirm supported fields and correct value formats.
Q2: Device query returns stale data?
Cause: Device status may be cached.
Solution:
- Call Get Device Info Push first to refresh device status
- Then call Get All Devices to get updated data
Q3: StatusCode is 200 but operation failed?
Cause: StatusCode == 200 only means the HTTP request completed. The upstream API may have returned an error.
Solution:
Always check ErrorMessage. If it's non-empty, the operation failed. Parse the message for details (e.g., API returned HTTP 403: Permission denied).
Q4: High-risk operation fails with permission error?
Cause: High-risk operations require safety conditions.
Solution:
- Set Confirm: true
- Provide Reason parameter explaining the operation purpose
- Verify account has permissions for high-risk operations
- Confirm device is online (some commands require online device)
Leave a Reply.