Submit an Application Version
You can submit a new Android application version either through the App Submission Form within the Aptoide Connect Developer Console or via the Uploader API described below.
Endpoint
| Method | URL |
|---|---|
| POST | https://uploader.catappult.io/api |
Authentication
To access this API, you need to have an active account subscription on Aptoide Connect and authenticate with an API key (check here how to generate one).
App versions can only be submitted by accounts of type Developer.
Headers
| Header | Type | Required | Description |
|---|---|---|---|
Api-Key | string | Required | Used to authenticate your API requests. The value is your Aptoide Connect API key. |
Body Parameters
- All parameters must be sent as form data (
multipart/form-data). JSON requests are not supported. Use the-Fflag in cURL to send each field. - All file parameters (apk, obbs, splits, icon, featureGraphic, screenshots) can be provided either:
- As direct uploads, or
- As publicly accessible URLs (recommended if files are already hosted on a server or cloud storage, e.g., Amazon S3, Dropbox). Ensure all URLs are publicly accessible and remain valid until the upload process completes. The service will fetch the files directly from the provided URLs.
Note: Do not mix uploaded files and URLs in the same request. Choose one method per request.
You can provide locale-specific metadata (locales[<language_code>][...]) for multiple languages at once. See available language codes.
Parameter | Type | Required | Description |
|---|---|---|---|
|
| Required | Base APK file. |
|
| Optional | Optional OBB (expansion) files. |
|
| Required only if | Filenames corresponding to each OBB file when submitted via URL. |
|
| Optional | Optional APK Split files (e.g., |
|
| Optional (default: | Indicates if the APK integrates our Billing SDK. Use |
|
| Optional | Controls how and when the submitted APK is released once approved by our admin team. Possible values: |
|
| Optional | Used only when releaseMode is set to |
|
| Optional (default: | When enabled ( |
|
| Optional | Application icon. |
|
| Optional | Application featured graphic. |
|
| Optional | Title in the specified language. |
|
| Required only if | Description in the specified language. |
|
| Optional | Release notes in the specified language. |
|
| Required only if | Screenshots in the specified language. |
Response
Success
If the API call returns an HTTP 200 status code, the upload request was successful, and the submitted version is now pending admin approval by the Aptoide team.
Error
If the HTTP status code is not 200, the submission was unsuccessful.
The response body will typically include an error code and message describing the issue.
| Error Code | HTTP Status Code | Meaning | Fix |
|---|---|---|---|
MISSING-APK | 400 Bad Request | No APK file or URL was provided | Upload an APK or provide a valid public APK URL |
INVALID-APK-FILE | 400 Bad Request | Provided APK file is invalid | Provide a valid APK file or a valid public APK URL |
INVALID-APK-URL | 400 Bad Request | Provided APK URL is not downloadable or invalid | Check URL accessibility and file type |
APK-TOO-LARGE | 413 Payload Too Large | APK file too large | Provide a smaller APK. Check here the maximum allowed size |
OBB-TOO-LARGE | 413 Payload Too Large | OBB file too large | Provide a smaller OBB. Check here the maximum allowed size |
SPLIT-TOO-LARGE | 413 Payload Too Large | Split file too large | Provide a smaller Split. Check here the maximum allowed size |
APK-NOT-SIGNED | 422 Unprocessable Entity | APK is unsigned | Sign the APK before submission |
INVALID-BILLING-METHOD | 400 Bad Request | Disallowed billing method detected | Use an allowed billing method. Allowed values: aptoide-sdk, none |
APPLICATION-OWNED-BY-OTHER-ACCOUNT | 403 Forbidden | Application owned by another developer account | If you are the legitimate owner of this application please contact support |
APK-ALREADY-EXISTS | 409 Conflict | APK was already previously submitted by you | Submit a different APK |
APK-SIGNATURE-MISMATCH-MARKET | 409 Conflict | APK signature doesn’t match Google Play version | Use same keystore as on Google Play |
APK-SIGNATURE-MISMATCH-PREVIOUS | 409 Conflict | APK signature doesn’t match previously submitted APK for this Application | Use same keystore as previous version |
APK-VERCODE-LOWER-THAN-MARKET | 409 Conflict | APK versionCode lower than Google Play version | Increment versionCode to a value that is the same or higher than the one on Google Play |
FAILED-MOVING-APK-TO-STORAGE | 500 Internal Server Error | Failed to move APK to internal storage | Retry |
FAILED-MOVING-OBB-TO-STORAGE | 500 Internal Server Error | Failed to move OBB to internal storage | Retry |
FAILED-MOVING-SPLIT-TO-STORAGE | 500 Internal Server Error | Failed to move Split file to internal storage | Retry |
SUBMISSION-NOT-ALLOWED | 403 Forbidden | Application is not in Google Play. You can only submit an application for the first time to Aptoide Connect via Api Key if it is also available in Google Play. | Submit the first version via the App Submission Form on the Aptoide Connect Developer Console |
SUBMISSION-NOT-ALLOWED | 403 Forbidden | Too many pending submissions awaiting approval | Wait for approvals before new submissions |
Notes
- Most transient errors (like network or storage failures) can be resolved by retrying after a short delay.
- Validation errors (like signature or ownership issues) must be fixed before retrying.
- A non-200 HTTP status always indicates that no new version was queued for review.
Examples
File Upload Example (APK w/ Billing SDK) (cURL):
curl -X POST "https://uploader.catappult.io/api" \
-H "Api-Key: YOUR_API_KEY" \
-F "[email protected]" \
-F "billingMethod=aptoide-sdk"
File Upload Example (APK + 1 OBB + 1 Split) (cURL):
curl -X POST "https://uploader.catappult.io/api" \
-H "Api-Key: YOUR_API_KEY" \
-F "[email protected]" \
-F "obbs[0][email protected]" \
-F "splits[0][email protected]_v8a.apk"
File Upload Example (APK w/ Billing SDK + Icon + Feature Graphic + 2 Locales w/ 2 Screenshots) (cURL):
curl -X POST "https://uploader.catappult.io/api" \
-H "Api-Key: YOUR_API_KEY" \
-F "[email protected]" \
-F "billingMethod=aptoide-sdk" \
-F "[email protected]" \
-F "[email protected]" \
-F "locales[en_GB][title]=Title via API" \
-F "locales[en_GB][description]=Description via API" \
-F "locales[en_GB][news]=News via API" \
-F "locales[en_GB][screenshots][0][email protected]" \
-F "locales[en_GB][screenshots][1][email protected]" \
-F "locales[pt_PT][title]=Titulo via API" \
-F "locales[pt_PT][description]=Descricao via API" \
-F "locales[pt_PT][news]=Noticias via API" \
-F "locales[pt_PT][screenshots][0][email protected]" \
-F "locales[pt_PT][screenshots][1][email protected]"
Public URLs Example (APK w/ Billing SDK + 1 OBB + 1 Split) (cURL):
curl -X POST "https://uploader.catappult.io/api" \
-H "Api-Key: YOUR_API_KEY" \
-F "apk=https://example-bucket.s3.amazonaws.com/app-release.apk" \
-F "obbs[0]=https://example-bucket.s3.amazonaws.com/main.12345.com.example.obb" \
-F "obbFileNames[0]=main.12345.com.example.obb" \
-F "splits[0]=https://example-bucket.s3.amazonaws.com/config.arm64_v8a.apk" \
-F "billingMethod=aptoide-sdk"
Public URLs Example (APK w/ Billing SDK + 2 OBBs + 2 Splits) (cURL):
curl -X POST "https://uploader.catappult.io/api" \
-H "Api-Key: YOUR_API_KEY" \
-F "apk=https://example-bucket.s3.amazonaws.com/app-release.apk" \
-F "obbs[0]=https://example-bucket.s3.amazonaws.com/main.12345.com.example.obb" \
-F "obbs[1]=https://example-bucket.s3.amazonaws.com/patch.12345.com.example.obb" \
-F "obbFileNames[0]=main.12345.com.example.obb" \
-F "obbFileNames[1]=patch.12345.com.example.obb" \
-F "splits[0]=https://example-bucket.s3.amazonaws.com/config.arm64_v8a.apk" \
-F "splits[1]=https://example-bucket.s3.amazonaws.com/config.xhdpi.apk" \
-F "billingMethod=aptoide-sdk"
Public URLs Example (APK w/ Billing SDK + Icon + Feature Graphic + 2 Locales w/ 2 Screenshots) (cURL):
curl -X POST "https://uploader.catappult.io/api" \
-H "Api-Key: YOUR_API_KEY" \
-F "apk=https://example-bucket.s3.amazonaws.com/app-release.apk" \
-F "billingMethod=aptoide-sdk" \
-F "icon=https://example-bucket.s3.amazonaws.com/icon.png" \
-F "featureGraphic=https://example-bucket.s3.amazonaws.com/FG.png" \
-F "locales[en_GB][title]=Title via API" \
-F "locales[en_GB][description]=Description via API" \
-F "locales[en_GB][news]=News via API" \
-F "locales[en_GB][screenshots][0]=https://example-bucket.s3.amazonaws.com/s03.png" \
-F "locales[en_GB][screenshots][1]=https://example-bucket.s3.amazonaws.com/s04.png" \
-F "locales[pt_PT][title]=Titulo via API" \
-F "locales[pt_PT][description]=Descricao via API" \
-F "locales[pt_PT][news]=Noticias via API" \
-F "locales[pt_PT][screenshots][0]=https://example-bucket.s3.amazonaws.com/s01.png" \
-F "locales[pt_PT][screenshots][1]=https://example-bucket.s3.amazonaws.com/s02.png"