Bmob errors consist of three independent numbering spaces:
- Android SDK local errors: 9001–9023 (thrown on the SDK client side, does not go over the network)
- iOS SDK local errors: 100, 20000–20030 (thrown on the SDK client side)
- REST API server errors: HTTP status code + business code (401 / 500 / 400 + the
codefield in the body; all SDK network errors are essentially this)
Key diagnostic flow: after getting the error,first check whether it is a network error(see whether there is
{ "code": ..., "error": "..." }in the response body); if so, look it up in the REST API error code table; if there is no response body and only a local code thrown by the SDK (9xxx or 2xxxx), look it up in the SDK local table.
Reverse lookup by symptom (response body error in English)
Symptom / error keyword |
Business code | Detailed table |
|---|---|---|
object not found |
101 | REST §3 below |
invalid field name |
105 | REST §3 |
unique index cannot has duplicate value |
211 etc. | REST §3 |
QPS beyond the limit |
10076 | REST §4 |
mobilePhoneNumber already taken |
206 etc. | REST §3 user-related |
Could not find user / login failed |
101 / 201 | REST §3; check username and password |
Android only 9015, vague description |
9015 | Section 1 below 9015 special topic |
iOS 20017 initialization not completed |
20017 | Section 2 below |
| HTTP 401 Unauthorized | — | wrong key or wrong signature;shared/faq.md |
| Permission / ACL denied | 9015 / 9016 / 138 etc. | shared/anti-patterns.md;P1 bmob-acl-and-roles |
More routing-related issues:shared/faq.md。
1. Android SDK local error codes (9001–9023)
| Code | Meaning | Common cause / fix |
|---|---|---|
| 9001 | Application Id is empty | Did not call Bmob.initialize(context, "AppId"); check whether the initialization timing is before using the SDK |
| 9002 | Error parsing returned data | The server returned unexpected JSON; check the raw HTTP response |
| 9003 | Error uploading file | Any issue with file path, permissions, or network |
| 9004 | File upload failed | Same as 9003, often together with 9022 |
| 9005 | Batch operation exceeds 50 records | Bmob's single batch limit is 50; split into multiple calls |
| 9006 | objectId is empty | objectId was not passed when updating/deleting/fetching a single record |
| 9007 | File size exceeds 10M | Single file limit is 10MB; split large files into chunks or migrate to another service |
| 9008 | Uploaded file does not exist | Wrong path, or the file was deleted asynchronously |
| 9009 | No cached data | Enabled CACHE_ONLY policy but the cache is empty |
| 9010 | Network timeout | Troubleshoot mobile network and server response time |
| 9011 | BmobUser class does not support batch operations | The user table only supports single-record registration/login |
| 9012 | Context is empty | Bmob.initialize passed a null context |
| 9013 | Table name format is incorrect | Table names must start with a letter and contain only letters/digits/underscores |
| 9014 | Third-party account authorization failed | The third-party OAuth flow was interrupted |
| 9015 | Other errors(fallback code) | Key: must read the response body's error text to determine; see the "9015 topic" below for details |
| 9016 | No network connection | Client network unavailable, different from 9010 |
| 9017 | Third-party login error | See the response description |
| 9018 | Parameter cannot be empty | Required field is empty |
| 9019 | Incorrect format: phone number / email / verification code | Client-side format validation failed |
| 9020 | Failed to save CDN information | Failed to write the record after uploading to CDN |
| 9021 | File upload is missing the WAKE_LOCK permission | AndroidManifest.xml add <uses-permission android:name="android.permission.WAKE_LOCK"/> |
| 9022 | File upload failed, please retry | Usually a network glitch |
| 9023 | Please call Bmob.initialize to initialize the SDK | Same as 9001, but triggered at a different point |
9015 topic
9015 is the Android SDK's fallback error code—all exceptions that are not explicitly categorized return it. To handle it, you must look at the description field in the response body, not just the code.
Special warning:If you call a business method inside the Bmob SDK's success callback and it throws an exception, the SDK will catch that exception and trigger the error callback as 9015, creating the illusion that "done was seemingly called twice". The fix is to add try/catch in the business method.
2. iOS SDK local error codes (100, 20000–20030)
| Code | Meaning |
|---|---|
| 100 | The request content is incorrect (wrong query condition) |
| 20000 | Password is empty (login/register) |
| 20001 | Username is empty |
| 20002 | Request failed |
| 20003 | Missing objectId (update/delete/query a single record) |
| 20004 | Query result is empty |
| 20005 | Cached query expired |
| 20006 | Cloud function call failed |
| 20008 | Upload file filename is empty |
| 20009 | Upload file does not exist |
| 20010 | Unknown error |
| 20011 | Upload file content is empty |
| 20012 | Update content is empty |
| 20013 | Cloud function name is empty |
| 20014 | Batch array out of bounds |
| 20015 | Batch array is empty |
| 20016 | Push content is empty |
| 20017 | Initialization not completed |
| 20023 | Initialization failed |
| 20024 | Batch file upload format error |
| 20025 | Table name is empty |
| 20027 | Parameter is incorrect (usually an empty string) |
| 20028 | Invalid phone number |
| 20029 | Invalid verification code |
| 20030 | File does not exist (delete / get URL) |
3. REST API server-side error codes (returned via HTTP by any client)
HTTP 401 / 500 (no body code)
{ "error": "unauthorized" }
| HTTP | Common meaning |
|---|---|
| 401 | There is a problem with the Application Id / REST API Key / encrypted authorization signature |
| 500 | Temporary server-side failure, retry later |
HTTP 400 (with body code) — core error codes
{ "code": 101, "error": "object not found for e1kXT22L" }
Object / Query / Class (100–199)
| code | Meaning | Fix suggestion |
|---|---|---|
| 101 | object does not exist / wrong username or password | Check objectId; on login failure, do not distinguish wrong username vs wrong password (security design) |
| 102 | Invalid field name/field value / GeoPoint format error | Field names are case-sensitive and must start with a letter |
| 103 | Missing objectId or invalid class name | Class names follow the same naming rules as fields |
| 104 | Associated class does not exist | Create the target table before creating a Pointer/Relation |
| 105 | Invalid field name or reserved field | Reserved fields:objectId / createdAt / updatedAt / ACL |
| 106 | Pointer format error | Must be {"__type":"Pointer","className":"X","objectId":"..."} |
| 107 | JSON / Date / ACL / __op format error; wrong Content-Type |
See the corresponding error description |
| 108 | username + password required (sign up / log in) | — |
| 109 | Missing login information | — |
| 110 | Database migration in progress, POST/PUT/DELETE prohibited | Wait for the migration to complete |
| 111 | Field value does not match the type | get_project_tables fetch schema for comparison |
| 112 | requests must be an array |
Batch API input parameters |
| 113 | Each item in the requests array has a format error | { "method": "POST", "path": "...", "body": {...} } |
| 114 | requests array exceeds 50 items | Split |
| 117 | Latitude / longitude out of range | lat ∈ [-90,90],lng ∈ [-180,180] |
| 118 | Missing required parameter | The error description contains the parameter name |
| 120 | Email verification feature not enabled | Console → App Settings to enable |
| 121 | API call count exceeds plan limit | Upgrade the plan or wait for the reset |
| 122 | User permission verification failed | Check ACL / Role configuration |
| 125 | Default value JSON format error | — |
Push / Device (131–141)
| code | Meaning |
|---|---|
| 131 | Invalid device token / installation ID / deviceType |
| 132 | device token or installation ID already exists |
| 136 | Field cannot be modified / Android does not need a deviceToken |
| 137 | The client is not allowed to perform an operation on the installation class |
| 138 | Field is read-only / SDK deletion is prohibited for this App |
| 139 | Invalid role name format / already exists |
| 141 | Missing push data |
Time / File / Image (142–165)
| code | Meaning |
|---|---|
| 142 | Invalid time format (should be 2013-12-04 00:51:13) |
| 143 | Must be a number |
| 144 | Cannot be a past time |
| 145–157 | Various errors such as file size / name / URL / permission / deletion |
| 160–165 | Invalid image processing parameters (width, height, edge length, etc.) |
User system (201–211)
| code | Meaning |
|---|---|
| 201 | Missing required user field |
| 202 | username is already in use |
| 203 | email is already in use |
| 204 | email must be provided |
| 205 | No user found for the corresponding email/username |
| 206 | No permission to operate on the user table — pass the MasterKey when initializing the app(server-side only) |
| 207 | Incorrect verification code |
| 208 | Third-party authorization data error / already linked to another user |
| 209 | mobilePhoneNumber is already in use |
| 210 | Old password is incorrect |
| 211 | User is not logged in or the login has expired, login is required again |
Payment (232–236, 10001–10006)
| code | Meaning |
|---|---|
| 232 | Payment service unavailable |
| 233 | API endpoint disabled |
| 234 | No payment permission, contact Bmob staff |
| 235 | Failed to obtain payment permission |
| 236 | Please fill in payment-related information in the app configuration |
| 10001 | Missing payment parameters |
| 10002 | order_no does not exist or does not belong to this app |
| 10003 | Payment-related error |
| 10004 | Shengpay payment error |
| 10005 | Shengpay payment storage error |
| 10006 | Professional edition or above package required |
Cloud Functions / Hooks (310–324)
| code | Meaning |
|---|---|
| 310 | Error calling cloud code |
| 311 | Invalid cloud code name format |
| 312 | Missing cloud code |
| 313 | Error updating cloud code |
| 314 | Cloud code does not exist |
| 315 | Error deleting cloud code |
| 316 | Error generating cloud code file |
| 317 | Container call failed |
| 318 | Error writing cloud code to Redis / Failed to get configuration |
| 319 | Failed to get cloud code list/details |
| 320 | Error parsing cloud code |
| 321 | Code contains unsupported JS objects |
| 322 | Failed to update Java cloud code |
| 323 | Failed to delete Java cloud code |
| 324 | Data Hook error |
| 330 | Push service requires payment |
Other
| code | Meaning |
|---|---|
| 401 | Duplicate value for unique index — create_table was set to unique:true field was written with an existing value |
| 402 | where query condition exceeds byte limit |
| 501 | User is banned from access |
| 601 | BQL statement error |
SMS (10010–10022)
| code | Meaning |
|---|---|
| 10010 | Sending limit reached for this phone number |
| 10011 | SDK SMS quota used up |
| 10012 | Related to real-name / status / screenshot review |
| 10013 | Illegal SMS content |
| 10014 | SMS content contains URL |
| 10015 | Illegal content |
| 10016 | deviceId is empty / RESTful SMS quota used up |
| 10017 | Device has reached SMS sending limit |
| 10018 | smsId does not exist |
| 10019 | Incorrect time format (requires 2006-01-02 15:04:05) |
| 10020 | Time must be > 10 minutes from now / App not found |
| 10021 | Custom SMS interface not allowed |
| 10022 | SMS template does not exist |
App Management (10030–10042)
| code | Meaning |
|---|---|
| 10030 | App name is required |
| 10031 | Failed to create app |
| 10032 | App name exceeds 30 characters |
| 10034 | App name must be a string |
| 10035 | Incorrect field value |
| 10037 | App creation limit reached |
| 10038 | Failed to update app information |
| 10039 | App name is empty |
| 10040 | SDK is not allowed to create/delete columns |
| 10041 | App name cannot start with _ and must be ≤ 20 characters |
| 10042 | File name cannot contain backslashes |
Schema Management (10061–10075)
| code | Meaning |
|---|---|
| 10061 | Master Key error |
| 10062 | className does not match the path |
| 10063 | Field name is a reserved word |
| 10064 | Field already exists |
| 10065 | TargetClass requires className |
| 10066 | TargetClass does not exist |
| 10067 | Failed to save table structure |
| 10068 | Failed to save field |
| 10069 | Data type does not exist |
| 10070 | Unsupported operation |
| 10071 | Field does not exist |
| 10072 | Failed to delete field |
| 10073 | Modifying the user table structure is not allowed |
| 10074 | Failed to delete table structure |
| 10075 | The unique index may already exist |
QPS / Quota (10076, 10210)
| code | Meaning |
|---|---|
| 10076 | QPS exceeds the limit — The client request rate is too high; add rate limiting |
| 10200 | Request timed out |
| 10210 | The application exceeded the request count limit within half an hour |
Troubleshooting process (recommended)
flowchart TD
Start([拿到 Bmob 错误]) --> A{有 HTTP 响应体吗?}
A -->|有 code + error| B[REST API 服务端错误码表]
A -->|纯 SDK 本地抛出| C{Android or iOS?}
C -->|Android| D[9001-9023 表]
C -->|iOS| E[100, 20000-20030 表]
B --> F[读 error 字段的描述]
D --> F
E --> F
F --> G{描述里有变量 (%s, %d)?}
G -->|有| H[把变量值代入定位具体字段/资源]
G -->|没有| I[按表中"修复建议"操作]
H --> I
Full original text
metadata.docs_raw is a pure markdown version that the agent can directly WebFetch (some rows in the original table have line break formatting):
https://raw.githubusercontent.com/bmob/BmobDocs/master/mds/other/error_code/index.md
If you need to review a code within the IDE that is not in this skill's table (for example, a new one added by Bmob in the future), simply fetch that URL.