Codemagic artifact link expired: why downloads stop after 24 hours
· 5 min read
"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 from | How long it works | Source |
|---|---|---|
| Build email | 24 hours | Email notifications |
| Slack message | 24 hours | Slack notifications |
| Build dashboard | 24 hours, remade on each refresh | Build dashboards |
| Tester group email | Sent with the artifacts after every successful build | Tester groups |
| Public link made in the UI | 24 hours, 3 days, 1 week or no expiration | Help center |
| Public link from the REST API | Until the expiresAt time you set | Artifacts 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 plan | Install link life | Newest build on one link |
|---|---|---|
| Free ($0) | 7 days per build | No |
| Pro ($12/month) | While you subscribe | Yes: Beta and Live channel links, with rollback |
| Team ($39/month, 5 seats) | While you subscribe | Yes, 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
- Ask where the link came from: email, Slack or dashboard links last 24 hours.
- Check the build date against your plan's retention (30, 60 or 365 days).
- If the file is still kept, make a fresh public link in the Codemagic UI.
- 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.
- 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.


