diff --git a/doc/api/pipelines.md b/doc/api/pipelines.md
index 7d433923865dfb3fccabd683a1069995ee0d77d5..4b361da6070c605b2964ad5835641cdf64507d37 100644
--- a/doc/api/pipelines.md
+++ b/doc/api/pipelines.md
@@ -207,6 +207,59 @@ Sample response:
 }
 ```
 
+### Get a pipeline's test report summary
+
+> Introduced in [GitLab 14.2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65471)
+
+NOTE:
+This API route is part of the [Unit test report](../ci/unit_test_reports.md) feature.
+
+```plaintext
+GET /projects/:id/pipelines/:pipeline_id/test_report_summary
+```
+
+| Attribute  | Type    | Required | Description         |
+|------------|---------|----------|---------------------|
+| `id`       | integer/string | yes      | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
+| `pipeline_id` | integer | yes      | The ID of a pipeline   |
+
+Sample request:
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/pipelines/46/test_report_summary"
+```
+
+Sample response:
+
+```json
+{
+    "total": {
+        "time": 1904,
+        "count": 3363,
+        "success": 3351,
+        "failed": 0,
+        "skipped": 12,
+        "error": 0,
+        "suite_error": null
+    },
+    "test_suites": [
+        {
+            "name": "test",
+            "total_time": 1904,
+            "total_count": 3363,
+            "success_count": 3351,
+            "failed_count": 0,
+            "skipped_count": 12,
+            "error_count": 0,
+            "build_ids": [
+                66004
+            ],
+            "suite_error": null
+        }
+    ]
+}
+```
+
 ## Create a new pipeline
 
 ```plaintext
diff --git a/lib/api/ci/pipelines.rb b/lib/api/ci/pipelines.rb
index 19222ef200bf7f32c6a30a434c50232d9400f92e..78264b9fedbdfa06e364fecebc9d5009e3b0786b 100644
--- a/lib/api/ci/pipelines.rb
+++ b/lib/api/ci/pipelines.rb
@@ -187,6 +187,19 @@ class Pipelines < ::API::Base
           present pipeline.test_reports, with: TestReportEntity, details: true
         end
 
+        desc 'Gets the test report summary for a given pipeline' do
+          detail 'This feature was introduced in GitLab 14.2'
+          success TestReportSummaryEntity
+        end
+        params do
+          requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
+        end
+        get ':id/pipelines/:pipeline_id/test_report_summary' do
+          authorize! :read_build, pipeline
+
+          present pipeline.test_report_summary, with: TestReportSummaryEntity
+        end
+
         desc 'Deletes a pipeline' do
           detail 'This feature was introduced in GitLab 11.6'
           http_codes [[204, 'Pipeline was deleted'], [403, 'Forbidden']]
diff --git a/spec/requests/api/ci/pipelines_spec.rb b/spec/requests/api/ci/pipelines_spec.rb
index eb6c08618443f8c13450968351dfe528e41b1127..6c0a1b2502f155a8364b974478f893bb853ac524 100644
--- a/spec/requests/api/ci/pipelines_spec.rb
+++ b/spec/requests/api/ci/pipelines_spec.rb
@@ -1150,4 +1150,43 @@ def expect_variables(variables, expected_variables)
       end
     end
   end
+
+  describe 'GET /projects/:id/pipelines/:pipeline_id/test_report_summary' do
+    subject { get api("/projects/#{project.id}/pipelines/#{pipeline.id}/test_report_summary", current_user) }
+
+    context 'authorized user' do
+      let(:current_user) { user }
+
+      let(:pipeline) { create(:ci_pipeline, project: project) }
+
+      context 'when pipeline does not have a test report summary' do
+        it 'returns an empty test report summary' do
+          subject
+
+          expect(response).to have_gitlab_http_status(:ok)
+          expect(json_response['total']['count']).to eq(0)
+        end
+      end
+
+      context 'when pipeline has a test report summary' do
+        let(:pipeline) { create(:ci_pipeline, :with_report_results, project: project) }
+
+        it 'returns the test report summary' do
+          subject
+
+          expect(response).to have_gitlab_http_status(:ok)
+          expect(json_response['total']['count']).to eq(2)
+        end
+      end
+    end
+
+    context 'unauthorized user' do
+      it 'does not return project pipelines' do
+        get api("/projects/#{project.id}/pipelines/#{pipeline.id}/test_report_summary", non_member)
+
+        expect(response).to have_gitlab_http_status(:not_found)
+        expect(json_response['message']).to eq '404 Project Not Found'
+      end
+    end
+  end
 end