diff --git a/app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs.query.graphql b/app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs.query.graphql
index 98b51e8c2c4065d87205403837c7ba1110b71ecf..851be211b255ead3bf4c82739894271051271de5 100644
--- a/app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs.query.graphql
+++ b/app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs.query.graphql
@@ -11,6 +11,7 @@ query getJobs($fullPath: ID!, $after: String, $first: Int = 30, $statuses: [CiJo
       }
       nodes {
         artifacts {
+          # eslint-disable-next-line @graphql-eslint/require-id-when-available
           nodes {
             downloadPath
             fileType
diff --git a/app/assets/javascripts/pipelines/graphql/queries/get_pipeline_jobs.query.graphql b/app/assets/javascripts/pipelines/graphql/queries/get_pipeline_jobs.query.graphql
index 641ec7a3cf6a3cf559ac905bfa99d9cf9260998b..b0f875160d48363a858d905eca183c53f718f02a 100644
--- a/app/assets/javascripts/pipelines/graphql/queries/get_pipeline_jobs.query.graphql
+++ b/app/assets/javascripts/pipelines/graphql/queries/get_pipeline_jobs.query.graphql
@@ -11,6 +11,7 @@ query getPipelineJobs($fullPath: ID!, $iid: ID!, $after: String) {
         }
         nodes {
           artifacts {
+            # eslint-disable-next-line @graphql-eslint/require-id-when-available
             nodes {
               downloadPath
               fileType
diff --git a/app/assets/javascripts/vue_shared/security_reports/graphql/queries/security_report_merge_request_download_paths.query.graphql b/app/assets/javascripts/vue_shared/security_reports/graphql/queries/security_report_merge_request_download_paths.query.graphql
index 2e80db30e9a4098193a22d50f168735b6ebdf2be..6a83669d20641a682213796373590a3a71536a9e 100644
--- a/app/assets/javascripts/vue_shared/security_reports/graphql/queries/security_report_merge_request_download_paths.query.graphql
+++ b/app/assets/javascripts/vue_shared/security_reports/graphql/queries/security_report_merge_request_download_paths.query.graphql
@@ -14,6 +14,7 @@ query securityReportDownloadPaths(
             id
             name
             artifacts {
+              # eslint-disable-next-line @graphql-eslint/require-id-when-available
               nodes {
                 downloadPath
                 fileType
diff --git a/app/assets/javascripts/vue_shared/security_reports/graphql/queries/security_report_pipeline_download_paths.query.graphql b/app/assets/javascripts/vue_shared/security_reports/graphql/queries/security_report_pipeline_download_paths.query.graphql
index e4f0c392b9158eb5bea0380a690c9bf37cd7bb5d..1f1e56a5876607c0ae3806660ca9884196967c02 100644
--- a/app/assets/javascripts/vue_shared/security_reports/graphql/queries/security_report_pipeline_download_paths.query.graphql
+++ b/app/assets/javascripts/vue_shared/security_reports/graphql/queries/security_report_pipeline_download_paths.query.graphql
@@ -4,6 +4,7 @@ query getPipelineCorpuses($projectPath: ID!, $iid: ID, $reportTypes: [SecurityRe
   project(fullPath: $projectPath) {
     id
     pipeline(iid: $iid) {
+      # eslint-disable-next-line @graphql-eslint/require-id-when-available
       ...JobArtifacts
     }
   }
diff --git a/app/graphql/types/ci/job_artifact_type.rb b/app/graphql/types/ci/job_artifact_type.rb
index a6ab445702ced061ffc758e70a99efcb6e0c45d8..6346d50de3a9c3b5639bc7d2a2780451c9bfab75 100644
--- a/app/graphql/types/ci/job_artifact_type.rb
+++ b/app/graphql/types/ci/job_artifact_type.rb
@@ -6,6 +6,9 @@ module Ci
     class JobArtifactType < BaseObject
       graphql_name 'CiJobArtifact'
 
+      field :id, Types::GlobalIDType[::Ci::JobArtifact], null: false,
+                                                         description: 'ID of the artifact.'
+
       field :download_path, GraphQL::Types::String, null: true,
                                                     description: "URL for downloading the artifact's file."
 
@@ -16,6 +19,12 @@ class JobArtifactType < BaseObject
                                            description: 'File name of the artifact.',
                                            method: :filename
 
+      field :size, GraphQL::Types::Int, null: false,
+                                        description: 'Size of the artifact in bytes.'
+
+      field :expire_at, Types::TimeType, null: true,
+                                         description: 'Expiry date of the artifact.'
+
       def download_path
         ::Gitlab::Routing.url_helpers.download_project_job_artifacts_path(
           object.project,
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index eecdcf8b69ab5153a1e844f495631e003e18126f..bcffccf7140e6ce13eca3a145c232788cadf90c9 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -10288,8 +10288,11 @@ CI/CD variables for a GitLab instance.
 | Name | Type | Description |
 | ---- | ---- | ----------- |
 | <a id="cijobartifactdownloadpath"></a>`downloadPath` | [`String`](#string) | URL for downloading the artifact's file. |
+| <a id="cijobartifactexpireat"></a>`expireAt` | [`Time`](#time) | Expiry date of the artifact. |
 | <a id="cijobartifactfiletype"></a>`fileType` | [`JobArtifactFileType`](#jobartifactfiletype) | File type of the artifact. |
+| <a id="cijobartifactid"></a>`id` | [`CiJobArtifactID!`](#cijobartifactid) | ID of the artifact. |
 | <a id="cijobartifactname"></a>`name` | [`String`](#string) | File name of the artifact. |
+| <a id="cijobartifactsize"></a>`size` | [`Int!`](#int) | Size of the artifact in bytes. |
 
 ### `CiJobTokenScopeType`
 
diff --git a/ee/app/assets/javascripts/security_dashboard/graphql/queries/pipeline_security_report_summary.query.graphql b/ee/app/assets/javascripts/security_dashboard/graphql/queries/pipeline_security_report_summary.query.graphql
index 3a03c1efeef3e7df42f71f89f3a37badcfc92693..bd0cf43dfa1c7c298de7688f26e54000c6bf812d 100644
--- a/ee/app/assets/javascripts/security_dashboard/graphql/queries/pipeline_security_report_summary.query.graphql
+++ b/ee/app/assets/javascripts/security_dashboard/graphql/queries/pipeline_security_report_summary.query.graphql
@@ -10,6 +10,7 @@ query pipelineSecuritySummary(
     id
     pipeline(iid: $pipelineIid) {
       id
+      # eslint-disable-next-line @graphql-eslint/require-id-when-available
       ...JobArtifacts
       securityReportSummary {
         dast {
diff --git a/spec/graphql/types/ci/job_artifact_type_spec.rb b/spec/graphql/types/ci/job_artifact_type_spec.rb
index 58b5f9cfcb7d1f61460584d1f279bc980c5d2b3f..3e054faf0c9b2b751d87b1f807f1bd3ba7f4aa4b 100644
--- a/spec/graphql/types/ci/job_artifact_type_spec.rb
+++ b/spec/graphql/types/ci/job_artifact_type_spec.rb
@@ -4,7 +4,7 @@
 
 RSpec.describe GitlabSchema.types['CiJobArtifact'] do
   it 'has the correct fields' do
-    expected_fields = [:download_path, :file_type, :name]
+    expected_fields = [:id, :download_path, :file_type, :name, :size, :expire_at]
 
     expect(described_class).to have_graphql_fields(*expected_fields)
   end