GitHub Actions Artifacts (public repositories)
- Free allowance
- Plan table still lists artifact storage 500 MB (Free) / 1 GB (Pro) / 2 GB (Team) / 50 GB (Enterprise), and that pool is SHARED with GitHub Packages.
- Verdict
- caveatusable, with a named limit or an unprobed read path
- Cost
- free tier
- Identity
- anonymousno card, no phone
- Binding limit
- retention-clampedRetention: default 90 days
- Evidence
- reported4 sources; a third party said so
- Freshness
- stale on 2026-11-05checked 2026-10-21 (inherited); stale on 2026-11-05
| Free tier | Plan table still lists artifact storage 500 MB (Free) / 1 GB (Pro) / 2 GB (Team) / 50 GB (Enterprise), and that pool is SHARED with GitHub Packages. Billing docs state Actions usage is free for public repositories. Artifact storage for public repos is not metered in practice, but the docs do not say 'unlimited' explicitly — flag as ambiguity. unit GB; metered on stored-bytes |
|---|---|
| Price | none stated |
| Limits |
Retention: default 90 days; public repos may be set 1-90 days only (private repos 1-400 days). retention-days on upload-artifact cannot exceed the repo/org setting. 500 artifacts per job. Anonymous download requires a token, hence the wrapper. |
| Binding | retention-clamped a clock, not a quota: bytes leave whether or not a user is finished with them |
| Identity | anonymous not published |
| Egress | Free. Downloads redirect to productionresultssa*.blob.core.windows.net. But the API download endpoint requires a token: anonymous GET of /actions/artifacts/{id}/zip returns 401. |
| Per-object cap | not stated |
| Retention | Retention: default 90 days; public repos may be set 1-90 days only (private repos 1-400 days) (90 days) |
| Interface | rest, cli rest |
| Tooling | actions/upload-artifact@v4 (max 500 artifacts per job), REST /repos/{o}/{r}/actions/artifacts, gh CLI. Third-party: nightly.link (see above), monteslu/loukai and alexreich/SitePix both have commits literally titled 'bypass Actions artifact storage; upload directly to release', which in plain terms means moving the bytes to releases instead; the ecosystem's own conclusion is that releases beat artifacts. |
| Composes with | Unlimited public repos x 500 artifacts/job x jobs. But retention caps it: this is a rotating buffer, never an archive. |
| Reliability | Hard TTL — artifacts are deleted at expiry and cannot be restored. Separate 10 GB/repo cache is also 7-day-evicted. Fine as a 90-day hot tier, useless as an archive. |
Evidence 4
| date | source | what it proved |
|---|---|---|
| 2026-10-21 | docs.github.com/en/billing/concepts/product-billing/github-a | 'GitHub Actions usage is free for self-hosted runners and for public repositories'; storage table; 'Cache storage is a separate allowance of 10 GB per repository' |
| 2026-10-21 | docs.github.com/en/repositories/managing-your-repositorys-se | 'For public repositories: you can change this retention period to anywhere between 1 day or 90 days' |
| 2026-10-21 | api.github.com/repos/cli/cli/actions/artifacts?per_page=3 | probe: curl -D - -> 200, total_count 9646, expires_at present |
| 2026-10-21 | api.github.com/repos/cli/cli/actions/artifacts/12312575009/z | probe: curl -o /dev/null -> 401 (token required, unlike release assets) |
Unknown values 4
$.identity_cost.detailboilerplate$.per_object_cap.notesthe field may be stated in a source that was not read$.per_object_cap.statedthe field may be stated in a source that was not read$.retention.notesthe field may be stated in a source that was not read