Skip to main content

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

MethodURL
POSThttps://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).

⚠️
Account type required

App versions can only be submitted by accounts of type Developer.

Headers

HeaderTypeRequiredDescription
Api-KeystringRequiredUsed to authenticate your API requests. The value is your Aptoide Connect API key.

Body Parameters

⚠️
Important
  • All parameters must be sent as form data (multipart/form-data). JSON requests are not supported. Use the -F flag 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

apk

string (URL)or file

Required

Base APK file.

obbs[0], obbs[1]

string (URL) or file

Optional

Optional OBB (expansion) files.

obbFileNames[0], obbFileNames[1]

string

Required only if obbs[0] and obbs[1] are provided as URLs

Filenames corresponding to each OBB file when submitted via URL.

splits[0], splits[1], ...

string (URL) or file

Optional

Optional APK Split files (e.g., config.arm64_v8a.apk).

billingMethod

string

Optional (default: none)

Indicates if the APK integrates our Billing SDK. Use aptoide-sdk if applicable.

releaseMode

string

Optional
(default: IMMEDIATE)

Controls how and when the submitted APK is released once approved by our admin team. Possible values:
IMMEDIATE — publish automatically after approval
MANUAL — wait for manual release by the developer
SCHEDULED — automatically release at a specified time (requires releaseTimestamp).

releaseTimestamp

string (YYYY-MM-DD HH:mm:ss)

Optional

Used only when releaseMode is set to SCHEDULED. Defines the exact UTC date and time for release.

requiresDeveloperApproval

boolean

Optional (default: false)

When enabled (true), you must manually approve the submission in the Aptoide Connect Developer Console before it is sent for review. When disabled (false), submissions are automatically sent for review once all requirements are met.

icon

string (URL)or file

Optional

Application icon.

featureGraphic

string (URL)or file

Optional

Application featured graphic.

locales[<language_code>][title]

string

Optional

Title in the specified language.

locales[<language_code>][description]

string

Required only if locales[<language_code>][title] is provided

Description in the specified language.

locales[<language_code>][news]

string

Optional

Release notes in the specified language.

locales[<language_code>][screenshots][0], locales[<language_code>][screenshots][1], ...

string (URL) or file

Required only if locales[<language_code>][title] is provided

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 CodeHTTP Status CodeMeaningFix
MISSING-APK400 Bad RequestNo APK file or URL was providedUpload an APK or provide a valid public APK URL
INVALID-APK-FILE400 Bad RequestProvided APK file is invalidProvide a valid APK file or a valid public APK URL
INVALID-APK-URL400 Bad RequestProvided APK URL is not downloadable or invalidCheck URL accessibility and file type
APK-TOO-LARGE413 Payload Too LargeAPK file too largeProvide a smaller APK. Check here the maximum allowed size
OBB-TOO-LARGE413 Payload Too LargeOBB file too largeProvide a smaller OBB. Check here the maximum allowed size
SPLIT-TOO-LARGE413 Payload Too LargeSplit file too largeProvide a smaller Split. Check here the maximum allowed size
APK-NOT-SIGNED422 Unprocessable EntityAPK is unsignedSign the APK before submission
INVALID-BILLING-METHOD400 Bad RequestDisallowed billing method detectedUse an allowed billing method. Allowed values: aptoide-sdk, none
APPLICATION-OWNED-BY-OTHER-ACCOUNT403 ForbiddenApplication owned by another developer accountIf you are the legitimate owner of this application please contact support
APK-ALREADY-EXISTS409 ConflictAPK was already previously submitted by youSubmit a different APK
APK-SIGNATURE-MISMATCH-MARKET409 ConflictAPK signature doesn’t match Google Play versionUse same keystore as on Google Play
APK-SIGNATURE-MISMATCH-PREVIOUS409 ConflictAPK signature doesn’t match previously submitted APK for this ApplicationUse same keystore as previous version
APK-VERCODE-LOWER-THAN-MARKET409 ConflictAPK versionCode lower than Google Play versionIncrement versionCode to a value that is the same or higher than the one on Google Play
FAILED-MOVING-APK-TO-STORAGE500 Internal Server ErrorFailed to move APK to internal storageRetry
FAILED-MOVING-OBB-TO-STORAGE500 Internal Server ErrorFailed to move OBB to internal storageRetry
FAILED-MOVING-SPLIT-TO-STORAGE500 Internal Server ErrorFailed to move Split file to internal storageRetry
SUBMISSION-NOT-ALLOWED403 ForbiddenApplication 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-ALLOWED403 ForbiddenToo many pending submissions awaiting approvalWait 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"