AppForShare

Uploading to InstallOnAir from CI: there is no API, here is what to use

· 6 min read

Uploading to InstallOnAir from CI: there is no API, here is what to use

If you have searched for "InstallOnAir API", "InstallOnAir fastlane" or "InstallOnAir GitHub Action" and found nothing useful, that is not your search engine. As published on their site in November 2026, InstallOnAir offers web upload only. There is no public API, no command line tool, no CI plugin and no webhooks. This post explains what that means in practice, what the honest workarounds are, and which tools to use if you want your pipeline to upload test builds and share the link on its own.

What InstallOnAir offers today

We checked their site in November 2026. The service is built around the upload page: drop an .ipa or .apk, optionally sign in, get a short link and a QR code, optionally email testers. Paths such as /api, /docs and /blog return a "not found" page, and their sitemap lists ten pages: home, features, pricing, FAQ, login, register, terms, privacy, advertise and password reset. None of the pages mentions an API, a CLI, CI integrations, webhooks or team accounts.

That is a design choice, not a flaw. InstallOnAir is aimed at the quick, one off share, and for that a web page is enough. It becomes a problem when builds come out of CI several times a day and someone has to download each artifact and upload it by hand.

Why scripting the web upload is a bad idea

When there is no API, the tempting fix is to script the upload form with curl or a headless browser. We would not do that:

  • It breaks without warning. A form is not a contract. Any change to field names, tokens or the page flow stops your pipeline, and you find out when a release is due.
  • It may not be allowed. Automated use of a web form can go against a service's terms. Read them before you try.
  • It gives you nothing back. There is no structured answer with the link, the build ID or an error code, so you end up parsing HTML.
  • It cannot use an account safely. Without API tokens, a script would need your password, which then sits in your CI settings.

If you need automation, use a tool that offers it officially.

What to use instead

AppForShare is one option, and it is the one we make, so here is exactly what it offers. CI uploads use an API token from Dashboard, Settings, on Pro ($12 a month) and Team ($39 a month). Every route below runs the same upload and returns the install link.

ToolStatusGood for
CLI (npm appforshare)AvailableAny CI system, any terminal; resumable uploads for big files
GitHub Action appforshare/appforshare-action@v1AvailableGitHub Actions workflows
fastlane plugin fastlane-plugin-appforshareAvailable on RubyGemsLanes that already run gym or gradle
Diawi compatible endpointAvailableExisting curl scripts written for Diawi
Gradle plugin io.appforshare.uploadAvailable soon on the Gradle Plugin PortalAndroid builds without fastlane
Jenkins plugin, Bitrise stepComing; use the CLI step todayJenkins and Bitrise
MCP serverAvailableClaude Code, Cursor, VS Code and other AI coding tools

The CLI

export APPFORSHARE_TOKEN=afs_your_token
npx appforshare upload app/build/outputs/apk/release/app-release.apk --notes "Build 88" --channel beta

It prints the install link and, with --channel, the channel link that always opens the newest build. --fail-on blocked fails the job when the store readiness check finds a blocker; the build stays uploaded either way. Guides for CircleCI, GitLab, Bitbucket, Jenkins, Azure Pipelines, Xcode Cloud, Codemagic, Bitrise and Expo EAS are under CI uploads.

fastlane

# fastlane add_plugin appforshare
lane :beta do
  gym(export_method: "ad-hoc")
  appforshare(api_token: ENV["APPFORSHARE_TOKEN"], channel: "beta")
end

The action takes the output of gym or gradle and sets APPFORSHARE_CHANNEL_URL for later steps.

A curl script

If you already have a Diawi style script, or simply prefer curl, the Diawi compatible endpoint takes a multipart upload with your token and the file, and answers with a job you poll for the link:

curl -F token="$APPFORSHARE_TOKEN" -F [email protected] -F comment="Build 88" \
  https://appforshare.io/api/ci/diawi

Then call https://appforshare.io/api/ci/diawi/status with the token and job until the status is 2000. One request carries up to 100 MB; for bigger builds use the CLI. Every endpoint is listed in the CI API reference.

Example: upload from GitHub Actions and post the link to Slack

A common first pipeline: build the app, upload it, and drop the link into the team's Slack channel. This job assumes an earlier step produced the APK, a repository secret APPFORSHARE_TOKEN with your API token, and a secret SLACK_WEBHOOK_URL with a Slack incoming webhook address you created in your own Slack workspace.

- name: Share build
  id: afs
  uses: appforshare/appforshare-action@v1
  with:
    file: app/build/outputs/apk/release/app-release.apk
    token: ${{ secrets.APPFORSHARE_TOKEN }}
    release-notes: ${{ github.event.head_commit.message }}
    channel: beta

- name: Post link to Slack
  run: |
    curl -X POST -H 'Content-type: application/json' \
      --data "{\"text\":\"New beta build: ${{ steps.afs.outputs.url }} (always newest: ${{ steps.afs.outputs.channel-url }})\"}" \
      "${{ secrets.SLACK_WEBHOOK_URL }}"

The action's outputs include url, slug, readiness and channel-url. If you would rather not keep a Slack step in every workflow, AppForShare's own webhooks on Pro and Team can post to Slack, Microsoft Teams or Discord when a build is ready, when it fails or when someone installs it. Set it up once in the dashboard and every upload, from any CI system or the web, is announced.

Beyond the upload

Once uploads are scripted, a few other steps tend to follow. Each of these is a CLI command and an API call, on Pro and Team unless noted:

  • Email the link to up to 5 addresses with --email at upload (see email the install link).
  • Protect the link with --password.
  • Promote a build from Beta to Live with npx appforshare promote <id> --channel live.
  • Share with tester groups at upload with --groups (Team).
  • Ask your AI coding tool for the latest build, its install issues or who installed it, through the MCP server (see MCP server).

When a web upload is still the right answer

Not every team needs any of this. If you share a build once a week by hand, a web upload is simpler than maintaining a CI step, and the free tiers of InstallOnAir or AppForShare are both fine for that. To compare them fairly: as published on their site in November 2026, InstallOnAir allows free uploads up to 200 MB, while AppForShare allows 50 MB without an account and 150 MB on a Free account. AppForShare adds a password per build on Free and help on the install page when a build will not install. The side by side is at AppForShare vs InstallOnAir, and the switch is covered in Move from InstallOnAir.

Common questions

Does InstallOnAir have an API?

Not as published on their site in November 2026. Upload is through the web page only, and there are no documented endpoints, CLI or CI plugins.

Is there an InstallOnAir fastlane plugin or GitHub Action?

We found no official one. Since there is no API, any such tool would have to script the web form.

Can I upload to AppForShare from CI on the free plan?

No. API tokens, and so the CLI, GitHub Action, fastlane plugin and Diawi compatible endpoint, need Pro or Team. On Free you upload from the web.

Which CI systems does AppForShare support?

Anything that can run Node.js can run the CLI. There are step by step guides for the common systems under CI uploads.

Keep reading

App Distribution Platform · · 9 min read

AppForShare.io vs Competitors - A Comparative Analysis

For small teams and startups, selecting a mobile app testing platform is a critical crossroad. This choice is more than a mere selection: it’s a strategic decision that directly impacts the...

App Distribution Platform · · 5 min read

AppForShare File Size and Upload Limits

AppForShare limits the size of each build you upload by plan: 50 MB without an account, 150 MB on the Free plan, 2 GB on Pro and 4 GB on Team. Accounts also have a storage total, and every plan...