AppForShare

Codemagic artifact link expired: why downloads stop after 24 hours

· 5 min read

Codemagic artifact link expired: why downloads stop after 24 hours

"The link has expired" is one of the most common messages a Codemagic tester sees, and it is not a bug. Codemagic makes artifact links short lived on purpose. This guide explains each kind of Codemagic link, how long it lasts, how long the file itself is kept, and what to do when testers need a link that keeps working. Codemagic facts are as listed on docs.codemagic.io and help.codemagic.io on November 5, 2026.

The short answer

Download links that Codemagic puts in build emails, Slack messages and build dashboards are valid for 24 hours. After that the link stops, even though the file is still stored. You can make a longer link by hand or with the REST API, but no Codemagic link outlives the artifact, and artifacts are removed after 30 days, 60 days or one year depending on your plan.

Every Codemagic link and how long it lasts

Where the link comes fromHow long it worksSource
Build email24 hoursEmail notifications
Slack message24 hoursSlack notifications
Build dashboard24 hours, remade on each refreshBuild dashboards
Tester group emailSent with the artifacts after every successful buildTester groups
Public link made in the UI24 hours, 3 days, 1 week or no expirationHelp center
Public link from the REST APIUntil the expiresAt time you setArtifacts API

The build dashboard is the one that confuses people most. The page itself stays at the same address, but each download link on it is new every time the page loads and lasts 24 hours. So a tester who bookmarks the dashboard is fine; a tester who copies a download link out of it is not.

Retention: when the file itself is gone

Separately from link lifetime, Codemagic removes artifacts after a set time:

  • Free (personal) plan: 30 days.
  • Pay as you go: 60 days.
  • Fixed annual plans: one year.

Codemagic's help center says a public link with "no expiration" still stops working when retention removes the artifact. If a client wants to install the build you sent two months ago on pay as you go, there is nothing left to download.

Making a longer Codemagic link

From the UI

Open the build, find the artifact and make a public link with 3 days, 1 week or no expiration. That works for one build at a time. Each new build needs a new link, so testers get a new address every time.

From a script

Codemagic's help center shows a script that reads CM_ARTIFACT_LINKS and calls the REST API to make a public link. The artifact URLs in CM_ARTIFACT_LINKS point to api.codemagic.io and need your Codemagic API token, which is why the script exists. The call is POST /artifacts/:secureFilename/public-url with an expiresAt time in UNIX seconds. You then post that link somewhere yourself, for example in Slack.

This keeps you inside Codemagic, but it still gives testers a file download, and the link still ends with retention.

Why a download link is not enough for iPhones

Even a link that never expires does not solve the iPhone case. An .ipa downloaded in Safari does not install. iOS needs an install page whose button points at a manifest, and the build must be signed ad hoc, development or enterprise with the device in the profile. We did not find an iOS install page in Codemagic's docs. For Android, an APK download does install, after the tester allows installs from the browser once.

Keeping one install link that works

If testers outside the build team need builds, send them to a page that is made for installing, and make the link outlive a single build. With AppForShare, a publishing script uploads each Codemagic build:

publishing:
  scripts:
    - name: Share with testers
      script: |
        if [ -f ~/SUCCESS ]; then
          npx --yes appforshare upload build/ios/ipa --channel beta
        fi

The ~/SUCCESS check matters because Codemagic runs publishing scripts even after a failed build; the full workflow is in Share a Codemagic build with testers. What changes for testers:

AppForShare planInstall link lifeNewest build on one link
Free ($0)7 days per buildNo
Pro ($12/month)While you subscribeYes: Beta and Live channel links, with rollback
Team ($39/month, 5 seats)While you subscribeYes, plus tester groups, install status and reminders

Upload tokens for CI are part of Pro and Team. A channel link is the closest thing to a Codemagic build dashboard that does not age out: testers keep one address, and it always opens the newest build in the channel. If you want a page with older builds too, the build history page (Pro and Team, opt in per project) lists the last 20 builds of a project with an Install button each, and each build keeps its own password and link controls.

A checklist when a tester says the link expired

  1. Ask where the link came from: email, Slack or dashboard links last 24 hours.
  2. Check the build date against your plan's retention (30, 60 or 365 days).
  3. If the file is still kept, make a fresh public link in the Codemagic UI.
  4. For iPhone testers, check the build was signed ad hoc and their UDID is in the profile. A free provisioning profile inspector reads the profile in your browser.
  5. If this happens every week, move testers to a link that does not age out.

Common questions

Can I change the 24 hour limit on Codemagic email links?

We did not find a setting for it in Codemagic's docs. Use a public link from the UI or the REST API for a longer one.

Does a no expiration link last forever?

No. It lasts until retention removes the artifact: 30 days, 60 days or a year, by plan.

Do AppForShare links last forever?

No. Free links last 7 days. Pro and Team links stay live while you subscribe.

Codemagic's short links are a fair choice for developers. For clients and QA, an install page that keeps working saves the "can you resend it" message. Compare the two in AppForShare vs Codemagic, or create a free account and upload one build to see the install page.

Keep reading

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...