diff --git a/changelogs/unreleased/326106-correlation-id-to-validation-service.yml b/changelogs/unreleased/326106-correlation-id-to-validation-service.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0ab0347ee3a75576c30dcfe61bceee12a49bf9ea
--- /dev/null
+++ b/changelogs/unreleased/326106-correlation-id-to-validation-service.yml
@@ -0,0 +1,5 @@
+---
+title: Add correlation id in X-Request-ID for external pipeline validation
+merge_request: 58741
+author:
+type: other
diff --git a/lib/gitlab/ci/pipeline/chain/validate/external.rb b/lib/gitlab/ci/pipeline/chain/validate/external.rb
index 0212a8fcc6f204ec8a89aee71f76737a3a0cbc3d..9d1aeb75ccc747a51007b92eefb13f4e98931ddd 100644
--- a/lib/gitlab/ci/pipeline/chain/validate/external.rb
+++ b/lib/gitlab/ci/pipeline/chain/validate/external.rb
@@ -69,8 +69,10 @@ def rejected_status
             end
 
             def validate_service_request
-              headers = {}
-              headers['X-Gitlab-Token'] = validation_service_token if validation_service_token
+              headers = {
+                'X-Request-ID' => Labkit::Correlation::CorrelationId.current_id,
+                'X-Gitlab-Token' => validation_service_token
+              }.compact
 
               Gitlab::HTTP.post(
                 validation_service_url, timeout: validation_service_timeout,
diff --git a/spec/lib/gitlab/ci/pipeline/chain/validate/external_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/validate/external_spec.rb
index 1fd40b454ff375e7b85733729c58690416a74dcb..980efed3c04f48fc4096cac092e46dffe8d0ea36 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/validate/external_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/validate/external_spec.rb
@@ -57,13 +57,14 @@
     before do
       stub_env('EXTERNAL_VALIDATION_SERVICE_URL', validation_service_url)
       allow(Gitlab).to receive(:com?).and_return(dot_com)
+      allow(Labkit::Correlation::CorrelationId).to receive(:current_id).and_return('correlation-id')
     end
 
     it 'respects the defined payload schema' do
       expect(::Gitlab::HTTP).to receive(:post) do |_url, params|
         expect(params[:body]).to match_schema('/external_validation')
         expect(params[:timeout]).to eq(described_class::DEFAULT_VALIDATION_REQUEST_TIMEOUT)
-        expect(params[:headers]).to eq({})
+        expect(params[:headers]).to eq({ 'X-Request-ID' => 'correlation-id' })
       end
 
       perform!
@@ -127,7 +128,7 @@
 
       it 'passes token in X-Gitlab-Token header' do
         expect(::Gitlab::HTTP).to receive(:post) do |_url, params|
-          expect(params[:headers]).to eq({ 'X-Gitlab-Token' => '123' })
+          expect(params[:headers]).to include({ 'X-Gitlab-Token' => '123' })
         end
 
         perform!