diff --git a/services/settings/Attachments.sys.mjs b/services/settings/Attachments.sys.mjs
index d6d1182083c8..03fddd13b7ec 100644
--- a/services/settings/Attachments.sys.mjs
+++ b/services/settings/Attachments.sys.mjs
@@ -158,6 +158,7 @@ export class Downloader {
    * @param {Boolean} [options.fallbackToDump] Use the remote settings dump as a
    *                                         potential source of the attachment.
    *                                         (default: `false`)
+   * @param {string} options.serverUrl
    * @throws {Downloader.DownloadError} if the file could not be fetched.
    * @throws {Downloader.BadContentError} if the downloaded content integrity is not valid.
    * @throws {Downloader.ServerInfoError} if the server response is not valid.
@@ -318,6 +319,7 @@ export class Downloader {
       fallbackToCache = false,
       fallbackToDump = false,
       avoidDownload = false,
+      serverUrl,
     } = options || {};
     if (!attachmentId) {
       // Check for pre-condition. This should not happen, but it is explicitly
@@ -378,6 +380,7 @@ export class Downloader {
         const newBuffer = await this.downloadAsBytes(record, {
           retries,
           checkHash,
+          serverUrl,
         });
         const blob = new Blob([newBuffer]);
         // Store in cache but don't wait for it before returning.
@@ -548,6 +551,7 @@ export class Downloader {
    * @param {Object} options Some download options.
    * @param {Number} options.retries Number of times download should be retried (default: `3`)
    * @param {Boolean} options.checkHash Check content integrity (default: `true`)
+   * @param {String} options.serverUrl
    * @throws {Downloader.DownloadError} if the file could not be fetched.
    * @throws {Downloader.BadContentError} if the downloaded content integrity is not valid.
    * @returns {ArrayBuffer} the file content.
@@ -556,17 +560,17 @@ export class Downloader {
     const {
       attachment: { location, hash, size },
     } = record;
+    const { retries = 3, checkHash = true, serverUrl } = options;
 
     let baseURL;
     try {
-      baseURL = await lazy.Utils.baseAttachmentsURL();
+      baseURL = await lazy.Utils.baseAttachmentsURL(serverUrl);
     } catch (error) {
       throw new Downloader.ServerInfoError(error);
     }
 
     const remoteFileUrl = baseURL + location;
 
-    const { retries = 3, checkHash = true } = options;
     let retried = 0;
     while (true) {
       try {
diff --git a/services/settings/RemoteSettingsClient.sys.mjs b/services/settings/RemoteSettingsClient.sys.mjs
index 6b7c441c8d91..8ce70fe11dca 100644
--- a/services/settings/RemoteSettingsClient.sys.mjs
+++ b/services/settings/RemoteSettingsClient.sys.mjs
@@ -309,6 +309,7 @@ export class RemoteSettingsClient extends EventEmitter {
       localFields = [],
       keepAttachmentsIds = [],
       lastCheckTimePref,
+      serverUrl,
     } = {}
   ) {
     // Remote Settings cannot be used in child processes (no access to disk,
@@ -338,6 +339,7 @@ export class RemoteSettingsClient extends EventEmitter {
     this._lastCheckTimePref = lastCheckTimePref;
     this._verifier = null;
     this._syncRunning = false;
+    this._serverUrl = serverUrl;
 
     // This attribute allows signature verification to be disabled, when running tests
     // or when pulling data from a dev server.
@@ -379,9 +381,12 @@ export class RemoteSettingsClient extends EventEmitter {
   }
 
   httpClient() {
-    const api = new lazy.KintoHttpClient(lazy.Utils.SERVER_URL, {
-      fetchFunc: lazy.Utils.fetch, // Use fetch() wrapper.
-    });
+    const api = new lazy.KintoHttpClient(
+      this._serverUrl || lazy.Utils.SERVER_URL,
+      {
+        fetchFunc: lazy.Utils.fetch, // Use fetch() wrapper.
+      }
+    );
     return api.bucket(this.bucketName).collection(this.collectionName);
   }
 
@@ -609,7 +614,7 @@ export class RemoteSettingsClient extends EventEmitter {
     // We want to know which timestamp we are expected to obtain in order to leverage
     // cache busting. We don't provide ETag because we don't want a 304.
     const { changes } = await lazy.Utils.fetchLatestChanges(
-      lazy.Utils.SERVER_URL,
+      this._serverUrl || lazy.Utils.SERVER_URL,
       {
         filters: {
           collection: this.collectionName,
diff --git a/services/settings/Utils.sys.mjs b/services/settings/Utils.sys.mjs
index 12fef6cde815..3be4356a4060 100644
--- a/services/settings/Utils.sys.mjs
+++ b/services/settings/Utils.sys.mjs
@@ -295,9 +295,9 @@ export var Utils = {
    * const attachmentsURL = await Downloader.baseAttachmentsURL();
    * console.log(attachmentsURL);
    */
-  async baseAttachmentsURL() {
-    if (!_cdnURLs[Utils.SERVER_URL]) {
-      const resp = await Utils.fetch(`${Utils.SERVER_URL}/`);
+  async baseAttachmentsURL(serverUrl = Utils.SERVER_URL) {
+    if (!_cdnURLs[serverUrl]) {
+      const resp = await Utils.fetch(`${serverUrl}/`);
       const serverInfo = await resp.json();
       // Server capabilities expose attachments configuration.
       const {
@@ -306,10 +306,9 @@ export var Utils = {
         },
       } = serverInfo;
       // Make sure the URL always has a trailing slash.
-      _cdnURLs[Utils.SERVER_URL] =
-        base_url + (base_url.endsWith("/") ? "" : "/");
+      _cdnURLs[serverUrl] = base_url + (base_url.endsWith("/") ? "" : "/");
     }
-    return _cdnURLs[Utils.SERVER_URL];
+    return _cdnURLs[serverUrl];
   },
 
   /**
diff --git a/toolkit/components/translations/actors/TranslationsParent.sys.mjs b/toolkit/components/translations/actors/TranslationsParent.sys.mjs
index de242af9add4..631faa77fa00 100644
--- a/toolkit/components/translations/actors/TranslationsParent.sys.mjs
+++ b/toolkit/components/translations/actors/TranslationsParent.sys.mjs
@@ -1545,7 +1545,9 @@ export class TranslationsParent extends JSWindowActorParent {
     }
 
     /** @type {RemoteSettingsClient} */
-    const client = lazy.RemoteSettings("translations-models");
+    const client = lazy.RemoteSettings("translations-models", {
+      serverUrl: "https://firefox.settings.services.mozilla.com/v1",
+    });
     TranslationsParent.#translationModelsRemoteClient = client;
     client.on("sync", TranslationsParent.#handleTranslationsModelsSync);
 
@@ -1911,7 +1913,10 @@ export class TranslationsParent extends JSWindowActorParent {
 
       /** @type {{buffer: ArrayBuffer}} */
       const { buffer } = await client.attachments.download(
-        await TranslationsParent.#bergamotWasmRecord
+        await TranslationsParent.#bergamotWasmRecord,
+        {
+          serverUrl: "https://firefox.settings.services.mozilla.com/v1",
+        }
       );
 
       const duration = Date.now() - start;
@@ -1988,7 +1993,9 @@ export class TranslationsParent extends JSWindowActorParent {
     )) {
       const download = () => {
         lazy.console.log("Downloading record", record.name, record.id);
-        return client.attachments.download(record);
+        return client.attachments.download(record, {
+          serverUrl: "https://firefox.settings.services.mozilla.com/v1",
+        });
       };
       queue.push({ download });
     }
@@ -2012,7 +2019,10 @@ export class TranslationsParent extends JSWindowActorParent {
         onFailure: () => {
           console.error("Failed to download", record.name);
         },
-        download: () => client.attachments.download(record),
+        download: () =>
+          client.attachments.download(record, {
+            serverUrl: "https://firefox.settings.services.mozilla.com/v1",
+          }),
       });
     }
 
@@ -2304,7 +2314,9 @@ export class TranslationsParent extends JSWindowActorParent {
         await chaosMode(1 / 3);
 
         /** @type {{buffer: ArrayBuffer }} */
-        const { buffer } = await client.attachments.download(record);
+        const { buffer } = await client.attachments.download(record, {
+          serverUrl: "https://firefox.settings.services.mozilla.com/v1",
+        });
 
         results[record.fileType] = {
           buffer,
