Job Artifacts API

  • Tier: Free, Premium, Ultimate
  • Offering: GitLab.com, GitLab 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 a zipped archive of a job’s artifacts from a project.

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

Copy to clipboard
GET /projects/:id/jobs/:job_id/artifacts
AttributeTypeRequiredDescription
idinteger/stringYesID or URL-encoded path of the project.
job_idintegerYesID of a job.
job_tokenstringNoTo 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:

Copy to clipboard
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:

    Copy to clipboard
    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 (:):

    Copy to clipboard
    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:

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

Download the artifacts archive

History

Download a zipped archive of a job’s artifacts in the latest successful pipeline using the reference name. This endpoint is the same as getting the job’s artifacts, but uses the job’s name instead of its ID.

The latest successful pipeline is determined based on creation time. The start or end time of individual jobs does not affect which pipeline is the latest.

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

Prerequisites:

  • You must have a completed pipeline with a success status.
  • If the pipeline includes manual jobs, they must either:
    • Complete successfully.
    • Have allow_failure: true set.

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

Copy to clipboard
GET /projects/:id/jobs/artifacts/:ref_name/download?job=name

Parameters

AttributeTypeRequiredDescription
idinteger/stringYesID or URL-encoded path of the project.
jobstringYesThe name of the job.
ref_namestringYesBranch or tag name in repository. HEAD or SHA references are not supported.
job_tokenstringNoTo 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:

Copy to clipboard
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:

    Copy to clipboard
    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 (:):

    Copy to clipboard
    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:

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

Download a single artifact file by job ID

Download a single file from a job’s zipped artifacts using the job ID. 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.

Copy to clipboard
GET /projects/:id/jobs/:job_id/artifacts/*artifact_path

Parameters

AttributeTypeRequiredDescription
artifact_pathstringYesPath to a file inside the artifacts archive.
idinteger/stringYesID or URL-encoded path of the project.
job_idintegerYesThe unique job identifier.
job_tokenstringNoTo 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:

Copy to clipboard
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:

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

Download a single artifact file from specific tag or branch

Download a single file from a job’s artifacts in the latest successful pipeline using the reference name. The file is extracted from the archive and streamed to the client with the plain/text content type.

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

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

Prerequisites:

  • You must have a completed pipeline with a success status.
  • If the pipeline includes manual jobs, they must either:
    • Complete successfully.
    • Have allow_failure: true set.

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

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

Parameters:

AttributeTypeRequiredDescription
artifact_pathstringYesPath to a file inside the artifacts archive.
idinteger/stringYesID or URL-encoded path of the project.
jobstringYesThe name of the job.
ref_namestringYesBranch or tag name in repository. HEAD or SHA references are not supported.
job_tokenstringNoTo 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:

Copy to clipboard
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:

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

Keep artifacts

Prevents artifacts from being deleted when expiration is set.

Copy to clipboard
POST /projects/:id/jobs/:job_id/artifacts/keep

Parameters

AttributeTypeRequiredDescription
idinteger/stringYesID or URL-encoded path of the project.
job_idintegerYesID of a job.

Example request:

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

Example response:

Copy to clipboard
{
  "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.
Copy to clipboard
DELETE /projects/:id/jobs/:job_id/artifacts
AttributeTypeRequiredDescription
idinteger/stringYesID or URL-encoded path of the project.
job_idintegerYesID of a job.

Example request:

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

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 all job artifacts in a project

Delete all job 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 job 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.
Copy to clipboard
DELETE /projects/:id/artifacts
AttributeTypeRequiredDescription
idinteger/stringYesID or URL-encoded path of the project.

Example request:

Copy to clipboard
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.