---
title: "Upload apps and certificates"
description: "Upload apps and certificates to Adyen for your Android payment terminals."
url: "https://docs.adyen.com/point-of-sale/android-terminals/deploy-apps/upload"
source_url: "https://docs.adyen.com/point-of-sale/android-terminals/deploy-apps/upload.md"
canonical: "https://docs.adyen.com/point-of-sale/android-terminals/deploy-apps/upload"
last_modified: "2026-05-18T10:42:00+02:00"
language: "en"
---

# Upload apps and certificates

Upload apps and certificates to Adyen for your Android payment terminals.

[View source](/point-of-sale/android-terminals/deploy-apps/upload.md)

To be able to install your app on your Android payment terminals, you first need to upload the app so we can convert it into a format that the terminals can handle. If an app also requires a certificate, you need to upload the certificate as well.

You can upload apps and certificates in your Customer Area or through API calls.

After uploading, you can install your app and certificate on your payment terminals using [API calls](/point-of-sale/android-terminals/deploy-apps/terminal-actions-api) or [profiles](/point-of-sale/android-terminals/deploy-apps/profiles/), or manually using the [Customer Area](/point-of-sale/android-terminals/deploy-apps/schedule), as described on other pages.

By choosing to upload, install, or run any third-party applications on an Adyen payment terminal, you accept full responsibility and liability for any consequences of uploading, installing, or running any such applications.

## Requirements

Before you begin, take into account the following requirements and limitations.

| Requirement                                                   | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Integration type**                                          | A [Terminal API integration](/point-of-sale/design-your-integration/terminal-api) with payment terminals or a [standalone solution](/point-of-sale/standalone).                                                                                                                                                                                                                                                                                                                             |
| **[API credentials](/development-resources/api-credentials)** | To upload apps and certificates using API requests, you must have an API credential with an API key and the following [role](/development-resources/api-credentials#api-permissions):- **Management API—Android apps/certificates read and write** If you have a Terminal API integration with [cloud-based communications](/point-of-sale/design-your-integration/choose-your-architecture#cloud-communications), you can use the existing API key that you use for Terminal API requests. |
| **[Customer Area roles](/account/user-roles)**                | To upload apps and certificates using the Customer Area, you must have the following role:- **Merchant POS Terminal Management Admin role**                                                                                                                                                                                                                                                                                                                                                 |
| **Hardware**                                                  | Android payment terminals.                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| **Limitations**                                               | Take into account the following limitations:- Requests to live Management API endpoints related to Android apps and certificates are subject to [rate limits](/point-of-sale/automating-terminal-management#rate-limits-in-the-live-environment).
- The [maximum number of versions for a single app](#app-upload-and-storage-policy) that you can store in your Customer Area is 50.                                                                                                       |

## Prepare the APK file

Before you upload apps to Adyen, you need to create a signed APK file of your app:

1. In Android Studio, select **Build** > **Generate Signed Bundle / APK**.

2. In the dialog, select **APK** and then **Next**.

3. Configure your key store details and select **Next**.

4. Select a build variant:

   * If your `minSdkVersion` is 23 or earlier, select **V1 (Jar Signature)**. We recommend also selecting **V2 (Full APK Signature)**.
   * If your `minSdkVersion` is later than 23, we recommend selecting **V2 (Full APK Signature)**.

5. Select **Finish**.

For more details, see the [Android APK signing documentation](https://source.android.com/security/apksigning/v2).

## Upload the app

### Tab: Customer Area

After you [have prepared the APK file](#prepare-the-apk-file):

1. In your [Customer Area](https://ca-test.adyen.com/), go to **In-person payments** > **Android** and select the **Apps** tab.

2. Select **Upload app**.

   If you do not see the **Upload app** button, contact our [Support Team](https://ca-test.adyen.com/ca/ca/contactUs/support.shtml?form=other) to enable it.

3. In the dialog box:

   1. Drag the APK file to the upload box or select the box and choose the APK file.
   2. Optionally, enter a description of the app so that we can store this in our systems.\
      On the terminal, we will use the app name that is included in the APK.
   3. Select the checkbox to opt in.
   4. Select **Upload app**.

4. Stay on the page until the dialog box closes.\
   On the **Android** page, the **Apps** tab now shows the icon and APK name of your app.

5. Check the status of your app.

   | Status     | Description                                                                                                                                                                                                                                                                                                                                                                |
   | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
   | Processing | We are busy signing and converting the app. This can take up to an hour.                                                                                                                                                                                                                                                                                                   |
   | Error      | Something went wrong. Check that the app matches the [specifications](/point-of-sale/android-terminals/app-requirements#app-specifications) and retry [uploading](#upload-your-app) the APK file. If the retry attempt fails as well, contact our [Support Team](https://ca-test.adyen.com/ca/ca/contactUs/support.shtml?form=other) or your Adyen implementation manager. |
   | Invalid    | There is something wrong with the APK file. Contact our [Support Team](https://ca-test.adyen.com/ca/ca/contactUs/support.shtml?form=other) or your Adyen implementation manager.                                                                                                                                                                                           |
   | Ready      | We finished signing and converting the app. The app is ready for installation.                                                                                                                                                                                                                                                                                             |

### Tab: API

You can use our Management API to upload your app. You need to prepare the APK file first and then pass it in the request body as multipart form data.

After you [have prepared the APK file](#prepare-the-apk-file):

1. Make a POST [/companies/{companyId}/androidApps](https://docs.adyen.com/api-explorer/Management/latest/post/companies/\(companyId\)/androidApps) request, specifying the following parameters.

   * Path parameter:

     | Parameter   | Required                                                                                    | Description                                   |
     | ----------- | ------------------------------------------------------------------------------------------- | --------------------------------------------- |
     | `companyId` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The unique identifier of the company account. |

   * Request body parameters:

     | Parameter     | Required                                                                                    | Description                                                                                                                                                           |
     | ------------- | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
     | `file`        | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The path to the Android Package (APK) of the app, in multipart form data format. The maximum APK file size is:- Test environment: 700 MB.
     - Live environment: 200 MB. |
     | `description` |                                                                                             | Your description of the Android app, in multipart form data format.                                                                                                   |

   **Upload an app**

   #### curl

   ```bash
   curl https://management-test.adyen.com/v3/companies/{companyId}/androidApps \
   -H 'x-API-key: ADYEN_API_KEY' \
   -X POST \
   -F 'file=@"PATH_TO_ANDROID_APP_APK_FILE"' \
   -F 'description="YOUR_DESCRIPTION"'
   ```

   #### Java

   ```java
   // Adyen Java API Library v25.0.0
   import com.adyen.Client;
   import com.adyen.enums.Environment;
   import com.adyen.service.management.*;

   Client client = new Client("ADYEN_API_KEY", Environment.TEST);
   // Make the request
   AndroidFilesCompanyLevelApi service = new AndroidFilesCompanyLevelApi(client);
   UploadAndroidAppResponse response = service.uploadAndroidApp("companyId", null);
   ```

   #### PHP

   ```php
   // Adyen PHP API Library v17.4.0
   use Adyen\Client;
   use Adyen\Environment;
   use Adyen\Service\Management\AndroidFilesCompanyLevelApi;

   $client = new Client();
   $client->setXApiKey("ADYEN_API_KEY");
   $client->setEnvironment(Environment::TEST);

   // Make the request
   $service = new AndroidFilesCompanyLevelApi($client);
   $response = $service->uploadAndroidApp('companyId');
   ```

   #### C\#

   ```cs
   // Adyen .net API Library v14.3.0
   using Adyen;
   using Environment = Adyen.Model.Environment;
   using Adyen.Service.Management;

   var config = new Config()
   {
       XApiKey = "ADYEN_API_KEY",
       Environment = Environment.Test
   };
   var client = new Client(config);

   // Make the request
   var service = new AndroidFilesCompanyLevelService(client);
   var response = service.UploadAndroidApp("companyId");
   ```

   #### NodeJS (JavaScript)

   ```js
   // Adyen Node API Library v16.2.0
   // Require the parts of the module you want to use
   const { Client, ManagementAPI } = require('@adyen/api-library');

   // Initialize the client object
   const client = new Client({apiKey: "ADYEN_API_KEY", environment: "TEST"});

   // Make the request
   const managementAPI = new ManagementAPI(client);
   const response = managementAPI.AndroidFilesCompanyLevelApi.uploadAndroidApp("companyId");
   ```

   #### Go

   ```go
   // Adyen Go API Library v9.2.0
   import (
   	"context"
   	"github.com/adyen/adyen-go-api-library/v9/src/common"
   	"github.com/adyen/adyen-go-api-library/v9/src/adyen"
   	"github.com/adyen/adyen-go-api-library/v9/src/management"
   )

   client := adyen.NewClient(&common.Config{
       ApiKey:      "ADYEN_API_KEY",
       Environment: common.TestEnv,
   })

   // Make the request
   service := client.Management()
   req := service.AndroidFilesCompanyLevelApi.UploadAndroidAppInput("companyId")
   res, httpRes, err := service.AndroidFilesCompanyLevelApi.UploadAndroidApp(context.Background(), req)
   ```

   #### Python

   ```py
   # Adyen Python API Library v12.2.0
   import Adyen

   adyen = Adyen.Adyen()
   adyen.client.xapikey = "ADYEN_API_KEY"
   adyen.client.platform = "test" # The environment to use library in.

   result = adyen.management.android_files_company_level_api.upload_android_app(companyId="companyId")
   ```

   #### Ruby

   ```rb
   # Adyen Ruby API Library v9.2.0
   require "adyen-ruby-api-library"

   adyen = Adyen::Client.new
   adyen.api_key = 'ADYEN_API_KEY'
   adyen.env = :test # Set to "live" for live environment

   result = adyen.management.android_files_company_level_api.upload_android_app('companyId')
   ```

   #### NodeJS (TypeScript)

   ```ts
   // Adyen Node API Library v16.2.0
   // Require the parts of the module you want to use
   import { Client, ManagementAPI, Types } from "@adyen/api-library";

   // Initialize the client object
   const client = new Client({apiKey: "ADYEN_API_KEY", environment: "TEST"});

   // Make the request
   const managementAPI = new ManagementAPI(client);
   const response = managementAPI.AndroidFilesCompanyLevelApi.uploadAndroidApp("companyId");
   ```

2. When you receive the response, save the `id` of the uploaded Android app.\
   You need this ID if you want to [use API calls](/point-of-sale/android-terminals/deploy-apps/terminal-actions-api) to schedule installing or uninstalling the app.

## (Optional) Upload the certificate

Some apps need a digital certificate. For example, a certificate to protect network communications between a POS app and the back end of that app. Such a certificate needs to be installed on the terminal, and replaced with a new one before the validity period of the certificate expires.

### Tab: Customer Area

To upload the certificate of your Android app using the Customer Area:

1. Make sure that you have the certificate in **.pem** or **.cert** format.

2. In your [Customer Area](https://ca-test.adyen.com/), go to **In-person payments** > **Android** and select the **Certificates** tab.

3. Select **Upload new certificate**.

4. In the dialog box:

   1. Drag the certificate file to the upload box or select the box and choose the certificate file.
   2. Enter the certificate name to show in the Customer Area.
   3. Optionally, enter a description of the certificate.
   4. Select **Upload certificate**.

5. Check that the **Certificates** tab now shows the name of your certificate, and the status **Ready**.

### Tab: API

To upload the certificate of your Android app using the [Management API](https://docs.adyen.com/api-explorer/Management/latest/overview):

1. Make a POST [/companies/{companyId}/androidCertificates](https://docs.adyen.com/api-explorer/Management/latest/post/companies/\(companyId\)/androidCertificates) request, specifying the following parameters.

   * Path parameter:

     | Parameter   | Required                                                                                    | Description                                   |
     | ----------- | ------------------------------------------------------------------------------------------- | --------------------------------------------- |
     | `companyId` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The unique identifier of the company account. |

   * Request body parameters:

     | Parameter     | Required                                                                                    | Description                                                                                                           |
     | ------------- | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
     | `file`        | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The path to the .CRT or .PEM file of the certificate, in multipart form data format. The maximum file size is 100 KB. |
     | `name`        | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The name of the certificate.                                                                                          |
     | `description` |                                                                                             | Your description of the Android certificate, in multipart form data format.                                           |

   **Upload a certificate**

   #### curl

   ```bash
   curl https://management-test.adyen.com/v3/companies/{companyId}/androidCertificates \
   -H 'x-API-key: ADYEN_API_KEY' \
   -X POST \
   -F 'file=@"PATH_TO_THE_CERTIFICATE_FILE"' \
   -F 'name="YOUR_NAME_FOR_THE_CERTIFICATE"' \
   -F 'description="YOUR_DESCRIPTION"'
   ```

   #### Java

   ```java
   // Adyen Java API Library v25.0.0
   import com.adyen.Client;
   import com.adyen.enums.Environment;
   import com.adyen.service.management.*;

   Client client = new Client("ADYEN_API_KEY", Environment.TEST);
   // Make the request
   AndroidFilesCompanyLevelApi service = new AndroidFilesCompanyLevelApi(client);
   UploadAndroidCertificateResponse response = service.uploadAndroidCertificate("companyId", null);
   ```

   #### PHP

   ```php
   // Adyen PHP API Library v17.4.0
   use Adyen\Client;
   use Adyen\Environment;
   use Adyen\Service\Management\AndroidFilesCompanyLevelApi;

   $client = new Client();
   $client->setXApiKey("ADYEN_API_KEY");
   $client->setEnvironment(Environment::TEST);

   // Make the request
   $service = new AndroidFilesCompanyLevelApi($client);
   $response = $service->uploadAndroidCertificate('companyId');
   ```

   #### C\#

   ```cs
   // Adyen .net API Library v14.3.0
   using Adyen;
   using Environment = Adyen.Model.Environment;
   using Adyen.Service.Management;

   var config = new Config()
   {
       XApiKey = "ADYEN_API_KEY",
       Environment = Environment.Test
   };
   var client = new Client(config);

   // Make the request
   var service = new AndroidFilesCompanyLevelService(client);
   var response = service.UploadAndroidCertificate("companyId");
   ```

   #### NodeJS (JavaScript)

   ```js
   // Adyen Node API Library v16.2.0
   // Require the parts of the module you want to use
   const { Client, ManagementAPI } = require('@adyen/api-library');

   // Initialize the client object
   const client = new Client({apiKey: "ADYEN_API_KEY", environment: "TEST"});

   // Make the request
   const managementAPI = new ManagementAPI(client);
   const response = managementAPI.AndroidFilesCompanyLevelApi.uploadAndroidCertificate("companyId");
   ```

   #### Go

   ```go
   // Adyen Go API Library v9.2.0
   import (
   	"context"
   	"github.com/adyen/adyen-go-api-library/v9/src/common"
   	"github.com/adyen/adyen-go-api-library/v9/src/adyen"
   	"github.com/adyen/adyen-go-api-library/v9/src/management"
   )

   client := adyen.NewClient(&common.Config{
       ApiKey:      "ADYEN_API_KEY",
       Environment: common.TestEnv,
   })

   // Make the request
   service := client.Management()
   req := service.AndroidFilesCompanyLevelApi.UploadAndroidCertificateInput("companyId")
   res, httpRes, err := service.AndroidFilesCompanyLevelApi.UploadAndroidCertificate(context.Background(), req)
   ```

   #### Python

   ```py
   # Adyen Python API Library v12.2.0
   import Adyen

   adyen = Adyen.Adyen()
   adyen.client.xapikey = "ADYEN_API_KEY"
   adyen.client.platform = "test" # The environment to use library in.

   result = adyen.management.android_files_company_level_api.upload_android_certificate(companyId="companyId")
   ```

   #### Ruby

   ```rb
   # Adyen Ruby API Library v9.2.0
   require "adyen-ruby-api-library"

   adyen = Adyen::Client.new
   adyen.api_key = 'ADYEN_API_KEY'
   adyen.env = :test # Set to "live" for live environment

   result = adyen.management.android_files_company_level_api.upload_android_certificate('companyId')
   ```

   #### NodeJS (TypeScript)

   ```ts
   // Adyen Node API Library v16.2.0
   // Require the parts of the module you want to use
   import { Client, ManagementAPI, Types } from "@adyen/api-library";

   // Initialize the client object
   const client = new Client({apiKey: "ADYEN_API_KEY", environment: "TEST"});

   // Make the request
   const managementAPI = new ManagementAPI(client);
   const response = managementAPI.AndroidFilesCompanyLevelApi.uploadAndroidCertificate("companyId");
   ```

2. When you receive the response, save the `id` of the uploaded Android certificate.\
   You need this ID if you want to [use API calls](/point-of-sale/android-terminals/deploy-apps/terminal-actions-api) to schedule installing a new certificate or uninstalling an expired certificate.

## App upload and storage policy

We automatically delete apps from your Customer Area in the following cases:

* **Version limit reached**: You can store a maximum of 50 versions for a single app. When you upload a new version of an app that already has 50 versions, the oldest uploaded version is deleted automatically.
* **Unused apps**: Apps that are older than 2 years and not installed on any terminal are deleted automatically.

## See also

* [Specifications and testing of apps for Android terminals](/point-of-sale/android-terminals/app-requirements)
* [Manage app deployment using API requests](/point-of-sale/android-terminals/deploy-apps/terminal-actions-api)
* [Deploy apps using profiles](/point-of-sale/android-terminals/deploy-apps/profiles)
* [Manage app deployment using the Customer Area](/point-of-sale/android-terminals/deploy-apps/schedule)
