diff --git a/package-lock.json b/package-lock.json
index 61d9666048bda8b73f37b759297b0536427abdee..eeeb46ccf741cd9260f5b8b9ef095fe9330c8dbc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -53,7 +53,7 @@
         "semver": "~7.6.0",
         "simple-icons": "11.12.0",
         "smol-toml": "1.1.4",
-        "webextension-store-meta": "^1.1.0",
+        "webextension-store-meta": "^1.2.1",
         "xpath": "~0.0.34"
       },
       "devDependencies": {
@@ -20553,6 +20553,7 @@
       "version": "2.7.0",
       "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
       "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+      "dev": true,
       "dependencies": {
         "whatwg-url": "^5.0.0"
       },
@@ -27918,7 +27919,8 @@
     "node_modules/tr46": {
       "version": "0.0.3",
       "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+      "dev": true
     },
     "node_modules/tree-kill": {
       "version": "1.2.2",
@@ -28491,6 +28493,14 @@
       "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==",
       "dev": true
     },
+    "node_modules/undici": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/undici/-/undici-6.13.0.tgz",
+      "integrity": "sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==",
+      "engines": {
+        "node": ">=18.0"
+      }
+    },
     "node_modules/undici-types": {
       "version": "5.26.5",
       "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
@@ -29153,16 +29163,16 @@
       }
     },
     "node_modules/webextension-store-meta": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/webextension-store-meta/-/webextension-store-meta-1.1.0.tgz",
-      "integrity": "sha512-sEOe3Iir4PB6f/hj9fAAaesUpYLU4XIwySMdOap7JfIhL9O4fmaoTWWuj/TCzOa7UcH/6X8Mq2+HmlAAE7D0zg==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/webextension-store-meta/-/webextension-store-meta-1.2.1.tgz",
+      "integrity": "sha512-ZXeprdpOSb7CSuzfuoBquoWfAdKSB4PXcPTM3NyAJ69RbcIy6FBEENO9P7jhH4CGUwnORAp8ja6zfQxXBMbBzw==",
       "dependencies": {
         "domhandler": "^4.0.0",
         "htmlparser2": "^6.1.0",
-        "node-fetch": "^2.6.1"
+        "undici": "^6.11.1"
       },
       "engines": {
-        "node": ">=10.3.0"
+        "node": ">=18"
       }
     },
     "node_modules/webextension-store-meta/node_modules/dom-serializer": {
@@ -29234,7 +29244,8 @@
     "node_modules/webidl-conversions": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+      "dev": true
     },
     "node_modules/webpack": {
       "version": "5.90.3",
@@ -29675,6 +29686,7 @@
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
       "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+      "dev": true,
       "dependencies": {
         "tr46": "~0.0.3",
         "webidl-conversions": "^3.0.0"
diff --git a/package.json b/package.json
index b25c311d1081bb430053c3e2df1f8c3e530c5ea1..e7860dbf74ac6209289183099aba17a7ad312cdb 100644
--- a/package.json
+++ b/package.json
@@ -65,7 +65,7 @@
     "semver": "~7.6.0",
     "simple-icons": "11.12.0",
     "smol-toml": "1.1.4",
-    "webextension-store-meta": "^1.1.0",
+    "webextension-store-meta": "^1.2.1",
     "xpath": "~0.0.34"
   },
   "scripts": {
diff --git a/services/chrome-web-store/chrome-web-store-base.js b/services/chrome-web-store/chrome-web-store-base.js
index 77e917c2b71a4f9690e5f791053e2e04ad3cae6d..cd59da8a890bc14d51c8cf52c826cfd969af2cd6 100644
--- a/services/chrome-web-store/chrome-web-store-base.js
+++ b/services/chrome-web-store/chrome-web-store-base.js
@@ -1,4 +1,4 @@
-import ChromeWebStore from 'webextension-store-meta/lib/chrome-web-store/index.js'
+import { ChromeWebStore } from 'webextension-store-meta/lib/chrome-web-store/index.js'
 import checkErrorResponse from '../../core/base-service/check-error-response.js'
 import { BaseService, Inaccessible } from '../index.js'
 
diff --git a/services/chrome-web-store/chrome-web-store-rating.tester.js b/services/chrome-web-store/chrome-web-store-rating.tester.js
index 3d4f20c1d5f32020161e0cc14e30f875db28f3cc..27948c53d9c0a9bba26b81cab10ee2a1146e4ae6 100644
--- a/services/chrome-web-store/chrome-web-store-rating.tester.js
+++ b/services/chrome-web-store/chrome-web-store-rating.tester.js
@@ -1,4 +1,5 @@
 import Joi from 'joi'
+import { Agent, MockAgent, setGlobalDispatcher } from 'undici'
 import { isStarRating } from '../test-validators.js'
 import { ServiceTester } from '../tester.js'
 
@@ -39,7 +40,16 @@ t.create('Stars (not found)')
   .expectBadge({ label: 'rating', message: 'not found' })
 
 // Keep this "inaccessible" test, since this service does not use BaseService#_request.
+const mockAgent = new MockAgent()
 t.create('Rating (inaccessible)')
   .get('/rating/alhjnofcnnpeaphgeakdhkebafjcpeae.json')
-  .networkOff()
+  // webextension-store-meta uses undici internally, so we can't mock it with nock
+  .before(function () {
+    setGlobalDispatcher(mockAgent)
+    mockAgent.disableNetConnect()
+  })
+  .after(async function () {
+    await mockAgent.close()
+    setGlobalDispatcher(new Agent())
+  })
   .expectBadge({ label: 'rating', message: 'inaccessible' })
diff --git a/services/chrome-web-store/chrome-web-store-users.tester.js b/services/chrome-web-store/chrome-web-store-users.tester.js
index 54959019b45c017748d18db5100af75aa19cd50a..6b02b701d546868e04c4e0112a00f1655693eadf 100644
--- a/services/chrome-web-store/chrome-web-store-users.tester.js
+++ b/services/chrome-web-store/chrome-web-store-users.tester.js
@@ -1,3 +1,4 @@
+import { Agent, MockAgent, setGlobalDispatcher } from 'undici'
 import { isMetric } from '../test-validators.js'
 import { ServiceTester } from '../tester.js'
 
@@ -22,7 +23,16 @@ t.create('Users (not found)')
   .expectBadge({ label: 'users', message: 'not found' })
 
 // Keep this "inaccessible" test, since this service does not use BaseService#_request.
+const mockAgent = new MockAgent()
 t.create('Users (inaccessible)')
   .get('/users/alhjnofcnnpeaphgeakdhkebafjcpeae.json')
-  .networkOff()
+  // webextension-store-meta uses undici internally, so we can't mock it with nock
+  .before(function () {
+    setGlobalDispatcher(mockAgent)
+    mockAgent.disableNetConnect()
+  })
+  .after(async function () {
+    await mockAgent.close()
+    setGlobalDispatcher(new Agent())
+  })
   .expectBadge({ label: 'users', message: 'inaccessible' })
diff --git a/services/chrome-web-store/chrome-web-store-version.tester.js b/services/chrome-web-store/chrome-web-store-version.tester.js
index cccf0b95e14be2b1363af6faedb1238034a7db85..f108c7e70827e54623bafd1723cc9a0d2a0e967f 100644
--- a/services/chrome-web-store/chrome-web-store-version.tester.js
+++ b/services/chrome-web-store/chrome-web-store-version.tester.js
@@ -1,3 +1,4 @@
+import { Agent, MockAgent, setGlobalDispatcher } from 'undici'
 import { isVPlusDottedVersionAtLeastOne } from '../test-validators.js'
 import { createServiceTester } from '../tester.js'
 export const t = await createServiceTester()
@@ -12,7 +13,16 @@ t.create('Version (not found)')
   .expectBadge({ label: 'chrome web store', message: 'not found' })
 
 // Keep this "inaccessible" test, since this service does not use BaseService#_request.
+const mockAgent = new MockAgent()
 t.create('Version (inaccessible)')
   .get('/alhjnofcnnpeaphgeakdhkebafjcpeae.json')
-  .networkOff()
+  // webextension-store-meta uses undici internally, so we can't mock it with nock
+  .before(function () {
+    setGlobalDispatcher(mockAgent)
+    mockAgent.disableNetConnect()
+  })
+  .after(async function () {
+    await mockAgent.close()
+    setGlobalDispatcher(new Agent())
+  })
   .expectBadge({ label: 'chrome web store', message: 'inaccessible' })