From c73072deed8eb6a5b9f51a06377f5f396ef21842 Mon Sep 17 00:00:00 2001
From: chris48s <chris48s@users.noreply.github.com>
Date: Mon, 15 Nov 2021 19:56:08 +0000
Subject: [PATCH] Remove requestOptions2GotOptions compatibility layer (#7270)

* gzip --> decompress

* strictSSL --> https.rejectUnauthorized

* auth --> username/password

* qs --> searchParams

* fix base service auth docs

* completely remove requestOptions2GotOptions layer

* update the docs

Co-authored-by: repo-ranger[bot] <39074581+repo-ranger[bot]@users.noreply.github.com>
---
 core/base-service/auth-helper.js              | 16 ++++---
 core/base-service/auth-helper.spec.js         | 43 ++++++++++-------
 core/base-service/base-graphql.js             |  6 +--
 core/base-service/base-graphql.spec.js        |  4 +-
 core/base-service/base-json.js                |  6 +--
 core/base-service/base-json.spec.js           |  4 +-
 core/base-service/base-svg-scraping.js        |  6 +--
 core/base-service/base-svg-scraping.spec.js   |  4 +-
 core/base-service/base-xml.js                 |  6 +--
 core/base-service/base-xml.spec.js            |  4 +-
 core/base-service/base-yaml.js                |  6 +--
 core/base-service/base-yaml.spec.js           |  4 +-
 core/base-service/base.js                     | 19 ++++----
 core/base-service/got.js                      | 46 +------------------
 core/base-service/got.spec.js                 | 37 +--------------
 doc/TUTORIAL.md                               |  4 +-
 services/aur/aur.service.js                   |  2 +-
 services/azure-devops/azure-devops-base.js    |  4 +-
 .../azure-devops-build.service.js             |  2 +-
 .../azure-devops-coverage.service.js          |  2 +-
 services/azure-devops/azure-devops-helpers.js |  7 ++-
 .../azure-devops-tests.service.js             |  2 +-
 .../bitbucket/bitbucket-issues.service.js     |  2 +-
 .../bitbucket/bitbucket-pipelines.service.js  |  2 +-
 .../bitbucket-pull-request.service.js         |  4 +-
 services/bitrise/bitrise.service.js           |  2 +-
 services/bstats/bstats-players.service.js     |  2 +-
 services/bstats/bstats-servers.service.js     |  2 +-
 services/buildkite/buildkite.service.js       |  2 +-
 services/bundlephobia/bundlephobia.service.js |  2 +-
 services/circleci/circleci.service.js         |  2 +-
 services/cirrus/cirrus.service.js             |  2 +-
 services/codacy/codacy-coverage.service.js    |  2 +-
 services/codacy/codacy-grade.service.js       |  2 +-
 services/codeclimate/codeclimate-common.js    |  2 +-
 services/codecov/codecov.service.js           |  2 +-
 services/codeship/codeship.service.js         |  2 +-
 services/coveralls/coveralls.service.js       |  2 +-
 services/debian/debian.service.js             |  2 +-
 services/dependabot/dependabot.service.js     |  4 +-
 services/docker/docker-cloud-common-fetch.js  |  2 +-
 services/drone/drone-build.service.js         |  2 +-
 services/endpoint-common.js                   |  2 +-
 .../freecodecamp-points.service.js            |  2 +-
 services/github/github-common-fetch.js        |  2 +-
 .../github/github-contributors.service.js     |  2 +-
 services/github/github-downloads.service.js   |  2 +-
 services/github/github-last-commit.service.js |  2 +-
 services/github/github-search.service.js      |  2 +-
 .../github/github-workflow-status.service.js  |  2 +-
 services/gitlab/gitlab-base.js                |  4 +-
 services/gitlab/gitlab-release.service.js     |  2 +-
 services/gitlab/gitlab-tag.service.js         |  2 +-
 services/hsts/hsts.service.js                 |  2 +-
 services/jenkins/jenkins-base.js              |  4 +-
 services/jenkins/jenkins-build.service.js     |  2 +-
 services/jenkins/jenkins-coverage.service.js  |  2 +-
 services/jenkins/jenkins-tests.service.js     |  4 +-
 services/jira/jira-sprint.service.js          |  2 +-
 services/keybase/keybase-btc.service.js       |  2 +-
 services/keybase/keybase-pgp.service.js       |  2 +-
 services/keybase/keybase-xlm.service.js       |  2 +-
 services/keybase/keybase-zec.service.js       |  2 +-
 .../librariesio/librariesio-api-provider.js   |  4 +-
 services/localizely/localizely.service.js     |  2 +-
 services/matrix/matrix.service.js             |  6 +--
 .../mozilla-observatory.service.js            |  2 +-
 services/nexus/nexus.service.js               | 26 +++++------
 services/nodeping/nodeping-status.service.js  |  2 +-
 services/nodeping/nodeping-uptime.service.js  |  6 ++-
 services/nuget/nuget-v2-service-family.js     |  8 ++--
 services/nuget/nuget-v3-service-family.js     |  2 +-
 services/opm/opm-version.service.js           |  2 +-
 services/readthedocs/readthedocs.service.js   |  2 +-
 services/requires/requires.service.js         |  2 +-
 .../security-headers.service.js               |  2 +-
 services/snyk/snyk-vulnerability-base.js      |  4 +-
 .../snyk/snyk-vulnerability-github.service.js |  4 +-
 services/sonar/sonar-base.js                  |  8 ++--
 services/sourceforge/sourceforge.service.js   |  2 +-
 .../stackexchange-monthlyquestions.service.js |  4 +-
 .../stackexchange-reputation.service.js       |  2 +-
 .../stackexchange-taginfo.service.js          |  2 +-
 services/swagger/swagger.service.js           |  2 +-
 services/teamcity/teamcity-base.js            |  6 +--
 services/travis/travis-build.service.js       |  2 +-
 services/treeware/treeware-trees.service.js   |  2 +-
 services/twitch/twitch-base.js                |  2 +-
 .../twitch-extension-version.service.js       |  2 +-
 services/twitch/twitch.service.js             |  2 +-
 services/twitter/twitter.service.js           |  2 +-
 services/ubuntu/ubuntu.service.js             |  2 +-
 .../vaadin-directory/vaadin-directory-base.js |  2 +-
 services/w3c/w3c-validation.service.js        |  2 +-
 services/wercker/wercker.service.js           |  6 +--
 .../wikiapiary/wikiapiary-installs.service.js |  2 +-
 services/wordpress/wordpress-base.js          |  2 +-
 .../wordpress/wordpress-downloads.service.js  |  2 +-
 services/youtube/youtube-base.js              |  2 +-
 99 files changed, 204 insertions(+), 254 deletions(-)

diff --git a/core/base-service/auth-helper.js b/core/base-service/auth-helper.js
index 8c9c7976be..05f9a7ed0e 100644
--- a/core/base-service/auth-helper.js
+++ b/core/base-service/auth-helper.js
@@ -74,7 +74,7 @@ class AuthHelper {
   }
 
   static _isInsecureSslRequest({ options = {} }) {
-    const { strictSSL = true } = options
+    const strictSSL = options?.https?.rejectUnauthorized ?? true
     return strictSSL !== true
   }
 
@@ -107,8 +107,8 @@ class AuthHelper {
   }
 
   get _basicAuth() {
-    const { _user: user, _pass: pass } = this
-    return this.isConfigured ? { user, pass } : undefined
+    const { _user: username, _pass: password } = this
+    return this.isConfigured ? { username, password } : undefined
   }
 
   /*
@@ -131,7 +131,7 @@ class AuthHelper {
     const { options, ...rest } = requestParams
     return {
       options: {
-        auth,
+        ...auth,
         ...options,
       },
       ...rest,
@@ -181,11 +181,13 @@ class AuthHelper {
   }
 
   static _mergeQueryParams(requestParams, query) {
-    const { options: { qs: existingQuery, ...restOptions } = {}, ...rest } =
-      requestParams
+    const {
+      options: { searchParams: existingQuery, ...restOptions } = {},
+      ...rest
+    } = requestParams
     return {
       options: {
-        qs: {
+        searchParams: {
           ...existingQuery,
           ...query,
         },
diff --git a/core/base-service/auth-helper.spec.js b/core/base-service/auth-helper.spec.js
index fd36f95057..3f0e52206a 100644
--- a/core/base-service/auth-helper.spec.js
+++ b/core/base-service/auth-helper.spec.js
@@ -104,14 +104,14 @@ describe('AuthHelper', function () {
           { userKey: 'myci_user', passKey: 'myci_pass' },
           { myci_user: 'admin', myci_pass: 'abc123' }
         ),
-      ]).expect({ user: 'admin', pass: 'abc123' })
+      ]).expect({ username: 'admin', password: 'abc123' })
       given({ userKey: 'myci_user' }, { myci_user: 'admin' }).expect({
-        user: 'admin',
-        pass: undefined,
+        username: 'admin',
+        password: undefined,
       })
       given({ passKey: 'myci_pass' }, { myci_pass: 'abc123' }).expect({
-        user: undefined,
-        pass: 'abc123',
+        username: undefined,
+        password: 'abc123',
       })
       given({ userKey: 'myci_user', passKey: 'myci_pass' }, {}).expect(
         undefined
@@ -120,8 +120,8 @@ describe('AuthHelper', function () {
         { passKey: 'myci_pass', defaultToEmptyStringForUser: true },
         { myci_pass: 'abc123' }
       ).expect({
-        user: '',
-        pass: 'abc123',
+        username: '',
+        password: 'abc123',
       })
     })
   })
@@ -131,15 +131,18 @@ describe('AuthHelper', function () {
       forCases([
         given({ url: 'http://example.test' }),
         given({ url: 'http://example.test', options: {} }),
-        given({ url: 'http://example.test', options: { strictSSL: true } }),
         given({
           url: 'http://example.test',
-          options: { strictSSL: undefined },
+          options: { https: { rejectUnauthorized: true } },
+        }),
+        given({
+          url: 'http://example.test',
+          options: { https: { rejectUnauthorized: undefined } },
         }),
       ]).expect(false)
       given({
         url: 'http://example.test',
-        options: { strictSSL: false },
+        options: { https: { rejectUnauthorized: false } },
       }).expect(true)
     })
   })
@@ -163,7 +166,9 @@ describe('AuthHelper', function () {
       })
       it('throws for insecure requests', function () {
         expect(() =>
-          authHelper.enforceStrictSsl({ options: { strictSSL: false } })
+          authHelper.enforceStrictSsl({
+            options: { https: { rejectUnauthorized: false } },
+          })
         ).to.throw(InvalidParameter)
       })
     })
@@ -185,7 +190,9 @@ describe('AuthHelper', function () {
       })
       it('does not throw for insecure requests', function () {
         expect(() =>
-          authHelper.enforceStrictSsl({ options: { strictSSL: false } })
+          authHelper.enforceStrictSsl({
+            options: { https: { rejectUnauthorized: false } },
+          })
         ).not.to.throw()
       })
     })
@@ -220,7 +227,7 @@ describe('AuthHelper', function () {
         test(shouldAuthenticateRequest, () => {
           given({
             url: 'https://myci.test/api',
-            options: { strictSSL: false },
+            options: { https: { rejectUnauthorized: false } },
           }).expect(false)
         })
       })
@@ -258,7 +265,7 @@ describe('AuthHelper', function () {
         test(shouldAuthenticateRequest, () => {
           given({
             url: 'https://myci.test',
-            options: { strictSSL: false },
+            options: { https: { rejectUnauthorized: false } },
           }).expect(true)
         })
       })
@@ -323,7 +330,8 @@ describe('AuthHelper', function () {
         }).expect({
           url: 'https://myci.test/api',
           options: {
-            auth: { user: 'admin', pass: 'abc123' },
+            username: 'admin',
+            password: 'abc123',
           },
         })
         given({
@@ -335,7 +343,8 @@ describe('AuthHelper', function () {
           url: 'https://myci.test/api',
           options: {
             headers: { Accept: 'application/json' },
-            auth: { user: 'admin', pass: 'abc123' },
+            username: 'admin',
+            password: 'abc123',
           },
         })
       })
@@ -366,7 +375,7 @@ describe('AuthHelper', function () {
       expect(() =>
         withBasicAuth({
           url: 'https://myci.test/api',
-          options: { strictSSL: false },
+          options: { https: { rejectUnauthorized: false } },
         })
       ).to.throw(InvalidParameter)
     })
diff --git a/core/base-service/base-graphql.js b/core/base-service/base-graphql.js
index bbdcb92248..694a2f2720 100644
--- a/core/base-service/base-graphql.js
+++ b/core/base-service/base-graphql.js
@@ -38,8 +38,8 @@ class BaseGraphqlService extends BaseService {
    *    representing the query clause of GraphQL POST body
    *    e.g. gql`{ query { ... } }`
    * @param {object} attrs.variables Variables clause of GraphQL POST body
-   * @param {object} [attrs.options={}] Options to pass to request. See
-   *    [documentation](https://github.com/request/request#requestoptions-callback)
+   * @param {object} [attrs.options={}] Options to pass to got. See
+   *    [documentation](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md)
    * @param {object} [attrs.httpErrorMessages={}] Key-value map of HTTP status codes
    *    and custom error messages e.g: `{ 404: 'package not found' }`.
    *    This can be used to extend or override the
@@ -53,7 +53,7 @@ class BaseGraphqlService extends BaseService {
    *    The default is to return the first entry of the `errors` array as
    *    an InvalidResponse.
    * @returns {object} Parsed response
-   * @see https://github.com/request/request#requestoptions-callback
+   * @see https://github.com/sindresorhus/got/blob/main/documentation/2-options.md
    */
   async _requestGraphql({
     schema,
diff --git a/core/base-service/base-graphql.spec.js b/core/base-service/base-graphql.spec.js
index ee59b8ddec..dcd6c150f1 100644
--- a/core/base-service/base-graphql.spec.js
+++ b/core/base-service/base-graphql.spec.js
@@ -66,7 +66,7 @@ describe('BaseGraphqlService', function () {
                 requiredString
               }
             `,
-            options: { qs: { queryParam: 123 } },
+            options: { searchParams: { queryParam: 123 } },
           })
           return { message: value }
         }
@@ -83,7 +83,7 @@ describe('BaseGraphqlService', function () {
           body: '{"query":"{\\n  requiredString\\n}\\n","variables":{}}',
           headers: { Accept: 'application/json' },
           method: 'POST',
-          qs: { queryParam: 123 },
+          searchParams: { queryParam: 123 },
         }
       )
     })
diff --git a/core/base-service/base-json.js b/core/base-service/base-json.js
index 7f4730d2d2..ebabf1a416 100644
--- a/core/base-service/base-json.js
+++ b/core/base-service/base-json.js
@@ -28,14 +28,14 @@ class BaseJsonService extends BaseService {
    * @param {object} attrs Refer to individual attrs
    * @param {Joi} attrs.schema Joi schema to validate the response against
    * @param {string} attrs.url URL to request
-   * @param {object} [attrs.options={}] Options to pass to request. See
-   *    [documentation](https://github.com/request/request#requestoptions-callback)
+   * @param {object} [attrs.options={}] Options to pass to got. See
+   *    [documentation](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md)
    * @param {object} [attrs.errorMessages={}] Key-value map of status codes
    *    and custom error messages e.g: `{ 404: 'package not found' }`.
    *    This can be used to extend or override the
    *    [default](https://github.com/badges/shields/blob/master/core/base-service/check-error-response.js#L5)
    * @returns {object} Parsed response
-   * @see https://github.com/request/request#requestoptions-callback
+   * @see https://github.com/sindresorhus/got/blob/main/documentation/2-options.md
    */
   async _requestJson({ schema, url, options = {}, errorMessages = {} }) {
     const mergedOptions = {
diff --git a/core/base-service/base-json.spec.js b/core/base-service/base-json.spec.js
index 45665e4702..3dac0f7160 100644
--- a/core/base-service/base-json.spec.js
+++ b/core/base-service/base-json.spec.js
@@ -52,7 +52,7 @@ describe('BaseJsonService', function () {
           const { value } = await this._requestJson({
             schema: dummySchema,
             url: 'http://example.com/foo.json',
-            options: { method: 'POST', qs: { queryParam: 123 } },
+            options: { method: 'POST', searchParams: { queryParam: 123 } },
           })
           return { message: value }
         }
@@ -68,7 +68,7 @@ describe('BaseJsonService', function () {
         {
           headers: { Accept: 'application/json' },
           method: 'POST',
-          qs: { queryParam: 123 },
+          searchParams: { queryParam: 123 },
         }
       )
     })
diff --git a/core/base-service/base-svg-scraping.js b/core/base-service/base-svg-scraping.js
index 993e0b584b..a1cf981857 100644
--- a/core/base-service/base-svg-scraping.js
+++ b/core/base-service/base-svg-scraping.js
@@ -51,14 +51,14 @@ class BaseSvgScrapingService extends BaseService {
    * @param {RegExp} attrs.valueMatcher
    *    RegExp to match the value we want to parse from the SVG
    * @param {string} attrs.url URL to request
-   * @param {object} [attrs.options={}] Options to pass to request. See
-   *    [documentation](https://github.com/request/request#requestoptions-callback)
+   * @param {object} [attrs.options={}] Options to pass to got. See
+   *    [documentation](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md)
    * @param {object} [attrs.errorMessages={}] Key-value map of status codes
    *    and custom error messages e.g: `{ 404: 'package not found' }`.
    *    This can be used to extend or override the
    *    [default](https://github.com/badges/shields/blob/master/core/base-service/check-error-response.js#L5)
    * @returns {object} Parsed response
-   * @see https://github.com/request/request#requestoptions-callback
+   * @see https://github.com/sindresorhus/got/blob/main/documentation/2-options.md
    */
   async _requestSvg({
     schema,
diff --git a/core/base-service/base-svg-scraping.spec.js b/core/base-service/base-svg-scraping.spec.js
index 728f3bd188..c03943ecfd 100644
--- a/core/base-service/base-svg-scraping.spec.js
+++ b/core/base-service/base-svg-scraping.spec.js
@@ -66,7 +66,7 @@ describe('BaseSvgScrapingService', function () {
             url: 'http://example.com/foo.svg',
             options: {
               method: 'POST',
-              qs: { queryParam: 123 },
+              searchParams: { queryParam: 123 },
             },
           })
           return { message }
@@ -83,7 +83,7 @@ describe('BaseSvgScrapingService', function () {
         {
           method: 'POST',
           headers: { Accept: 'image/svg+xml' },
-          qs: { queryParam: 123 },
+          searchParams: { queryParam: 123 },
         }
       )
     })
diff --git a/core/base-service/base-xml.js b/core/base-service/base-xml.js
index ee0c5e9020..1ea813a16e 100644
--- a/core/base-service/base-xml.js
+++ b/core/base-service/base-xml.js
@@ -22,8 +22,8 @@ class BaseXmlService extends BaseService {
    * @param {object} attrs Refer to individual attrs
    * @param {Joi} attrs.schema Joi schema to validate the response against
    * @param {string} attrs.url URL to request
-   * @param {object} [attrs.options={}] Options to pass to request. See
-   *    [documentation](https://github.com/request/request#requestoptions-callback)
+   * @param {object} [attrs.options={}] Options to pass to got. See
+   *    [documentation](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md)
    * @param {object} [attrs.errorMessages={}] Key-value map of status codes
    *    and custom error messages e.g: `{ 404: 'package not found' }`.
    *    This can be used to extend or override the
@@ -31,7 +31,7 @@ class BaseXmlService extends BaseService {
    * @param {object} [attrs.parserOptions={}] Options to pass to fast-xml-parser. See
    *    [documentation](https://github.com/NaturalIntelligence/fast-xml-parser#xml-to-json)
    * @returns {object} Parsed response
-   * @see https://github.com/request/request#requestoptions-callback
+   * @see https://github.com/sindresorhus/got/blob/main/documentation/2-options.md
    * @see https://github.com/NaturalIntelligence/fast-xml-parser#xml-to-json
    */
   async _requestXml({
diff --git a/core/base-service/base-xml.spec.js b/core/base-service/base-xml.spec.js
index 8db8dfc6f7..5a7ecdad2a 100644
--- a/core/base-service/base-xml.spec.js
+++ b/core/base-service/base-xml.spec.js
@@ -54,7 +54,7 @@ describe('BaseXmlService', function () {
           const { requiredString } = await this._requestXml({
             schema: dummySchema,
             url: 'http://example.com/foo.xml',
-            options: { method: 'POST', qs: { queryParam: 123 } },
+            options: { method: 'POST', searchParams: { queryParam: 123 } },
           })
           return { message: requiredString }
         }
@@ -70,7 +70,7 @@ describe('BaseXmlService', function () {
         {
           headers: { Accept: 'application/xml, text/xml' },
           method: 'POST',
-          qs: { queryParam: 123 },
+          searchParams: { queryParam: 123 },
         }
       )
     })
diff --git a/core/base-service/base-yaml.js b/core/base-service/base-yaml.js
index 0dd75930ca..85e08f2d25 100644
--- a/core/base-service/base-yaml.js
+++ b/core/base-service/base-yaml.js
@@ -21,15 +21,15 @@ class BaseYamlService extends BaseService {
    * @param {object} attrs Refer to individual attrs
    * @param {Joi} attrs.schema Joi schema to validate the response against
    * @param {string} attrs.url URL to request
-   * @param {object} [attrs.options={}] Options to pass to request. See
-   *    [documentation](https://github.com/request/request#requestoptions-callback)
+   * @param {object} [attrs.options={}] Options to pass to got. See
+   *    [documentation](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md)
    * @param {object} [attrs.errorMessages={}] Key-value map of status codes
    *    and custom error messages e.g: `{ 404: 'package not found' }`.
    *    This can be used to extend or override the
    *    [default](https://github.com/badges/shields/blob/master/core/base-service/check-error-response.js#L5)
    * @param {object} [attrs.encoding='utf8'] Character encoding
    * @returns {object} Parsed response
-   * @see https://github.com/request/request#requestoptions-callback
+   * @see https://github.com/sindresorhus/got/blob/main/documentation/2-options.md
    */
   async _requestYaml({
     schema,
diff --git a/core/base-service/base-yaml.spec.js b/core/base-service/base-yaml.spec.js
index 50b42990c1..f52fb07efb 100644
--- a/core/base-service/base-yaml.spec.js
+++ b/core/base-service/base-yaml.spec.js
@@ -71,7 +71,7 @@ describe('BaseYamlService', function () {
           const { requiredString } = await this._requestYaml({
             schema: dummySchema,
             url: 'http://example.com/foo.yaml',
-            options: { method: 'POST', qs: { queryParam: 123 } },
+            options: { method: 'POST', searchParams: { queryParam: 123 } },
           })
           return { message: requiredString }
         }
@@ -90,7 +90,7 @@ describe('BaseYamlService', function () {
               'text/x-yaml, text/yaml, application/x-yaml, application/yaml, text/plain',
           },
           method: 'POST',
-          qs: { queryParam: 123 },
+          searchParams: { queryParam: 123 },
         }
       )
     })
diff --git a/core/base-service/base.js b/core/base-service/base.js
index 8986cbf239..4cd0039695 100644
--- a/core/base-service/base.js
+++ b/core/base-service/base.js
@@ -108,11 +108,14 @@ class BaseService {
    *
    * See also the config schema in `./server.js` and `doc/server-secrets.md`.
    *
-   * To use the configured auth in the handler or fetch method, pass the
-   * credentials to the request. For example:
-   * - `{ options: { auth: this.authHelper.basicAuth } }`
-   * - `{ options: { headers: this.authHelper.bearerAuthHeader } }`
-   * - `{ options: { qs: { token: this.authHelper._pass } } }`
+   * To use the configured auth in the handler or fetch method, wrap the
+   * _request() input params in a call to one of:
+   * - this.authHelper.withBasicAuth()
+   * - this.authHelper.withBearerAuthHeader()
+   * - this.authHelper.withQueryStringAuth()
+   *
+   * For example:
+   * this._request(this.authHelper.withBasicAuth({ url, schema, options }))
    *
    * @abstract
    * @type {module:core/base-service/base~Auth}
@@ -217,10 +220,10 @@ class BaseService {
     const logTrace = (...args) => trace.logTrace('fetch', ...args)
     let logUrl = url
     const logOptions = Object.assign({}, options)
-    if ('qs' in options) {
-      const params = new URLSearchParams(options.qs)
+    if ('searchParams' in options) {
+      const params = new URLSearchParams(options.searchParams)
       logUrl = `${url}?${params.toString()}`
-      delete logOptions.qs
+      delete logOptions.searchParams
     }
     logTrace(
       emojic.bowAndArrow,
diff --git a/core/base-service/got.js b/core/base-service/got.js
index b49591f476..b62fa24502 100644
--- a/core/base-service/got.js
+++ b/core/base-service/got.js
@@ -3,50 +3,8 @@ import { Inaccessible, InvalidResponse } from './errors.js'
 
 const userAgent = 'Shields.io/2003a'
 
-function requestOptions2GotOptions(options) {
-  const requestOptions = Object.assign({}, options)
-  const gotOptions = {}
-  const interchangableOptions = ['body', 'form', 'headers', 'method', 'url']
-
-  interchangableOptions.forEach(function (opt) {
-    if (opt in requestOptions) {
-      gotOptions[opt] = requestOptions[opt]
-      delete requestOptions[opt]
-    }
-  })
-
-  if ('qs' in requestOptions) {
-    gotOptions.searchParams = requestOptions.qs
-    delete requestOptions.qs
-  }
-
-  if ('gzip' in requestOptions) {
-    gotOptions.decompress = requestOptions.gzip
-    delete requestOptions.gzip
-  }
-
-  if ('strictSSL' in requestOptions) {
-    gotOptions.https = {
-      rejectUnauthorized: requestOptions.strictSSL,
-    }
-    delete requestOptions.strictSSL
-  }
-
-  if ('auth' in requestOptions) {
-    gotOptions.username = requestOptions.auth.user
-    gotOptions.password = requestOptions.auth.pass
-    delete requestOptions.auth
-  }
-
-  if (Object.keys(requestOptions).length > 0) {
-    throw new Error(`Found unrecognised options ${Object.keys(requestOptions)}`)
-  }
-
-  return gotOptions
-}
-
 async function sendRequest(gotWrapper, url, options) {
-  const gotOptions = requestOptions2GotOptions(options)
+  const gotOptions = Object.assign({}, options)
   gotOptions.throwHttpErrors = false
   gotOptions.retry = 0
   gotOptions.headers = gotOptions.headers || {}
@@ -94,4 +52,4 @@ function fetchFactory(fetchLimitBytes = TEN_MB) {
   return sendRequest.bind(sendRequest, gotWithLimit)
 }
 
-export { requestOptions2GotOptions, fetchFactory, userAgent }
+export { fetchFactory, userAgent }
diff --git a/core/base-service/got.spec.js b/core/base-service/got.spec.js
index 185052d163..e592ed675c 100644
--- a/core/base-service/got.spec.js
+++ b/core/base-service/got.spec.js
@@ -1,43 +1,8 @@
 import { expect } from 'chai'
 import nock from 'nock'
-import { requestOptions2GotOptions, fetchFactory } from './got.js'
+import { fetchFactory } from './got.js'
 import { Inaccessible, InvalidResponse } from './errors.js'
 
-describe('requestOptions2GotOptions function', function () {
-  it('translates valid options', function () {
-    expect(
-      requestOptions2GotOptions({
-        body: 'body',
-        form: 'form',
-        headers: 'headers',
-        method: 'method',
-        url: 'url',
-        qs: 'qs',
-        gzip: 'gzip',
-        strictSSL: 'strictSSL',
-        auth: { user: 'user', pass: 'pass' },
-      })
-    ).to.deep.equal({
-      body: 'body',
-      form: 'form',
-      headers: 'headers',
-      method: 'method',
-      url: 'url',
-      searchParams: 'qs',
-      decompress: 'gzip',
-      https: { rejectUnauthorized: 'strictSSL' },
-      username: 'user',
-      password: 'pass',
-    })
-  })
-
-  it('throws if unrecognised options are found', function () {
-    expect(() =>
-      requestOptions2GotOptions({ body: 'body', foobar: 'foobar' })
-    ).to.throw(Error, 'Found unrecognised options foobar')
-  })
-})
-
 describe('got wrapper', function () {
   it('should not throw an error if the response <= fetchLimitBytes', async function () {
     nock('https://www.google.com')
diff --git a/doc/TUTORIAL.md b/doc/TUTORIAL.md
index 3315790fc3..ab81402c3e 100644
--- a/doc/TUTORIAL.md
+++ b/doc/TUTORIAL.md
@@ -228,14 +228,14 @@ Description of the code:
 9. Working our way upward, the `async fetch()` method is responsible for calling an API endpoint to get data. Extending `BaseJsonService` gives us the helper function `_requestJson()`. Note here that we pass the schema we defined in step 4 as an argument. `_requestJson()` will deal with validating the response against the schema and throwing an error if necessary.
 
    - `_requestJson()` automatically adds an Accept header, checks the status code, parses the response as JSON, and returns the parsed response.
-   - `_requestJson()` uses [request](https://github.com/request/request) to perform the HTTP request. Options can be passed to request, including method, query string, and headers. If headers are provided they will override the ones automatically set by `_requestJson()`. There is no need to specify json, as the JSON parsing is handled by `_requestJson()`. See the `request` docs for [supported options](https://github.com/request/request#requestoptions-callback).
+   - `_requestJson()` uses [got](https://github.com/sindresorhus/got) to perform the HTTP request. Options can be passed to got, including method, query string, and headers. If headers are provided they will override the ones automatically set by `_requestJson()`. There is no need to specify json, as the JSON parsing is handled by `_requestJson()`. See the `got` docs for [supported options](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md).
    - Error messages corresponding to each status code can be returned by passing a dictionary of status codes -> messages in `errorMessages`.
    - A more complex call to `_requestJson()` might look like this:
      ```js
      return this._requestJson({
        schema: mySchema,
        url,
-       options: { qs: { branch: 'master' } },
+       options: { searchParams: { branch: 'master' } },
        errorMessages: {
          401: 'private application not supported',
          404: 'application not found',
diff --git a/services/aur/aur.service.js b/services/aur/aur.service.js
index c854ce94d4..61430f5b68 100644
--- a/services/aur/aur.service.js
+++ b/services/aur/aur.service.js
@@ -43,7 +43,7 @@ class BaseAurService extends BaseJsonService {
     return this._requestJson({
       schema: aurSchema,
       url: 'https://aur.archlinux.org/rpc.php',
-      options: { qs: { v: 5, type: 'info', arg: packageName } },
+      options: { searchParams: { v: 5, type: 'info', arg: packageName } },
     })
   }
 }
diff --git a/services/azure-devops/azure-devops-base.js b/services/azure-devops/azure-devops-base.js
index 184530bde7..6b01bea846 100644
--- a/services/azure-devops/azure-devops-base.js
+++ b/services/azure-devops/azure-devops-base.js
@@ -40,7 +40,7 @@ export default class AzureDevOpsBase extends BaseJsonService {
     // Microsoft documentation: https://docs.microsoft.com/en-us/rest/api/azure/devops/build/builds/list?view=azure-devops-rest-5.0
     const url = `https://dev.azure.com/${organization}/${project}/_apis/build/builds`
     const options = {
-      qs: {
+      searchParams: {
         definitions: definitionId,
         $top: 1,
         statusFilter: 'completed',
@@ -49,7 +49,7 @@ export default class AzureDevOpsBase extends BaseJsonService {
     }
 
     if (branch) {
-      options.qs.branchName = `refs/heads/${branch}`
+      options.searchParams.branchName = `refs/heads/${branch}`
     }
 
     const json = await this.fetch({
diff --git a/services/azure-devops/azure-devops-build.service.js b/services/azure-devops/azure-devops-build.service.js
index 8485fa49fe..a4c2bc93b7 100644
--- a/services/azure-devops/azure-devops-build.service.js
+++ b/services/azure-devops/azure-devops-build.service.js
@@ -104,7 +104,7 @@ export default class AzureDevOpsBuild extends BaseSvgScrapingService {
     // Microsoft documentation: https://docs.microsoft.com/en-us/rest/api/vsts/build/status/get
     const { status } = await fetch(this, {
       url: `https://dev.azure.com/${organization}/${projectId}/_apis/build/status/${definitionId}`,
-      qs: {
+      searchParams: {
         branchName: branch,
         stageName: stage,
         jobName: job,
diff --git a/services/azure-devops/azure-devops-coverage.service.js b/services/azure-devops/azure-devops-coverage.service.js
index 4234b36f48..eb5b7eeb79 100644
--- a/services/azure-devops/azure-devops-coverage.service.js
+++ b/services/azure-devops/azure-devops-coverage.service.js
@@ -101,7 +101,7 @@ export default class AzureDevOpsCoverage extends AzureDevOpsBase {
     // Microsoft documentation: https://docs.microsoft.com/en-us/rest/api/azure/devops/test/code%20coverage/get%20build%20code%20coverage?view=azure-devops-rest-5.0
     const url = `https://dev.azure.com/${organization}/${project}/_apis/test/codecoverage`
     const options = {
-      qs: {
+      searchParams: {
         buildId,
         'api-version': '5.0-preview.1',
       },
diff --git a/services/azure-devops/azure-devops-helpers.js b/services/azure-devops/azure-devops-helpers.js
index 67b457352a..e57f8c8347 100644
--- a/services/azure-devops/azure-devops-helpers.js
+++ b/services/azure-devops/azure-devops-helpers.js
@@ -15,12 +15,15 @@ const schema = Joi.object({
     .required(),
 }).required()
 
-async function fetch(serviceInstance, { url, qs = {}, errorMessages }) {
+async function fetch(
+  serviceInstance,
+  { url, searchParams = {}, errorMessages }
+) {
   // Microsoft documentation: https://docs.microsoft.com/en-us/rest/api/vsts/build/status/get
   const { message: status } = await serviceInstance._requestSvg({
     schema,
     url,
-    options: { qs },
+    options: { searchParams },
     errorMessages,
   })
   return { status }
diff --git a/services/azure-devops/azure-devops-tests.service.js b/services/azure-devops/azure-devops-tests.service.js
index 9e840bfe38..8b10ebf431 100644
--- a/services/azure-devops/azure-devops-tests.service.js
+++ b/services/azure-devops/azure-devops-tests.service.js
@@ -160,7 +160,7 @@ export default class AzureDevOpsTests extends AzureDevOpsBase {
     return await this.fetch({
       url: `https://dev.azure.com/${organization}/${project}/_apis/test/ResultSummaryByBuild`,
       options: {
-        qs: { buildId },
+        searchParams: { buildId },
       },
       schema: buildTestResultSummarySchema,
       errorMessages,
diff --git a/services/bitbucket/bitbucket-issues.service.js b/services/bitbucket/bitbucket-issues.service.js
index 9bcf5a5b92..38eafea3a3 100644
--- a/services/bitbucket/bitbucket-issues.service.js
+++ b/services/bitbucket/bitbucket-issues.service.js
@@ -44,7 +44,7 @@ function issueClassGenerator(raw) {
         schema: bitbucketIssuesSchema,
         // https://developer.atlassian.com/bitbucket/api/2/reference/meta/filtering#query-issues
         options: {
-          qs: { limit: 0, q: '(state = "new" OR state = "open")' },
+          searchParams: { limit: 0, q: '(state = "new" OR state = "open")' },
         },
         errorMessages: { 403: 'private repo' },
       })
diff --git a/services/bitbucket/bitbucket-pipelines.service.js b/services/bitbucket/bitbucket-pipelines.service.js
index dc28820bcd..29d0277d4b 100644
--- a/services/bitbucket/bitbucket-pipelines.service.js
+++ b/services/bitbucket/bitbucket-pipelines.service.js
@@ -54,7 +54,7 @@ class BitbucketPipelines extends BaseJsonService {
       url,
       schema: bitbucketPipelinesSchema,
       options: {
-        qs: {
+        searchParams: {
           fields: 'values.state',
           page: 1,
           pagelen: 2,
diff --git a/services/bitbucket/bitbucket-pull-request.service.js b/services/bitbucket/bitbucket-pull-request.service.js
index add3ad820f..e1ad1a8117 100644
--- a/services/bitbucket/bitbucket-pull-request.service.js
+++ b/services/bitbucket/bitbucket-pull-request.service.js
@@ -86,7 +86,7 @@ function pullRequestClassGenerator(raw) {
         this.bitbucketAuthHelper.withBasicAuth({
           url: `https://bitbucket.org/api/2.0/repositories/${user}/${repo}/pullrequests/`,
           schema,
-          options: { qs: { state: 'OPEN', limit: 0 } },
+          options: { searchParams: { state: 'OPEN', limit: 0 } },
           errorMessages,
         })
       )
@@ -99,7 +99,7 @@ function pullRequestClassGenerator(raw) {
           url: `${server}/rest/api/1.0/projects/${user}/repos/${repo}/pull-requests`,
           schema,
           options: {
-            qs: {
+            searchParams: {
               state: 'OPEN',
               limit: 100,
               withProperties: false,
diff --git a/services/bitrise/bitrise.service.js b/services/bitrise/bitrise.service.js
index ee76f55972..ea86808634 100644
--- a/services/bitrise/bitrise.service.js
+++ b/services/bitrise/bitrise.service.js
@@ -53,7 +53,7 @@ export default class Bitrise extends BaseJsonService {
       url: `https://app.bitrise.io/app/${encodeURIComponent(
         appId
       )}/status.json`,
-      options: { qs: { token, branch } },
+      options: { searchParams: { token, branch } },
       schema,
       errorMessages: {
         403: 'app not found or invalid token',
diff --git a/services/bstats/bstats-players.service.js b/services/bstats/bstats-players.service.js
index 5b8eccd36f..6e4f0658a9 100644
--- a/services/bstats/bstats-players.service.js
+++ b/services/bstats/bstats-players.service.js
@@ -34,7 +34,7 @@ export default class BStatsPlayers extends BaseJsonService {
     return this._requestJson({
       schema,
       options: {
-        qs: {
+        searchParams: {
           maxElements: 1,
         },
       },
diff --git a/services/bstats/bstats-servers.service.js b/services/bstats/bstats-servers.service.js
index f90f95397a..e0486eb810 100644
--- a/services/bstats/bstats-servers.service.js
+++ b/services/bstats/bstats-servers.service.js
@@ -34,7 +34,7 @@ export default class BStatsServers extends BaseJsonService {
     return this._requestJson({
       schema,
       options: {
-        qs: {
+        searchParams: {
           maxElements: 1,
         },
       },
diff --git a/services/buildkite/buildkite.service.js b/services/buildkite/buildkite.service.js
index c9cfb31648..e881421cfc 100644
--- a/services/buildkite/buildkite.service.js
+++ b/services/buildkite/buildkite.service.js
@@ -35,7 +35,7 @@ export default class Buildkite extends BaseJsonService {
 
   async fetch({ identifier, branch }) {
     const url = `https://badge.buildkite.com/${identifier}.json`
-    const options = { qs: { branch } }
+    const options = { searchParams: { branch } }
     return this._requestJson({
       schema,
       url,
diff --git a/services/bundlephobia/bundlephobia.service.js b/services/bundlephobia/bundlephobia.service.js
index 5609e0880a..c3fed6cdd1 100644
--- a/services/bundlephobia/bundlephobia.service.js
+++ b/services/bundlephobia/bundlephobia.service.js
@@ -79,7 +79,7 @@ export default class Bundlephobia extends BaseJsonService {
     const packageQuery = `${scope ? `${scope}/` : ''}${packageName}${
       version ? `@${version}` : ''
     }`
-    const options = { qs: { package: packageQuery } }
+    const options = { searchParams: { package: packageQuery } }
     return this._requestJson({
       schema,
       url: 'https://bundlephobia.com/api/size',
diff --git a/services/circleci/circleci.service.js b/services/circleci/circleci.service.js
index 2087af4531..11dd943cd3 100644
--- a/services/circleci/circleci.service.js
+++ b/services/circleci/circleci.service.js
@@ -56,7 +56,7 @@ class CircleCi extends BaseSvgScrapingService {
       url: `https://circleci.com/${vcs}/${user}/${repo}${branchClause}.svg`,
       // Note that the unusual 'circle-token' query param name is required.
       // https://circleci.com/docs/api/#get-authenticated
-      options: { qs: { style: 'shield', 'circle-token': token } },
+      options: { searchParams: { style: 'shield', 'circle-token': token } },
       errorMessages: { 404: 'project not found' },
     })
     return this.constructor.render({ status: message })
diff --git a/services/cirrus/cirrus.service.js b/services/cirrus/cirrus.service.js
index 437f2d630a..24bc992321 100644
--- a/services/cirrus/cirrus.service.js
+++ b/services/cirrus/cirrus.service.js
@@ -65,7 +65,7 @@ export default class Cirrus extends BaseJsonService {
     const json = await this._requestJson({
       schema,
       url: `https://api.cirrus-ci.com/github/${user}/${repo}.json`,
-      options: { qs: { branch, script, task } },
+      options: { searchParams: { branch, script, task } },
     })
 
     return this.constructor.render(json)
diff --git a/services/codacy/codacy-coverage.service.js b/services/codacy/codacy-coverage.service.js
index efd229bce5..62c1d8a030 100644
--- a/services/codacy/codacy-coverage.service.js
+++ b/services/codacy/codacy-coverage.service.js
@@ -51,7 +51,7 @@ export default class CodacyCoverage extends BaseSvgScrapingService {
       url: `https://api.codacy.com/project/badge/coverage/${encodeURIComponent(
         projectId
       )}`,
-      options: { qs: { branch } },
+      options: { searchParams: { branch } },
       valueMatcher: /text-anchor="middle">([^<>]+)<\/text>/,
       errorMessages: {
         404: 'project not found',
diff --git a/services/codacy/codacy-grade.service.js b/services/codacy/codacy-grade.service.js
index 17f88a2a42..91fec3bfac 100644
--- a/services/codacy/codacy-grade.service.js
+++ b/services/codacy/codacy-grade.service.js
@@ -50,7 +50,7 @@ export default class CodacyGrade extends BaseSvgScrapingService {
       url: `https://api.codacy.com/project/badge/grade/${encodeURIComponent(
         projectId
       )}`,
-      options: { qs: { branch } },
+      options: { searchParams: { branch } },
       errorMessages: { 404: 'project or branch not found' },
       valueMatcher: /visibility="hidden">([^<>]+)<\/text>/,
     })
diff --git a/services/codeclimate/codeclimate-common.js b/services/codeclimate/codeclimate-common.js
index b987317b0b..29a705aa76 100644
--- a/services/codeclimate/codeclimate-common.js
+++ b/services/codeclimate/codeclimate-common.js
@@ -34,7 +34,7 @@ async function fetchRepo(serviceInstance, { user, repo }) {
   } = await serviceInstance._requestJson({
     schema: repoSchema,
     url: 'https://api.codeclimate.com/v1/repos',
-    options: { qs: { github_slug: `${user}/${repo}` } },
+    options: { searchParams: { github_slug: `${user}/${repo}` } },
   })
   if (repoInfo === undefined) {
     throw new NotFound({ prettyMessage: 'repo not found' })
diff --git a/services/codecov/codecov.service.js b/services/codecov/codecov.service.js
index ecafc48cf9..e31a97c74d 100644
--- a/services/codecov/codecov.service.js
+++ b/services/codecov/codecov.service.js
@@ -151,7 +151,7 @@ export default class Codecov extends BaseSvgScrapingService {
       valueMatcher: svgValueMatcher,
       url,
       options: {
-        qs: { token, flag },
+        searchParams: { token, flag },
       },
       errorMessages: token ? { 400: 'invalid token pattern' } : {},
     })
diff --git a/services/codeship/codeship.service.js b/services/codeship/codeship.service.js
index d9a8bde1d6..78a412fb77 100644
--- a/services/codeship/codeship.service.js
+++ b/services/codeship/codeship.service.js
@@ -60,7 +60,7 @@ export default class Codeship extends BaseSvgScrapingService {
     return this._requestSvg({
       schema,
       url,
-      options: { qs: { branch } },
+      options: { searchParams: { branch } },
       valueMatcher: /<g id="status_2">(?:[.\s\S]*)\/><\/g><g id="([\w\s]*)"/,
     })
   }
diff --git a/services/coveralls/coveralls.service.js b/services/coveralls/coveralls.service.js
index 46b0d556a7..840423bf1f 100644
--- a/services/coveralls/coveralls.service.js
+++ b/services/coveralls/coveralls.service.js
@@ -48,7 +48,7 @@ export default class Coveralls extends BaseJsonService {
       vcsType || 'github'
     }/${user}/${repo}.json`
     const options = {
-      qs: {
+      searchParams: {
         // The API returns the latest result (across any branch) if no branch is explicitly specified,
         // whereas the Coveralls native badge (and the Shields.io badges for Coveralls) show
         // the coverage for the default branch if no branch is explicitly specified. If the user
diff --git a/services/debian/debian.service.js b/services/debian/debian.service.js
index 404cc75b3d..1c70f1746f 100644
--- a/services/debian/debian.service.js
+++ b/services/debian/debian.service.js
@@ -38,7 +38,7 @@ export default class Debian extends BaseJsonService {
       schema,
       url: 'https://api.ftp-master.debian.org/madison',
       options: {
-        qs: {
+        searchParams: {
           f: 'json',
           s: distribution,
           package: packageName,
diff --git a/services/dependabot/dependabot.service.js b/services/dependabot/dependabot.service.js
index 57d2cf3a31..376c5d93ab 100644
--- a/services/dependabot/dependabot.service.js
+++ b/services/dependabot/dependabot.service.js
@@ -39,7 +39,9 @@ export default class DependabotSemverCompatibility extends BaseJsonService {
     return this._requestJson({
       schema,
       url,
-      options: { qs: this._getQuery({ packageManager, dependencyName }) },
+      options: {
+        searchParams: this._getQuery({ packageManager, dependencyName }),
+      },
     })
   }
 
diff --git a/services/docker/docker-cloud-common-fetch.js b/services/docker/docker-cloud-common-fetch.js
index 51a5317348..f0047cb576 100644
--- a/services/docker/docker-cloud-common-fetch.js
+++ b/services/docker/docker-cloud-common-fetch.js
@@ -15,7 +15,7 @@ async function fetchBuild(serviceInstance, { user, repo }) {
   return serviceInstance._requestJson({
     schema: cloudBuildSchema,
     url: `https://cloud.docker.com/api/build/v1/source`,
-    options: { qs: { image: `${user}/${repo}` } },
+    options: { searchParams: { image: `${user}/${repo}` } },
     errorMessages: { 404: 'repo not found' },
   })
 }
diff --git a/services/drone/drone-build.service.js b/services/drone/drone-build.service.js
index 5b5986efb6..aa8ec477d1 100644
--- a/services/drone/drone-build.service.js
+++ b/services/drone/drone-build.service.js
@@ -73,7 +73,7 @@ export default class DroneBuild extends BaseJsonService {
         schema,
         url: `${server}/api/repos/${user}/${repo}/builds/latest`,
         options: {
-          qs: { ref: branch ? `refs/heads/${branch}` : undefined },
+          searchParams: { ref: branch ? `refs/heads/${branch}` : undefined },
         },
         errorMessages: {
           401: 'repo not found or not authorized',
diff --git a/services/endpoint-common.js b/services/endpoint-common.js
index 1f3cf8d00c..08d5ca031e 100644
--- a/services/endpoint-common.js
+++ b/services/endpoint-common.js
@@ -64,7 +64,7 @@ async function fetchEndpointData(
     schema: anySchema,
     url,
     errorMessages,
-    options: { gzip: true },
+    options: { decompress: true },
   })
   return validateEndpointData(json, {
     prettyErrorMessage: validationPrettyErrorMessage,
diff --git a/services/freecodecamp/freecodecamp-points.service.js b/services/freecodecamp/freecodecamp-points.service.js
index acf8fb0daa..898ec7e559 100644
--- a/services/freecodecamp/freecodecamp-points.service.js
+++ b/services/freecodecamp/freecodecamp-points.service.js
@@ -48,7 +48,7 @@ export default class FreeCodeCampPoints extends BaseJsonService {
       schema,
       url: `https://api.freecodecamp.org/api/users/get-public-profile`,
       options: {
-        qs: {
+        searchParams: {
           username,
         },
       },
diff --git a/services/github/github-common-fetch.js b/services/github/github-common-fetch.js
index 1cf6c72fd1..25c9a8de19 100644
--- a/services/github/github-common-fetch.js
+++ b/services/github/github-common-fetch.js
@@ -33,7 +33,7 @@ async function fetchRepoContent(
     const { content } = await serviceInstance._requestJson({
       schema: contentSchema,
       url: `/repos/${user}/${repo}/contents/${filename}`,
-      options: { qs: { ref: branch } },
+      options: { searchParams: { ref: branch } },
       errorMessages,
     })
 
diff --git a/services/github/github-contributors.service.js b/services/github/github-contributors.service.js
index 6ad4c713e0..af9b2c6dd1 100644
--- a/services/github/github-contributors.service.js
+++ b/services/github/github-contributors.service.js
@@ -38,7 +38,7 @@ export default class GithubContributors extends GithubAuthV3Service {
 
     const { res, buffer } = await this._request({
       url: `/repos/${user}/${repo}/contributors`,
-      options: { qs: { page: '1', per_page: '1', anon: isAnon } },
+      options: { searchParams: { page: '1', per_page: '1', anon: isAnon } },
       errorMessages: errorMessagesFor('repo not found'),
     })
 
diff --git a/services/github/github-downloads.service.js b/services/github/github-downloads.service.js
index 03b3ed99a4..a70d0c1ada 100644
--- a/services/github/github-downloads.service.js
+++ b/services/github/github-downloads.service.js
@@ -240,7 +240,7 @@ export default class GithubDownloads extends GithubAuthV3Service {
       const allReleases = await this._requestJson({
         schema: releaseArraySchema,
         url: `/repos/${user}/${repo}/releases`,
-        options: { qs: { per_page: 500 } },
+        options: { searchParams: { per_page: 500 } },
         errorMessages: errorMessagesFor('repo not found'),
       })
       releases = allReleases
diff --git a/services/github/github-last-commit.service.js b/services/github/github-last-commit.service.js
index b452fbe96b..509f5422f6 100644
--- a/services/github/github-last-commit.service.js
+++ b/services/github/github-last-commit.service.js
@@ -59,7 +59,7 @@ export default class GithubLastCommit extends GithubAuthV3Service {
   async fetch({ user, repo, branch }) {
     return this._requestJson({
       url: `/repos/${user}/${repo}/commits`,
-      options: { qs: { sha: branch } },
+      options: { searchParams: { sha: branch } },
       schema,
       errorMessages: errorMessagesFor(),
     })
diff --git a/services/github/github-search.service.js b/services/github/github-search.service.js
index 361d1b9eb7..1770e5bca5 100644
--- a/services/github/github-search.service.js
+++ b/services/github/github-search.service.js
@@ -44,7 +44,7 @@ export default class GithubSearch extends GithubAuthV3Service {
     const { total_count: totalCount } = await this._requestJson({
       url: '/search/code',
       options: {
-        qs: {
+        searchParams: {
           q: `${query} repo:${user}/${repo}`,
         },
       },
diff --git a/services/github/github-workflow-status.service.js b/services/github/github-workflow-status.service.js
index f5467d7b2a..d1d47ca0bb 100644
--- a/services/github/github-workflow-status.service.js
+++ b/services/github/github-workflow-status.service.js
@@ -83,7 +83,7 @@ export default class GithubWorkflowStatus extends BaseSvgScrapingService {
       url: `https://github.com/${user}/${repo}/workflows/${encodeURIComponent(
         workflow
       )}/badge.svg`,
-      options: { qs: { branch, event } },
+      options: { searchParams: { branch, event } },
       valueMatcher: />([^<>]+)<\/tspan><\/text><\/g><path/,
       errorMessages: {
         404: 'repo, branch, or workflow not found',
diff --git a/services/gitlab/gitlab-base.js b/services/gitlab/gitlab-base.js
index faa996fd15..f0c73ed8f5 100644
--- a/services/gitlab/gitlab-base.js
+++ b/services/gitlab/gitlab-base.js
@@ -20,7 +20,7 @@ export default class GitLabBase extends BaseJsonService {
   async fetchPage({ page, requestParams, schema }) {
     const { res, buffer } = await this._request({
       ...requestParams,
-      ...{ options: { qs: { page } } },
+      ...{ options: { searchParams: { page } } },
     })
 
     const json = this._parseJson(buffer)
@@ -39,7 +39,7 @@ export default class GitLabBase extends BaseJsonService {
       url,
       options: {
         headers: { Accept: 'application/json' },
-        qs: { per_page: 100 },
+        searchParams: { per_page: 100 },
         ...options,
       },
       errorMessages,
diff --git a/services/gitlab/gitlab-release.service.js b/services/gitlab/gitlab-release.service.js
index 5c63d211c1..4a5f8130e5 100644
--- a/services/gitlab/gitlab-release.service.js
+++ b/services/gitlab/gitlab-release.service.js
@@ -106,7 +106,7 @@ export default class GitLabRelease extends GitLabBase {
         404: 'project not found',
       },
       options: {
-        qs: { order_by: orderBy },
+        searchParams: { order_by: orderBy },
       },
       firstPageOnly: !isSemver,
     })
diff --git a/services/gitlab/gitlab-tag.service.js b/services/gitlab/gitlab-tag.service.js
index 0a732bb4ef..570a089916 100644
--- a/services/gitlab/gitlab-tag.service.js
+++ b/services/gitlab/gitlab-tag.service.js
@@ -95,7 +95,7 @@ export default class GitlabTag extends GitLabBase {
       url: `${baseUrl}/api/v4/projects/${encodeURIComponent(
         project
       )}/repository/tags`,
-      options: { qs: { order_by: 'updated' } },
+      options: { searchParams: { order_by: 'updated' } },
       errorMessages: {
         404: 'repo not found',
       },
diff --git a/services/hsts/hsts.service.js b/services/hsts/hsts.service.js
index c768815d56..ddeae98cfc 100644
--- a/services/hsts/hsts.service.js
+++ b/services/hsts/hsts.service.js
@@ -56,7 +56,7 @@ export default class HSTS extends BaseJsonService {
     return this._requestJson({
       schema,
       url: `https://hstspreload.org/api/v2/status`,
-      options: { qs: { domain } },
+      options: { searchParams: { domain } },
     })
   }
 
diff --git a/services/jenkins/jenkins-base.js b/services/jenkins/jenkins-base.js
index 4579e99773..35398c0301 100644
--- a/services/jenkins/jenkins-base.js
+++ b/services/jenkins/jenkins-base.js
@@ -10,13 +10,13 @@ export default class JenkinsBase extends BaseJsonService {
   async fetch({
     url,
     schema,
-    qs,
+    searchParams,
     errorMessages = { 404: 'instance or job not found' },
   }) {
     return this._requestJson(
       this.authHelper.withBasicAuth({
         url,
-        options: { qs },
+        options: { searchParams },
         schema,
         errorMessages,
       })
diff --git a/services/jenkins/jenkins-build.service.js b/services/jenkins/jenkins-build.service.js
index a6cf8c0327..16ed187603 100644
--- a/services/jenkins/jenkins-build.service.js
+++ b/services/jenkins/jenkins-build.service.js
@@ -72,7 +72,7 @@ export default class JenkinsBuild extends JenkinsBase {
     const json = await this.fetch({
       url: buildUrl({ jobUrl, lastCompletedBuild: false }),
       schema,
-      qs: buildTreeParamQueryString('color'),
+      searchParams: buildTreeParamQueryString('color'),
     })
     const { status } = this.transform({ json })
     return this.constructor.render({ status })
diff --git a/services/jenkins/jenkins-coverage.service.js b/services/jenkins/jenkins-coverage.service.js
index 6f053650ef..b1c3ffb74e 100644
--- a/services/jenkins/jenkins-coverage.service.js
+++ b/services/jenkins/jenkins-coverage.service.js
@@ -118,7 +118,7 @@ export default class JenkinsCoverage extends JenkinsBase {
     const json = await this.fetch({
       url: buildUrl({ jobUrl, plugin: pluginSpecificPath }),
       schema,
-      qs: buildTreeParamQueryString(treeQueryParam),
+      searchParams: buildTreeParamQueryString(treeQueryParam),
       errorMessages: {
         404: 'job or coverage not found',
       },
diff --git a/services/jenkins/jenkins-tests.service.js b/services/jenkins/jenkins-tests.service.js
index a39d933d28..810cf614bb 100644
--- a/services/jenkins/jenkins-tests.service.js
+++ b/services/jenkins/jenkins-tests.service.js
@@ -116,7 +116,9 @@ export default class JenkinsTests extends JenkinsBase {
     const json = await this.fetch({
       url: buildUrl({ jobUrl }),
       schema,
-      qs: buildTreeParamQueryString('actions[failCount,skipCount,totalCount]'),
+      searchParams: buildTreeParamQueryString(
+        'actions[failCount,skipCount,totalCount]'
+      ),
     })
     const { passed, failed, skipped, total } = this.transform({ json })
     return this.constructor.render({
diff --git a/services/jira/jira-sprint.service.js b/services/jira/jira-sprint.service.js
index 875a85e92c..eaf6b0bcc3 100644
--- a/services/jira/jira-sprint.service.js
+++ b/services/jira/jira-sprint.service.js
@@ -86,7 +86,7 @@ export default class JiraSprint extends BaseJsonService {
         url: `${baseUrl}/rest/api/2/search`,
         schema,
         options: {
-          qs: {
+          searchParams: {
             jql: `sprint=${sprintId} AND type IN (Bug,Improvement,Story,"Technical task")`,
             fields: 'resolution',
             maxResults: 500,
diff --git a/services/keybase/keybase-btc.service.js b/services/keybase/keybase-btc.service.js
index f0a3196135..f761169f21 100644
--- a/services/keybase/keybase-btc.service.js
+++ b/services/keybase/keybase-btc.service.js
@@ -58,7 +58,7 @@ export default class KeybaseBTC extends KeybaseProfile {
 
   async handle({ username }) {
     const options = {
-      qs: {
+      searchParams: {
         usernames: username,
         fields: 'cryptocurrency_addresses',
       },
diff --git a/services/keybase/keybase-pgp.service.js b/services/keybase/keybase-pgp.service.js
index 6e049754ec..5f585a8d73 100644
--- a/services/keybase/keybase-pgp.service.js
+++ b/services/keybase/keybase-pgp.service.js
@@ -51,7 +51,7 @@ export default class KeybasePGP extends KeybaseProfile {
 
   async handle({ username }) {
     const options = {
-      qs: {
+      searchParams: {
         usernames: username,
         fields: 'public_keys',
       },
diff --git a/services/keybase/keybase-xlm.service.js b/services/keybase/keybase-xlm.service.js
index d7005ff6f2..1cde6d6663 100644
--- a/services/keybase/keybase-xlm.service.js
+++ b/services/keybase/keybase-xlm.service.js
@@ -56,7 +56,7 @@ export default class KeybaseXLM extends KeybaseProfile {
 
   async handle({ username }) {
     const options = {
-      qs: {
+      searchParams: {
         usernames: username,
         fields: 'stellar',
       },
diff --git a/services/keybase/keybase-zec.service.js b/services/keybase/keybase-zec.service.js
index 399a61e588..8cb5746145 100644
--- a/services/keybase/keybase-zec.service.js
+++ b/services/keybase/keybase-zec.service.js
@@ -58,7 +58,7 @@ export default class KeybaseZEC extends KeybaseProfile {
 
   async handle({ username }) {
     const options = {
-      qs: {
+      searchParams: {
         usernames: username,
         fields: 'cryptocurrency_addresses',
       },
diff --git a/services/librariesio/librariesio-api-provider.js b/services/librariesio/librariesio-api-provider.js
index 8dd9da64c9..07e140a767 100644
--- a/services/librariesio/librariesio-api-provider.js
+++ b/services/librariesio/librariesio-api-provider.js
@@ -89,9 +89,9 @@ export default class LibrariesIoApiProvider {
           'User-Agent': userAgent,
           ...options.headers,
         },
-        qs: {
+        searchParams: {
           api_key: tokenString,
-          ...options.qs,
+          ...options.searchParams,
         },
       },
     }
diff --git a/services/localizely/localizely.service.js b/services/localizely/localizely.service.js
index 1e8ac60608..47c301453b 100644
--- a/services/localizely/localizely.service.js
+++ b/services/localizely/localizely.service.js
@@ -108,7 +108,7 @@ export default class Localizely extends BaseJsonService {
       schema,
       url: `https://api.localizely.com/v1/projects/${projectId}/status`,
       options: {
-        qs: { branch },
+        searchParams: { branch },
         headers: { 'X-Api-Token': apiToken },
       },
       errorMessages: {
diff --git a/services/matrix/matrix.service.js b/services/matrix/matrix.service.js
index ca2dca02c5..fa02bcbdbb 100644
--- a/services/matrix/matrix.service.js
+++ b/services/matrix/matrix.service.js
@@ -106,7 +106,7 @@ export default class Matrix extends BaseJsonService {
       schema: matrixRegisterSchema,
       options: {
         method: 'POST',
-        qs: guest
+        searchParams: guest
           ? {
               kind: 'guest',
             }
@@ -131,7 +131,7 @@ export default class Matrix extends BaseJsonService {
       )}`,
       schema: matrixAliasLookupSchema,
       options: {
-        qs: {
+        searchParams: {
           access_token: accessToken,
         },
       },
@@ -170,7 +170,7 @@ export default class Matrix extends BaseJsonService {
       )}/state`,
       schema: matrixStateSchema,
       options: {
-        qs: {
+        searchParams: {
           access_token: accessToken,
         },
       },
diff --git a/services/mozilla-observatory/mozilla-observatory.service.js b/services/mozilla-observatory/mozilla-observatory.service.js
index 8f436056c2..4b83a059a3 100644
--- a/services/mozilla-observatory/mozilla-observatory.service.js
+++ b/services/mozilla-observatory/mozilla-observatory.service.js
@@ -102,7 +102,7 @@ export default class MozillaObservatory extends BaseJsonService {
       url: `https://http-observatory.security.mozilla.org/api/v1/analyze`,
       options: {
         method: 'POST',
-        qs: { host },
+        searchParams: { host },
         form: { hidden: !publish },
       },
     })
diff --git a/services/nexus/nexus.service.js b/services/nexus/nexus.service.js
index 67451ef0c9..a160fe9ff1 100644
--- a/services/nexus/nexus.service.js
+++ b/services/nexus/nexus.service.js
@@ -162,7 +162,7 @@ export default class Nexus extends BaseJsonService {
     }
   }
 
-  addQueryParamsToQueryString({ qs, queryOpt }) {
+  addQueryParamsToQueryString({ searchParams, queryOpt }) {
     // Users specify query options with 'key=value' pairs, using a
     // colon delimiter between pairs ([:k1=v1[:k2=v2[...]]]).
     // queryOpt will be a string containing those key/value pairs,
@@ -172,7 +172,7 @@ export default class Nexus extends BaseJsonService {
       const paramParts = keyValuePair.split('=')
       const paramKey = paramParts[0]
       const paramValue = paramParts[1]
-      qs[paramKey] = paramValue
+      searchParams[paramKey] = paramValue
     })
   }
 
@@ -194,7 +194,7 @@ export default class Nexus extends BaseJsonService {
   }
 
   async fetch2({ server, repo, groupId, artifactId, queryOpt }) {
-    const qs = {
+    const searchParams = {
       g: groupId,
       a: artifactId,
     }
@@ -209,19 +209,19 @@ export default class Nexus extends BaseJsonService {
     } else {
       schema = nexus2ResolveApiSchema
       url += 'service/local/artifact/maven/resolve'
-      qs.r = repo
-      qs.v = 'LATEST'
+      searchParams.r = repo
+      searchParams.v = 'LATEST'
     }
 
     if (queryOpt) {
-      this.addQueryParamsToQueryString({ qs, queryOpt })
+      this.addQueryParamsToQueryString({ searchParams, queryOpt })
     }
 
     const json = await this._requestJson(
       this.authHelper.withBasicAuth({
         schema,
         url,
-        options: { qs },
+        options: { searchParams },
         errorMessages: {
           404: 'artifact not found',
         },
@@ -232,7 +232,7 @@ export default class Nexus extends BaseJsonService {
   }
 
   async fetch3({ server, repo, groupId, artifactId, queryOpt }) {
-    const qs = {
+    const searchParams = {
       group: groupId,
       name: artifactId,
       sort: 'version',
@@ -240,18 +240,18 @@ export default class Nexus extends BaseJsonService {
 
     switch (repo) {
       case 's':
-        qs.prerelease = 'true'
+        searchParams.prerelease = 'true'
         break
       case 'r':
-        qs.prerelease = 'false'
+        searchParams.prerelease = 'false'
         break
       default:
-        qs.repository = repo
+        searchParams.repository = repo
         break
     }
 
     if (queryOpt) {
-      this.addQueryParamsToQueryString({ qs, queryOpt })
+      this.addQueryParamsToQueryString({ searchParams, queryOpt })
     }
 
     const url = `${server}${
@@ -262,7 +262,7 @@ export default class Nexus extends BaseJsonService {
       this.authHelper.withBasicAuth({
         schema: nexus3SearchApiSchema,
         url,
-        options: { qs },
+        options: { searchParams },
         errorMessages: {
           404: 'artifact not found',
         },
diff --git a/services/nodeping/nodeping-status.service.js b/services/nodeping/nodeping-status.service.js
index 32d145b995..65ead9a649 100644
--- a/services/nodeping/nodeping-status.service.js
+++ b/services/nodeping/nodeping-status.service.js
@@ -40,7 +40,7 @@ export default class NodePingStatus extends BaseJsonService {
       schema,
       url: `https://nodeping.com/reports/results/${checkUuid}/1`,
       options: {
-        qs: { format: 'json' },
+        searchParams: { format: 'json' },
         headers: {
           'cache-control': 'no-cache',
         },
diff --git a/services/nodeping/nodeping-uptime.service.js b/services/nodeping/nodeping-uptime.service.js
index 827ac7b6a8..fa1e2d9a63 100644
--- a/services/nodeping/nodeping-uptime.service.js
+++ b/services/nodeping/nodeping-uptime.service.js
@@ -61,7 +61,11 @@ export default class NodePingUptime extends BaseJsonService {
       schema,
       url: `https://nodeping.com/reports/uptime/${checkUuid}`,
       options: {
-        qs: { format: 'json', interval: 'days', start: thirtyDaysAgo },
+        searchParams: {
+          format: 'json',
+          interval: 'days',
+          start: thirtyDaysAgo,
+        },
         headers: {
           'cache-control': 'no-cache',
         },
diff --git a/services/nuget/nuget-v2-service-family.js b/services/nuget/nuget-v2-service-family.js
index b950a1ed2b..17bfc851ea 100644
--- a/services/nuget/nuget-v2-service-family.js
+++ b/services/nuget/nuget-v2-service-family.js
@@ -58,14 +58,16 @@ async function fetch(
   { odataFormat, baseUrl, packageName, includePrereleases = false }
 ) {
   const url = `${baseUrl}/Packages()`
-  const qs = { $filter: createFilter({ packageName, includePrereleases }) }
+  const searchParams = {
+    $filter: createFilter({ packageName, includePrereleases }),
+  }
 
   let packageData
   if (odataFormat === 'xml') {
     const data = await serviceInstance._requestXml({
       schema: xmlSchema,
       url,
-      options: { qs },
+      options: { searchParams },
     })
     packageData = odataToObject(data.feed.entry)
   } else if (odataFormat === 'json') {
@@ -74,7 +76,7 @@ async function fetch(
       url,
       options: {
         headers: { Accept: 'application/atom+json,application/json' },
-        qs,
+        searchParams,
       },
     })
     packageData = data.d.results[0]
diff --git a/services/nuget/nuget-v3-service-family.js b/services/nuget/nuget-v3-service-family.js
index 3a06cd297e..ff4f37545c 100644
--- a/services/nuget/nuget-v3-service-family.js
+++ b/services/nuget/nuget-v3-service-family.js
@@ -78,7 +78,7 @@ async function fetch(
     schema,
     url: await searchServiceUrl(baseUrl, 'SearchQueryService'),
     options: {
-      qs: {
+      searchParams: {
         q: `packageid:${encodeURIComponent(packageName.toLowerCase())}`,
         // Include prerelease versions.
         prerelease: 'true',
diff --git a/services/opm/opm-version.service.js b/services/opm/opm-version.service.js
index 6d9f41c438..9adc0d179f 100644
--- a/services/opm/opm-version.service.js
+++ b/services/opm/opm-version.service.js
@@ -29,7 +29,7 @@ export default class OpmVersion extends BaseService {
       url: `https://opm.openresty.org/api/pkg/fetch`,
       options: {
         method: 'HEAD',
-        qs: {
+        searchParams: {
           account: user,
           name: moduleName,
         },
diff --git a/services/readthedocs/readthedocs.service.js b/services/readthedocs/readthedocs.service.js
index 7522e69c3f..9b75e04cec 100644
--- a/services/readthedocs/readthedocs.service.js
+++ b/services/readthedocs/readthedocs.service.js
@@ -49,7 +49,7 @@ export default class ReadTheDocs extends BaseSvgScrapingService {
       url: `https://readthedocs.org/projects/${encodeURIComponent(
         project
       )}/badge/`,
-      options: { qs: { version } },
+      options: { searchParams: { version } },
     })
     if (status === 'unknown') {
       throw new NotFound({
diff --git a/services/requires/requires.service.js b/services/requires/requires.service.js
index e3abdacde8..da9cde2af7 100644
--- a/services/requires/requires.service.js
+++ b/services/requires/requires.service.js
@@ -54,7 +54,7 @@ export default class RequiresIo extends BaseJsonService {
     return this._requestJson({
       url,
       schema: statusSchema,
-      options: { qs: { branch } },
+      options: { searchParams: { branch } },
     })
   }
 
diff --git a/services/security-headers/security-headers.service.js b/services/security-headers/security-headers.service.js
index 0b935a871e..103108cbfb 100644
--- a/services/security-headers/security-headers.service.js
+++ b/services/security-headers/security-headers.service.js
@@ -75,7 +75,7 @@ export default class SecurityHeaders extends BaseService {
       url: `https://securityheaders.com`,
       options: {
         method: 'HEAD',
-        qs: {
+        searchParams: {
           q: url,
           hide: 'on',
           followRedirects: ignoreRedirects !== undefined ? null : 'on',
diff --git a/services/snyk/snyk-vulnerability-base.js b/services/snyk/snyk-vulnerability-base.js
index 1316490a71..39a5fd33f9 100644
--- a/services/snyk/snyk-vulnerability-base.js
+++ b/services/snyk/snyk-vulnerability-base.js
@@ -25,12 +25,12 @@ export default class SnykVulnerabilityBase extends BaseSvgScrapingService {
     }
   }
 
-  async fetch({ url, qs, errorMessages }) {
+  async fetch({ url, searchParams, errorMessages }) {
     const { message: vulnerabilities } = await this._requestSvg({
       url,
       schema,
       options: {
-        qs,
+        searchParams,
       },
       errorMessages,
     })
diff --git a/services/snyk/snyk-vulnerability-github.service.js b/services/snyk/snyk-vulnerability-github.service.js
index fd187e7fbe..43c9dd31bb 100644
--- a/services/snyk/snyk-vulnerability-github.service.js
+++ b/services/snyk/snyk-vulnerability-github.service.js
@@ -36,10 +36,10 @@ export default class SnykVulnerabilityGitHub extends SynkVulnerabilityBase {
 
   async handle({ user, repo, manifestFilePath }) {
     const url = `https://snyk.io/test/github/${user}/${repo}/badge.svg`
-    const qs = { targetFile: manifestFilePath }
+    const searchParams = { targetFile: manifestFilePath }
     const { vulnerabilities } = await this.fetch({
       url,
-      qs,
+      searchParams,
       errorMessages: {
         404: 'repo or manifest not found',
       },
diff --git a/services/sonar/sonar-base.js b/services/sonar/sonar-base.js
index 86d86df127..2e4fd807ca 100644
--- a/services/sonar/sonar-base.js
+++ b/services/sonar/sonar-base.js
@@ -55,11 +55,11 @@ export default class SonarBase extends BaseJsonService {
   async fetch({ sonarVersion, server, component, metricName, branch }) {
     const useLegacyApi = isLegacyVersion({ sonarVersion })
 
-    let qs, url, schema
+    let searchParams, url, schema
     if (useLegacyApi) {
       schema = legacySchema
       url = `${server}/api/resources`
-      qs = {
+      searchParams = {
         resource: component,
         depth: 0,
         metrics: metricName,
@@ -72,7 +72,7 @@ export default class SonarBase extends BaseJsonService {
       // componentKey query param was renamed in version 6.6
       const componentKey =
         parseFloat(sonarVersion) >= 6.6 ? 'component' : 'componentKey'
-      qs = {
+      searchParams = {
         [componentKey]: component,
         metricKeys: metricName,
         branch,
@@ -83,7 +83,7 @@ export default class SonarBase extends BaseJsonService {
       this.authHelper.withBasicAuth({
         schema,
         url,
-        options: { qs },
+        options: { searchParams },
         errorMessages: {
           404: 'component or metric not found, or legacy API not supported',
         },
diff --git a/services/sourceforge/sourceforge.service.js b/services/sourceforge/sourceforge.service.js
index 6880bbf09f..a6feca914c 100644
--- a/services/sourceforge/sourceforge.service.js
+++ b/services/sourceforge/sourceforge.service.js
@@ -81,7 +81,7 @@ export default class Sourceforge extends BaseJsonService {
     const endDate = moment().subtract(24, 'hours')
     const startDate = intervalMap[interval].startDate(endDate)
     const options = {
-      qs: {
+      searchParams: {
         start_date: startDate.format('YYYY-MM-DD'),
         end_date: endDate.format('YYYY-MM-DD'),
       },
diff --git a/services/stackexchange/stackexchange-monthlyquestions.service.js b/services/stackexchange/stackexchange-monthlyquestions.service.js
index ff0143c63d..1e74ff3480 100644
--- a/services/stackexchange/stackexchange-monthlyquestions.service.js
+++ b/services/stackexchange/stackexchange-monthlyquestions.service.js
@@ -54,8 +54,8 @@ export default class StackExchangeMonthlyQuestions extends BaseJsonService {
     const parsedData = await this._requestJson({
       schema: tagSchema,
       options: {
-        gzip: true,
-        qs: {
+        decompress: true,
+        searchParams: {
           site: stackexchangesite,
           fromdate: prevMonthStart,
           todate: prevMonthEnd,
diff --git a/services/stackexchange/stackexchange-reputation.service.js b/services/stackexchange/stackexchange-reputation.service.js
index ea8b7b36bb..adda5b0cc6 100644
--- a/services/stackexchange/stackexchange-reputation.service.js
+++ b/services/stackexchange/stackexchange-reputation.service.js
@@ -53,7 +53,7 @@ export default class StackExchangeReputation extends BaseJsonService {
 
     const parsedData = await this._requestJson({
       schema: reputationSchema,
-      options: { gzip: true, qs: { site: stackexchangesite } },
+      options: { decompress: true, searchParams: { site: stackexchangesite } },
       url: `https://api.stackexchange.com/2.2/${path}`,
       errorMessages: {
         400: 'invalid parameters',
diff --git a/services/stackexchange/stackexchange-taginfo.service.js b/services/stackexchange/stackexchange-taginfo.service.js
index af3d5d2557..60a202d8fa 100644
--- a/services/stackexchange/stackexchange-taginfo.service.js
+++ b/services/stackexchange/stackexchange-taginfo.service.js
@@ -50,7 +50,7 @@ export default class StackExchangeQuestions extends BaseJsonService {
 
     const parsedData = await this._requestJson({
       schema: tagSchema,
-      options: { gzip: true, qs: { site: stackexchangesite } },
+      options: { decompress: true, searchParams: { site: stackexchangesite } },
       url: `https://api.stackexchange.com/2.2/${path}`,
     })
 
diff --git a/services/swagger/swagger.service.js b/services/swagger/swagger.service.js
index be41273455..0c24efd9b4 100644
--- a/services/swagger/swagger.service.js
+++ b/services/swagger/swagger.service.js
@@ -55,7 +55,7 @@ export default class SwaggerValidatorService extends BaseJsonService {
       url: 'http://validator.swagger.io/validator/debug',
       schema,
       options: {
-        qs: {
+        searchParams: {
           url: specUrl,
         },
       },
diff --git a/services/teamcity/teamcity-base.js b/services/teamcity/teamcity-base.js
index 1e811a7aef..a3b447c72d 100644
--- a/services/teamcity/teamcity-base.js
+++ b/services/teamcity/teamcity-base.js
@@ -7,11 +7,11 @@ export default class TeamCityBase extends BaseJsonService {
     serviceKey: 'teamcity',
   }
 
-  async fetch({ url, schema, qs = {}, errorMessages = {} }) {
+  async fetch({ url, schema, searchParams = {}, errorMessages = {} }) {
     // JetBrains API Auth Docs: https://confluence.jetbrains.com/display/TCD18/REST+API#RESTAPI-RESTAuthentication
-    const options = { qs }
+    const options = { searchParams }
     if (!this.authHelper.isConfigured) {
-      qs.guest = 1
+      searchParams.guest = 1
     }
 
     return this._requestJson(
diff --git a/services/travis/travis-build.service.js b/services/travis/travis-build.service.js
index 2c52799588..c597958e2c 100644
--- a/services/travis/travis-build.service.js
+++ b/services/travis/travis-build.service.js
@@ -78,7 +78,7 @@ export default class TravisBuild extends BaseSvgScrapingService {
     const { message: status } = await this._requestSvg({
       schema,
       url: `https://api.travis-ci.${domain}/${userRepo}.svg`,
-      options: { qs: { branch } },
+      options: { searchParams: { branch } },
       valueMatcher: />([^<>]+)<\/text><\/g>/,
     })
 
diff --git a/services/treeware/treeware-trees.service.js b/services/treeware/treeware-trees.service.js
index 1fcbc10125..e0b32e217f 100644
--- a/services/treeware/treeware-trees.service.js
+++ b/services/treeware/treeware-trees.service.js
@@ -38,7 +38,7 @@ export default class TreewareTrees extends BaseJsonService {
       url,
       schema: apiSchema,
       options: {
-        qs: { ref: reference },
+        searchParams: { ref: reference },
       },
     })
   }
diff --git a/services/twitch/twitch-base.js b/services/twitch/twitch-base.js
index 85d4e6b083..de34e6fa7b 100644
--- a/services/twitch/twitch-base.js
+++ b/services/twitch/twitch-base.js
@@ -42,7 +42,7 @@ export default class TwitchBase extends BaseJsonService {
           url: `https://id.twitch.tv/oauth2/token`,
           options: {
             method: 'POST',
-            qs: {
+            searchParams: {
               grant_type: 'client_credentials',
             },
           },
diff --git a/services/twitch/twitch-extension-version.service.js b/services/twitch/twitch-extension-version.service.js
index ff4d2295e2..a8393d4854 100644
--- a/services/twitch/twitch-extension-version.service.js
+++ b/services/twitch/twitch-extension-version.service.js
@@ -36,7 +36,7 @@ export default class TwitchExtensionVersion extends TwitchBase {
       schema: helixSchema,
       url: `https://api.twitch.tv/helix/extensions/released`,
       options: {
-        qs: { extension_id: extensionId },
+        searchParams: { extension_id: extensionId },
       },
     })
 
diff --git a/services/twitch/twitch.service.js b/services/twitch/twitch.service.js
index 402f7e52cc..359d19de5e 100644
--- a/services/twitch/twitch.service.js
+++ b/services/twitch/twitch.service.js
@@ -53,7 +53,7 @@ export default class TwitchStatus extends TwitchBase {
       schema: helixSchema,
       url: `https://api.twitch.tv/helix/streams`,
       options: {
-        qs: { user_login: user },
+        searchParams: { user_login: user },
       },
     })
 
diff --git a/services/twitter/twitter.service.js b/services/twitter/twitter.service.js
index 2da76486a0..81086e2408 100644
--- a/services/twitter/twitter.service.js
+++ b/services/twitter/twitter.service.js
@@ -100,7 +100,7 @@ class TwitterFollow extends BaseJsonService {
     return this._requestJson({
       schema,
       url: `http://cdn.syndication.twimg.com/widgets/followbutton/info.json`,
-      options: { qs: { screen_names: user } },
+      options: { searchParams: { screen_names: user } },
     })
   }
 
diff --git a/services/ubuntu/ubuntu.service.js b/services/ubuntu/ubuntu.service.js
index c584c95503..a52d61b14b 100644
--- a/services/ubuntu/ubuntu.service.js
+++ b/services/ubuntu/ubuntu.service.js
@@ -44,7 +44,7 @@ export default class Ubuntu extends BaseJsonService {
       schema,
       url: 'https://api.launchpad.net/1.0/ubuntu/+archive/primary',
       options: {
-        qs: {
+        searchParams: {
           'ws.op': 'getPublishedSources',
           exact_match: 'true',
           order_by_date: 'true',
diff --git a/services/vaadin-directory/vaadin-directory-base.js b/services/vaadin-directory/vaadin-directory-base.js
index b567df2b31..04f702b02a 100644
--- a/services/vaadin-directory/vaadin-directory-base.js
+++ b/services/vaadin-directory/vaadin-directory-base.js
@@ -18,7 +18,7 @@ class BaseVaadinDirectoryService extends BaseJsonService {
       schema,
       url: `https://vaadin.com/vaadincom/directory-service/components/search/findByUrlIdentifier`,
       options: {
-        qs: {
+        searchParams: {
           projection: 'summary',
           urlIdentifier: packageName,
         },
diff --git a/services/w3c/w3c-validation.service.js b/services/w3c/w3c-validation.service.js
index 945fd9a274..070b5cf345 100644
--- a/services/w3c/w3c-validation.service.js
+++ b/services/w3c/w3c-validation.service.js
@@ -67,7 +67,7 @@ export default class W3cValidation extends BaseJsonService {
       url: 'https://validator.nu/',
       schema,
       options: {
-        qs: {
+        searchParams: {
           schema: getSchema(preset),
           parser: parser === 'default' ? undefined : parser,
           doc: encodeURI(targetUrl),
diff --git a/services/wercker/wercker.service.js b/services/wercker/wercker.service.js
index 286c24f21a..263cd542e4 100644
--- a/services/wercker/wercker.service.js
+++ b/services/wercker/wercker.service.js
@@ -93,19 +93,19 @@ export default class Wercker extends BaseJsonService {
 
   async fetch({ projectId, applicationName, branch }) {
     let url
-    const qs = { branch, limit: 1 }
+    const searchParams = { branch, limit: 1 }
 
     if (applicationName) {
       url = `https://app.wercker.com/api/v3/applications/${applicationName}/builds`
     } else {
       url = 'https://app.wercker.com/api/v3/runs'
-      qs.applicationId = projectId
+      searchParams.applicationId = projectId
     }
 
     return this._requestJson({
       schema: werckerSchema,
       url,
-      options: { qs },
+      options: { searchParams },
       errorMessages: {
         401: 'private application not supported',
         404: 'application not found',
diff --git a/services/wikiapiary/wikiapiary-installs.service.js b/services/wikiapiary/wikiapiary-installs.service.js
index 197910829d..6b11ed1567 100644
--- a/services/wikiapiary/wikiapiary-installs.service.js
+++ b/services/wikiapiary/wikiapiary-installs.service.js
@@ -77,7 +77,7 @@ export default class WikiapiaryInstalls extends BaseJsonService {
       schema,
       url: `https://wikiapiary.com/w/api.php`,
       options: {
-        qs: {
+        searchParams: {
           action: 'ask',
           query: `[[${variant}:${name}]]|?Has_website_count`,
           format: 'json',
diff --git a/services/wordpress/wordpress-base.js b/services/wordpress/wordpress-base.js
index 7f660e7262..365e70625f 100644
--- a/services/wordpress/wordpress-base.js
+++ b/services/wordpress/wordpress-base.js
@@ -75,7 +75,7 @@ export default class BaseWordpress extends BaseJsonService {
       url,
       schema: schemas,
       options: {
-        qs: queryString,
+        searchParams: queryString,
       },
     })
     if ('error' in json) {
diff --git a/services/wordpress/wordpress-downloads.service.js b/services/wordpress/wordpress-downloads.service.js
index 538ae6754e..4a9585e250 100644
--- a/services/wordpress/wordpress-downloads.service.js
+++ b/services/wordpress/wordpress-downloads.service.js
@@ -85,7 +85,7 @@ function DownloadsForExtensionType(extensionType) {
           schema: dateSchema,
           url: `https://api.wordpress.org/stats/${extType}/1.0/downloads.php`,
           options: {
-            qs: {
+            searchParams: {
               slug,
               limit,
             },
diff --git a/services/youtube/youtube-base.js b/services/youtube/youtube-base.js
index 94f14ee601..cd2552802a 100644
--- a/services/youtube/youtube-base.js
+++ b/services/youtube/youtube-base.js
@@ -62,7 +62,7 @@ class YouTubeBase extends BaseJsonService {
           schema,
           url: `https://www.googleapis.com/youtube/v3/${this.constructor.type}s`,
           options: {
-            qs: { id, part: 'statistics' },
+            searchParams: { id, part: 'statistics' },
           },
         }
       )
-- 
GitLab