diff --git a/doc/development/testing_guide/end_to_end/rspec_metadata_tests.md b/doc/development/testing_guide/end_to_end/rspec_metadata_tests.md
index f13686981a99013e77acaf93325bbf855eac402b..93adc492d5aabd0099c53ad463c993e92f2bae87 100644
--- a/doc/development/testing_guide/end_to_end/rspec_metadata_tests.md
+++ b/doc/development/testing_guide/end_to_end/rspec_metadata_tests.md
@@ -15,6 +15,7 @@ This is a partial list of the [RSpec metadata](https://rspec.info/features/3-12/
 |-----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
 | `:elasticsearch`            | The test requires an Elasticsearch service. It is used by the [instance-level scenario](https://gitlab.com/gitlab-org/gitlab-qa#definitions) [`Test::Integration::Elasticsearch`](https://gitlab.com/gitlab-org/gitlab/-/blob/72b62b51bdf513e2936301cb6c7c91ec27c35b4d/qa/qa/ee/scenario/test/integration/elasticsearch.rb) to include only tests that require Elasticsearch.                                                                                                                                |
 | `:except`                   | The test is to be run in their typical execution contexts _except_ as specified. See [test execution context selection](execution_context_selection.md) for more information.                                                                                                                                                                                                                                                                                                                                |
+| `:external_api_calls`                   | The test requires interaction with a network external to the Docker network                                                                                                                                                                                                                                                                               |
 | `:feature_flag`             | The test uses a feature flag and therefore requires an administrator account to run. When `scope` is set to `:global`, the test will be skipped on all live .com environments. Otherwise, it will be skipped only on Canary, Production, and Pre-production. See [testing with feature flags](../../../development/testing_guide/end_to_end/feature_flags.md) for more details.                                                                                                                              |
 | `:framework`                | The test makes sanity assertions around the QA framework itself                                                                                                                                                                                                                                                                                                                                                                                                                                              |
 | `:geo`                      | The test requires two GitLab Geo instances - a primary and a secondary - to be spun up.                                                                                                                                                                                                                                                                                                                                                                                                                      |
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb
index cd58b0777cb230141e3e79e86ec1ac3487023976..0f1a79425c3696edb5d96306f38f1b844b7ae6bd 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb
@@ -2,7 +2,7 @@
 
 module QA
   RSpec.describe 'Package', :object_storage, product_group: :package_registry do
-    describe 'Composer Repository' do
+    describe 'Composer Repository', :external_api_calls do
       include Runtime::Fixtures
 
       let(:project) do
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb
index 46d4a91d32ca907eedeae7c5d486dffe4afa1365..18fe0bcff93929941514a3ea07e47e85155ac24f 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb
@@ -1,8 +1,8 @@
 # frozen_string_literal: true
 
 module QA
-  RSpec.describe 'Package', :object_storage, product_group: :package_registry, quarantine: {
-    only: { job: %w[object_storage airgapped], condition: -> { QA::Support::FIPS.enabled? } },
+  RSpec.describe 'Package', :object_storage, :external_api_calls, product_group: :package_registry, quarantine: {
+    only: { job: 'object_storage', condition: -> { QA::Support::FIPS.enabled? } },
     issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/417584',
     type: :bug
   } do
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb
index 7bdaba792149cb6093642c9c7730cdf129b9d6b7..8592077cada2ecdf673af304417c067f4b739a25 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb
@@ -2,7 +2,7 @@
 
 module QA
   RSpec.describe 'Package', :object_storage, product_group: :package_registry do
-    describe 'Generic Repository', except: { job: 'airgapped' } do
+    describe 'Generic Repository', :external_api_calls do
       include Runtime::Fixtures
 
       let(:project) do
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb
index c82b276e83659ca5ac900e4d384ab45e5594a179..42635a9e59f5dfe035f65944b67541139b27e8e1 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb
@@ -2,7 +2,7 @@
 
 module QA
   RSpec.describe 'Package', :object_storage, product_group: :package_registry do
-    describe 'Helm Registry', except: { job: 'airgapped' } do
+    describe 'Helm Registry', :external_api_calls do
       using RSpec::Parameterized::TableSyntax
       include Runtime::Fixtures
       include Support::Helpers::MaskToken
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb
index 490d0117a0b74b51ea65bc0b5f7f2c34895dad58..3cbc78ab806ee3cb60172e98daad2a18a2a0138c 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb
@@ -2,7 +2,7 @@
 
 module QA
   RSpec.describe 'Package', :object_storage, product_group: :package_registry do
-    describe 'Maven group level endpoint', except: { job: 'airgapped' } do
+    describe 'Maven group level endpoint', :external_api_calls do
       include Runtime::Fixtures
       include Support::Helpers::MaskToken
       include_context 'packages registry qa scenario'
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb
index bf2bc13869da08edc3ea3caa24b8877c8ddf07e1..be64ddd6c0dcb99be8b5553d9ab4ac9d0fa2d7a9 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 module QA
-  RSpec.describe 'Package', :object_storage, except: { job: 'airgapped' } do
+  RSpec.describe 'Package', :object_storage, :external_api_calls do
     describe 'Maven project level endpoint', product_group: :package_registry do
       include Runtime::Fixtures
       include Support::Helpers::MaskToken
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb
index 9da56f1d640d8349cfdcdc79be24ee93831205ef..a3ca91d13f4eacc4235b8f9bd1fdbbf193b2bfc2 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 module QA
-  RSpec.describe 'Package', :object_storage,
+  RSpec.describe 'Package', :object_storage, :external_api_calls,
     quarantine: {
       only: { condition: -> { QA::Support::FIPS.enabled? } },
       issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/417600',
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_group_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_group_level_spec.rb
index b245d162da90f2b9c8fe3a117e095297f920aa21..edae42ed0e86913735e3b3016d61e1aea4e2481d 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_group_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_group_level_spec.rb
@@ -2,7 +2,8 @@
 
 module QA
   RSpec.describe 'Package' do
-    describe 'npm Registry group level endpoint', :object_storage, product_group: :package_registry do
+    describe 'npm Registry group level endpoint', :object_storage, :external_api_calls,
+      product_group: :package_registry do
       using RSpec::Parameterized::TableSyntax
       include Runtime::Fixtures
       include Support::Helpers::MaskToken
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb
index 961953220e3afac80d2bded100133d535aba749a..9514de3f6e24717c39b2448b9834cd1ce75fd2af 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb
@@ -2,7 +2,8 @@
 
 module QA
   RSpec.describe 'Package' do
-    describe 'npm Registry instance level endpoint', :object_storage, product_group: :package_registry do
+    describe 'npm Registry instance level endpoint', :object_storage, :external_api_calls,
+      product_group: :package_registry do
       using RSpec::Parameterized::TableSyntax
       include Runtime::Fixtures
       include Support::Helpers::MaskToken
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb
index f44e3d4da966044fe1d05fbc338c2ddbcc4eb19c..278d67048e428318e3e1db3e4c4be70a596f2826 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb
@@ -2,7 +2,8 @@
 
 module QA
   RSpec.describe 'Package' do
-    describe 'npm Registry project level endpoint', :object_storage, product_group: :package_registry do
+    describe 'npm Registry project level endpoint', :object_storage, :external_api_calls,
+      product_group: :package_registry do
       using RSpec::Parameterized::TableSyntax
       include Runtime::Fixtures
       include Support::Helpers::MaskToken
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb
index 5703a32be8dec583635706850436a75557861a14..eb41e1139600160e048db29a7fd35c35aa9c458c 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb
@@ -2,7 +2,7 @@
 
 module QA
   RSpec.describe 'Package', :object_storage, product_group: :package_registry do
-    describe 'NuGet group level endpoint' do
+    describe 'NuGet group level endpoint', :external_api_calls do
       using RSpec::Parameterized::TableSyntax
       include Runtime::Fixtures
       include Support::Helpers::MaskToken
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb
index d58a232ec58ddcff563fcf3738bdcfca9bf91fe6..4b4e8cb10974f5a505045ab25e22e5ee7077ffcc 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb
@@ -2,7 +2,7 @@
 
 module QA
   RSpec.describe 'Package', :object_storage, product_group: :package_registry do
-    describe 'NuGet project level endpoint' do
+    describe 'NuGet project level endpoint', :external_api_calls do
       include Support::Helpers::MaskToken
 
       let(:project) do
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb
index 024e59ae9123c5e0951902e913f8087dc34e1185..c52912299be7f7c3e92d7feb8b6e48a915f251ba 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb
@@ -2,7 +2,7 @@
 
 module QA
   RSpec.describe 'Package', :object_storage, product_group: :package_registry do
-    describe 'PyPI Repository', except: { job: 'airgapped' } do
+    describe 'PyPI Repository', :external_api_calls do
       include Runtime::Fixtures
       include Support::Helpers::MaskToken
 
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb
index d539e1f75de50f9f276cf0dfcb9e49c729760bc9..124129761ebda1d92071083483bbc275fc2c5169 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 module QA
-  RSpec.describe 'Package', :object_storage,
+  RSpec.describe 'Package', :object_storage, :external_api_calls,
     feature_flag: { name: 'rubygem_packages', scope: :project } do
     describe 'RubyGems Repository', product_group: :package_registry do
       include Runtime::Fixtures