Job Artifacts API

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

Use the job artifacts API to download or delete job artifacts.

Authentication with a CI/CD job token available in the Premium and Ultimate tier.

Get job artifacts

History

Get the job’s artifacts zipped archive of a project.

If you use cURL to download artifacts from GitLab.com, use the --location parameter as the request might redirect through a CDN.

GET /projects/:id/jobs/:job_id/artifacts
Attribute Type Required Description
id integer/string Yes ID or URL-encoded path of the project.
job_id integer Yes ID of a job.
job_token string No To be used with triggers for multi-project pipelines. It should be invoked only in a CI/CD job defined in the .gitlab-ci.yml file. The value is always $CI_JOB_TOKEN. The job associated with the $CI_JOB_TOKEN must be running when this token is used. Premium and Ultimate only.

Example request using the PRIVATE-TOKEN header:

curl --location --output artifacts.zip --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/42/artifacts"

In the Premium and Ultimate tier you can authenticate with this endpoint in a CI/CD job by using a CI/CD job token.

Use either:

  • The job_token attribute with the GitLab-provided CI_JOB_TOKEN predefined variable. For example, the following job downloads the artifacts of the job with ID 42:

    artifact_download:
      stage: test
      script:
        - 'curl --location --output artifacts.zip "https://gitlab.example.com/api/v4/projects/1/jobs/42/artifacts?job_token=$CI_JOB_TOKEN"'
    
  • The JOB-TOKEN header with the GitLab-provided CI_JOB_TOKEN predefined variable. For example, the following job downloads the artifacts of the job with ID 42. The command is wrapped in single quotes because it contains a colon (:):

    artifact_download:
      stage: test
      script:
        - 'curl --location --output artifacts.zip --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://gitlab.example.com/api/v4/projects/1/jobs/42/artifacts"'
    

Possible response status codes:

Status Description
200 Serves the artifacts file.
404 Build not found, no artifacts, or all artifacts are reports.

Download the artifacts archive

History

Download the artifacts zipped archive from the latest successful pipeline for the given reference name and job, provided the job finished successfully. This is the same as getting the job’s artifacts, but by defining the job’s name instead of its ID.

To determine which pipeline is the latest successful pipeline, GitLab checks the creation time of the successful pipelines. The start or end time of individual jobs does not affect which pipeline is the latest.

If you use cURL to download artifacts from GitLab.com, use the --location parameter as the request might redirect through a CDN.

note
If a pipeline is parent of other child pipelines, artifacts are searched in hierarchical order from parent to child. For example, if both parent and child pipelines have a job with the same name, the artifact from the parent pipeline is returned.
GET /projects/:id/jobs/artifacts/:ref_name/download?job=name

Parameters

Attribute Type Required Description
id integer/string Yes ID or URL-encoded path of the project.
job string Yes The name of the job.
ref_name string Yes Branch or tag name in repository. HEAD or SHA references are not supported.
job_token string No To be used with triggers for multi-project pipelines. It should be invoked only in a CI/CD job defined in the .gitlab-ci.yml file. The value is always $CI_JOB_TOKEN. The job associated with the $CI_JOB_TOKEN must be running when this token is used. Premium and Ultimate only.

Example request using the PRIVATE-TOKEN header:

curl --location --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/artifacts/main/download?job=test"

In the Premium and Ultimate tier you can authenticate with this endpoint in a CI/CD job by using a CI/CD job token.

Use either:

  • The job_token attribute with the GitLab-provided CI_JOB_TOKEN predefined variable. For example, the following job downloads the artifacts of the test job of the main branch:

    artifact_download:
      stage: test
      script:
        - 'curl --location --output artifacts.zip "https://gitlab.example.com/api/v4/projects/$CI_PROJECT_ID/jobs/artifacts/main/download?job=test&job_token=$CI_JOB_TOKEN"'
    
  • The JOB-TOKEN header with the GitLab-provided CI_JOB_TOKEN predefined variable. For example, the following job downloads the artifacts of the test job of the main branch. The command is wrapped in single quotes because it contains a colon (:):

    artifact_download:
      stage: test
      script:
        - 'curl --location --output artifacts.zip --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://gitlab.example.com/api/v4/projects/$CI_PROJECT_ID/jobs/artifacts/main/download?job=test"'
    

Possible response status codes:

Status Description
200 Serves the artifacts file.
404 Build not found, no artifacts, or all artifacts are reports.

Download a single artifact file by job ID

Download a single artifact file from a job with a specified ID from inside the job’s artifacts zipped archive. The file is extracted from the archive and streamed to the client.

If you use cURL to download artifacts from GitLab.com, use the --location parameter as the request might redirect through a CDN.

GET /projects/:id/jobs/:job_id/artifacts/*artifact_path

Parameters

Attribute Type Required Description
artifact_path string Yes Path to a file inside the artifacts archive.
id integer/string Yes ID or URL-encoded path of the project.
job_id integer Yes The unique job identifier.
job_token string No To be used with triggers for multi-project pipelines. It should be invoked only in a CI/CD job defined in the .gitlab-ci.yml file. The value is always $CI_JOB_TOKEN. The job associated with the $CI_JOB_TOKEN must be running when this token is used. Premium and Ultimate only.

Example request:

curl --location --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/5/artifacts/some/release/file.pdf"

In the Premium and Ultimate tier you can authenticate with this endpoint in a CI/CD job by using a CI/CD job token.

Possible response status codes:

Status Description
200 Sends a single artifact file.
400 Invalid path provided.
404 Build not found, no artifacts, or all artifacts are reports.

Download a single artifact file from specific tag or branch

Download a single artifact file for a specific job of the latest successful pipeline for the given reference name from inside the job’s artifacts archive. The file is extracted from the archive and streamed to the client, with the plain/text content type.

The artifact file provides more detail than what is available in the CSV export.

Artifacts for parent and child pipelines are searched in hierarchical order from parent to child. For example, if both parent and child pipelines have a job with the same name, the artifact from the parent pipeline is returned.

If you use cURL to download artifacts from GitLab.com, use the --location parameter as the request might redirect through a CDN.

GET /projects/:id/jobs/artifacts/:ref_name/raw/*artifact_path?job=name

Parameters:

Attribute Type Required Description
artifact_path string Yes Path to a file inside the artifacts archive.
id integer/string Yes ID or URL-encoded path of the project.
job string Yes The name of the job.
ref_name string Yes Branch or tag name in repository. HEAD or SHA references are not supported.
job_token string No To be used with triggers for multi-project pipelines. It should be invoked only in a CI/CD job defined in the .gitlab-ci.yml file. The value is always $CI_JOB_TOKEN. The job associated with the $CI_JOB_TOKEN must be running when this token is used. Premium and Ultimate only.

Example request:

curl --location --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/artifacts/main/raw/some/release/file.pdf?job=pdf"

In the Premium and Ultimate tier you can authenticate with this endpoint in a CI/CD job by using a CI/CD job token.

Possible response status codes:

Status Description
200 Sends a single artifact file.
400 Invalid path provided.
404 Build not found, no artifacts, or all artifacts are reports.

Keep artifacts

Prevents artifacts from being deleted when expiration is set.

POST /projects/:id/jobs/:job_id/artifacts/keep

Parameters

Attribute Type Required Description
id integer/string Yes ID or URL-encoded path of the project.
job_id integer Yes ID of a job.

Example request:

curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/1/artifacts/keep"

Example response:

{
  "commit": {
    "author_email": "admin@example.com",
    "author_name": "Administrator",
    "created_at": "2015-12-24T16:51:14.000+01:00",
    "id": "0ff3ae198f8601a285adcf5c0fff204ee6fba5fd",
    "message": "Test the CI integration.",
    "short_id": "0ff3ae19",
    "title": "Test the CI integration."
  },
  "coverage": null,
  "allow_failure": false,
  "download_url": null,
  "id": 42,
  "name": "rubocop",
  "ref": "main",
  "artifacts": [],
  "runner": null,
  "stage": "test",
  "created_at": "2016-01-11T10:13:33.506Z",
  "started_at": "2016-01-11T10:13:33.506Z",
  "finished_at": "2016-01-11T10:15:10.506Z",
  "duration": 97.0,
  "status": "failed",
  "failure_reason": "script_failure",
  "tag": false,
  "web_url": "https://example.com/foo/bar/-/jobs/42",
  "user": null
}

Delete job artifacts

Delete artifacts of a job.

Prerequisites:

  • You must have at least the maintainer role for the project.
DELETE /projects/:id/jobs/:job_id/artifacts
Attribute Type Required Description
id integer/string Yes ID or URL-encoded path of the project.
job_id integer Yes ID of a job.

Example request:

curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/1/artifacts"
note
At least Maintainer role is required to delete artifacts.

If the artifacts were deleted successfully, a response with status 204 No Content is returned.

Delete project artifacts

Delete artifacts eligible for deletion in a project. By default, artifacts from the most recent successful pipeline of each ref are not deleted.

Requests to this endpoint set the expiry of all artifacts that can be deleted to the current time. The files are then deleted from the system as part of the regular cleanup of expired job artifacts. Job logs are never deleted.

The regular cleanup occurs asynchronously on a schedule, so there might be a short delay before artifacts are deleted.

Prerequisites:

  • You must have at least the Maintainer role for the project.
DELETE /projects/:id/artifacts
Attribute Type Required Description
id integer/string Yes ID or URL-encoded path of the project.

Example request:

curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/artifacts"

A response with status 202 Accepted is returned.

Troubleshooting

Downloading artifacts:reports files

You might get a 404 Not Found error when trying to download reports using the job artifacts API.

This issue occurs because reports are not downloadable by default.

To make reports downloadable, add their filenames or gl-*-report.json to artifacts:paths.