Home / GitLab
GitLab CI Job Artifacts (GitLab.com Free)
gitlab.comPaaSstorage/gitlab-ci-job-artifactsJSONcomparereport an errorprovider JSON
- Free allowance
- Not counted against the 10 GiB project storage limit ('build artifacts are not included in the limit').
- Verdict
- caveatusable, with a named limit or an unprobed read path
- Cost
- free tier
- Identity
- email?placeholder, not evidence; card unknown, phone unknown
- Binding limit
- noneno named constraint binds
- Evidence
- reported3 sources; a third party said so
- Freshness
- stale on 2026-11-05checked 2026-10-21 (inherited); stale on 2026-11-05
| Free tier | Not counted against the 10 GiB project storage limit ('build artifacts are not included in the limit'). 1 GB compressed maximum per artifact archive on GitLab.com. unit GiB; metered on stored-bytes |
|---|
| Price | none stated |
|---|
| Identity | email (placeholder) not published |
|---|
| Egress | Free, anonymous for public projects. Verified a 321 MB anonymous download. |
|---|
| Per-object cap | not stated |
|---|
| Retention | Default expiry 30 days, but expire_in: never is a valid documented value and the latest-successful-job artifact on every ref is exempt from expiry entirely (30 days) |
|---|
| Interface | rest rest |
|---|
| Tooling | GET /projects/:id/jobs/artifacts/:ref/download?job=NAME, and GET /projects/:id/jobs/:job_id/artifacts (zip). No auth needed against a public project. Upload is automatic from .gitlab-ci.yml artifacts:. |
|---|
| Composes with | Unlimited jobs per project x 1 GB per artifact archive, uncounted against quota. Force permanence with expire_in: never or the 'Keep' button. Because 'artifacts from the latest pipeline for the ref' never expire regardless of expire_in, every branch/tag becomes a permanent shelf: unlimited branches x 1 GB. |
|---|
| Reliability | Expiry is enforced hourly and irreversible — anything not pinned with never/Keep silently vanishes. Treat as durable only when pinned. |
|---|
Evidence 3
Unknown values 4
$.binding_note boilerplate$.per_object_cap.notes the field may be stated in a source that was not read$.per_object_cap.stated the field may be stated in a source that was not read$.retention.notes the field may be stated in a source that was not read