# Connecting your app

> The different ways to connect your iOS or Android app to Semaloop.

Rendered version: https://docs.semaloop.com/getting-started/connecting-your-app/

There are a few different ways you can connect your app to Semaloop. On iOS you can use TestFlight or push a build directly; on Android you push an APK.

## TestFlight (iOS)

This is the easiest, and most popular way of connecting your app. We support all different mechanisms for integrating via TestFlight:

* **External TestFlight - public URL.** You can simply provide us with your public TestFlight URL and our agents automatically join your group and pick up new builds as you ship them to us.
* **External TestFlight - email invite.** We can provide you with a couple of our agent email addresses which you can then add to your external TestFlight group. See [Apple’s TestFlight documentation](https://developer.apple.com/help/app-store-connect/test-a-beta-version/invite-external-testers).
* **Internal TestFlight.** Similar to the external TestFlight process, we can provide you with our agent email addresses which you’ll need to add to your TestFlight group. Once they’ve been added and accepted on our side, you’ll then need to provision access to the relevant app/build. See [Apple’s TestFlight documentation](https://developer.apple.com/help/app-store-connect/test-a-beta-version/add-internal-testers).

## Uploading a build (iOS)

If you don’t want to connect your app with TestFlight, you can also send a build to us directly.

First, you’ll need to generate an API key in **Settings** → **API keys** → **Manage keys**.

Once you have that API key, you can use the Semaloop CLI to push a `.app` or `.ipa` artefact to Semaloop.

* `.app` artefacts allow you to run on a simulator
* `.ipa` artefacts allow you to run on a real device, but you’ll need to sign that artefact with Semaloop device UDIDs before pushing to us. See [Apple’s Xcode documentation](https://developer.apple.com/documentation/xcode/distributing-your-app-to-registered-devices).

See the [Semaloop CLI documentation](/integrations/cli/).

## Pushing an APK (Android)

Android apps connect by pushing an APK to us from your CI. There is no Play Console integration — we take the artefact your build already produces.

You’ll need an API key scoped to the Android app, generated the same way as above in **Settings** → **API keys** → **Manage keys**. With that key as a bearer token, the upload is three calls:

1. `POST /api/v1/uploads` — the response contains an `uploadId` and an `uploadUrl`.
2. `PUT` the raw APK bytes to `uploadUrl`, with a `Content-Type` of `application/octet-stream`. Don’t wrap the APK in a ZIP.
3. `POST /api/v1/uploads/finalize` with `{ "id": "<uploadId>" }`.

The APK’s package ID has to match the app the key is scoped to. App bundles, XAPK or APK-set containers, and individual split APKs are rejected — send a single installable APK.

Android tests run on emulators. See [supported platforms](/getting-started/supported-platforms/) for what that does and doesn’t cover today.

## Runs happen automatically

By default, whenever you push a new build to Semaloop, regardless of how you’ve connected your app, we run all of your tests on that build. See the [automatic runs documentation](/running-tests/automatic-runs/).

## Related

- Index of every Semaloop docs page: https://docs.semaloop.com/llms.txt
- All Semaloop docs in one file: https://docs.semaloop.com/llms-full.txt
