# Semaloop integrations

Last reviewed: 2 October 2026

Semaloop connects to the tools a mobile team already uses: builds reach it from TestFlight or CI, and results go back out to GitHub, Slack, a coding agent or any HTTP endpoint you choose. Each integration below is described in full, followed by the questions people ask about it, each answered directly. Where Semaloop does not integrate with something, the answer says so and gives the route that works today.

## Webhooks

Semaloop sends a signed webhook, delivered by Svix, the moment a test run reaches a terminal status — success, failure or error. The event type is test_run.status_changed.v1, and the payload carries the app, test, build and test run IDs, a link to the run, and the failure or error reason, so your tooling can open a ticket, page someone or hand the failure to a coding agent.

**Set up:** Settings → Webhooks → Set up webhooks. The webhook portal lets you add endpoint URLs, choose the events each endpoint receives, inspect every delivery and its response, and replay failed deliveries.

Documentation: https://docs.semaloop.com/integrations/webhooks/

```json
{
  "type": "test_run.status_changed.v1",
  "appId": "uk_example_app",
  "data": {
    "previousStatus": "pending",
    "nextStatus": "failure",
    "testRunId": "a379af73-217d-464b-b4ee-266b63a1f48d",
    "url": "https://app.semaloop.com/app/uk_example_app/run/a379af73…",
    "failureReason": "Tapping 'Sign in' showed an error"
  }
}
```

### Does Semaloop support webhooks?

Yes. Semaloop sends an outbound webhook, test_run.status_changed.v1, whenever a test run reaches success, failure or error. Deliveries are signed, and can be inspected and replayed from the webhook portal. Setup and the full payload are in the [webhooks documentation](https://docs.semaloop.com/integrations/webhooks/).

### Can I get a webhook only when a test fails?

Yes. Add a Svix transformation to the endpoint in the webhook portal that cancels any delivery whose nextStatus is not failure. Non-failures are then never sent to that endpoint.

### How do I verify that a webhook came from Semaloop?

Every endpoint has a signing secret, shown in the webhook portal. Verify the svix-signature header against it before trusting a request, either with a Svix SDK or by checking the signature by hand.

### Will a retried run send more than one webhook?

No. When Semaloop retries a run automatically, only the final attempt sends an event. Each event's id is stable per run and status, so you can safely deduplicate on it.

## MCP server

A remote MCP server lets a coding agent do anything the dashboard can: discover apps, builds and tests, create and revise tests from a natural language description, trigger and cancel runs, pull the root-cause analysis, video, network logs and system logs behind a result, track recurring issues, and manage secrets and custom tools.

**Set up:** Settings → MCP. Interactive agents connect to https://mcp.semaloop.com/mcp over Streamable HTTP and sign in with OAuth 2.1. CI and headless agents connect to https://mcp.semaloop.com/mcp/key with an API key instead.

Documentation: https://docs.semaloop.com/integrations/mcp-server/

### Does Semaloop have an MCP server?

Yes. The Semaloop MCP server runs at https://mcp.semaloop.com/mcp over Streamable HTTP, with OAuth 2.1 sign-in, so any MCP client that supports remote servers can connect to it. Setup is in the [MCP server documentation](https://docs.semaloop.com/integrations/mcp-server/).

### Can a coding agent write and update Semaloop tests?

Yes. Over the MCP server an agent can list your existing tests, compare them with a pull request, and write a new test from a natural language description of the flow. When a run fails it can pull the video, network logs and system logs, decide whether the app or the test is at fault, and fix the code or revise the test in the same session.

### Can I use the MCP server from CI, without signing in?

Yes. CI and headless agents connect to https://mcp.semaloop.com/mcp/key with a Semaloop API key as a bearer token. It is the same server with the same tools; the key is confined to the single app it was created for and carries write access.

### What can a read-only user do over MCP?

Every member of an organisation can read apps, builds, tests, runs, issues, signals and run artefacts. Creating or updating tests, secrets and custom tools, and triggering or cancelling runs, needs the write or admin organisation role.

## GitHub

A native GitHub Action, semaloop/cli/actions/build-push@v1, pushes your build to Semaloop when you cut a release — a .app or .ipa for iOS, or a standalone .apk for Android. When builds arrive this way, the results of the tests run against them are reported back to the pull request as checks.

**Set up:** Settings → GitHub integration to connect the repository, then add the build-push action to a workflow with a Semaloop API key stored as a repository secret.

Documentation: https://docs.semaloop.com/integrations/github/

```yaml
- uses: semaloop/cli/actions/build-push@v1
  with:
    path: build/YourApp.app
    api-key: ${{ secrets.SEMALOOP_API_KEY }}
```

### Does Semaloop have a GitHub Action?

Yes. semaloop/cli/actions/build-push@v1 pushes an iOS .app or .ipa, or an Android .apk, to Semaloop from a GitHub workflow. It takes the artefact path and a Semaloop API key, and works out the repository, commit and ref for you.

### Can Semaloop report test results as checks on a pull request?

Yes, when builds reach Semaloop through the GitHub Action or the CLI and the repository is connected in Settings → GitHub integration. Builds that arrive from TestFlight are not tied to a commit, so they do not produce pull request checks.

### Does Semaloop work with GitLab, Bitbucket, Bitrise, CircleCI or Xcode Cloud?

Yes for pushing builds: the Semaloop CLI, or three calls to the upload API, push a build from any CI system that can run a command. Reporting results back as pull request checks is GitHub-only today; on other systems, use a webhook to post results wherever you need them.

## Slack

A channel of your choice gets a summary whenever a full test suite run completes on a new build, and the message updates in place, rather than posting again, when a result changes because its test spec was edited. Anyone can also subscribe to a single test and get its outcome as a direct message.

**Set up:** Settings → Slack integration, then choose the channel that should receive suite summaries.

Documentation: https://docs.semaloop.com/integrations/slack/

### Does Semaloop integrate with Slack?

Yes. Semaloop posts a summary to a channel of your choice whenever a full test suite run completes on a new build, and you can subscribe to an individual test to get its result as a direct message. Manual reruns do not post a channel summary.

### Does Semaloop integrate with Microsoft Teams?

Not natively. To get results into Teams, send Semaloop's webhook to a Teams workflow or another automation tool, and use a transformation in the webhook portal to filter to failures or reshape the message.

## TestFlight

On iOS, Semaloop picks up every new build straight from TestFlight, with nothing to trigger by hand. It supports an external group by public link, an external group by email invite, and internal testing. TestFlight builds run on real iPhones.

**Set up:** Give Semaloop your public TestFlight link, or add the agent email addresses Semaloop provides to your external or internal TestFlight group.

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

### Does Semaloop integrate with TestFlight?

Yes, and it is the most common way to connect an iOS app. Semaloop joins your external group through a public link or an email invite, or your internal group, then picks up and tests each new build as you ship it.

### Can I use Semaloop without TestFlight?

Yes. Push a build with the CLI, the GitHub Action or the upload API instead: a .app runs on an iOS simulator, and a .ipa signed with Semaloop's device IDs runs on a real iPhone.

### Does Semaloop integrate with Google Play?

No. There is no Play Console integration: Android apps connect by pushing a single installable .apk from CI. App bundles (.aab), XAPK or APK-set containers, and split APKs are not accepted.

## CLI, API keys and the upload API

The Semaloop CLI, in early access, pushes builds from the command line or any CI system, and can tag a build with its repository, commit and ref so results come back as pull request checks. It installs with Homebrew or as a downloaded binary, and authenticates with an API key created in Settings → API keys. The same key calls the upload API directly and connects CI to the MCP server.

**Set up:** Settings → API keys → Manage keys to create a key, which is scoped to one app. Install the CLI with brew tap semaloop/tap and brew install semaloop, then run semaloop build push.

Documentation: https://docs.semaloop.com/integrations/cli/

```shell
brew tap semaloop/tap
brew install semaloop
export SEMALOOP_API_KEY=…
semaloop build push build/YourApp.app
```

### Can I trigger Semaloop from my CI pipeline?

Yes. Pushing a build from CI with the CLI, the GitHub Action or the upload API runs every active test against it automatically. To run only selected tests against a specific build, call the test_runs_trigger tool on the MCP server's API-key endpoint from the same pipeline.

### Does Semaloop have a REST API?

Yes, for getting builds in: POST /api/v1/uploads, a PUT of the artefact to the returned URL, then POST /api/v1/uploads/finalize, authenticated with an API key as a bearer token and described in the [OpenAPI specification](https://semaloop.com/openapi.json). Everything else — tests, runs, results, issues, secrets and custom tools — is available programmatically through the MCP server.

### Is there a Semaloop CLI?

Yes, in early access. semaloop build push sends a .app, .ipa or .apk to Semaloop, and its --git-repo, --git-commit and --git-ref flags let results be reported back to GitHub. The source and releases are at github.com/semaloop/cli.

## Issue trackers (Jira, Linear and others)

Semaloop has no built-in Jira or Linear integration. Teams route failures and recurring issues into their tracker in one of two ways: a webhook that opens a ticket when a run fails, or a coding agent connected to both the Semaloop MCP server and the tracker, which pulls Semaloop's issues and files them with whatever other context you have.

**Set up:** Point a webhook endpoint at a small handler or automation that creates the ticket, or connect your coding agent to the Semaloop MCP server alongside your tracker's own MCP server.

Documentation: https://docs.semaloop.com/integrations/webhooks/

```js
// Webhook portal → endpoint → Advanced → Transformation
function handler(webhook) {
  if (webhook.payload.data.nextStatus !== "failure") {
    webhook.cancel = true;
  }
  return webhook;
}
```

### Does Semaloop integrate with Jira or Linear?

Not natively. A webhook can open a ticket the moment a run fails, since the payload carries the failure reason and a link to the run. Alternatively, a coding agent connected to the Semaloop MCP server and to your tracker can pull Semaloop's recurring issues and file them for you.

### Can Semaloop page our on-call engineer when a test fails?

Yes, through a webhook. Send test_run.status_changed.v1 to your paging tool's inbound webhook, with a transformation in the portal so only failures are delivered.

Every integration is also documented at https://docs.semaloop.com/integrations/.
