diff --git a/docs/widgets/services/speedtest-tracker.md b/docs/widgets/services/speedtest-tracker.md
index 99b5b993..6352606c 100644
--- a/docs/widgets/services/speedtest-tracker.md
+++ b/docs/widgets/services/speedtest-tracker.md
@@ -8,7 +8,12 @@ Learn more about [Speedtest Tracker](https://github.com/alexjustesen/speedtest-t
 
 No extra configuration is required.
 
-This widget is compatible with both [alexjustesen/speedtest-tracker](https://github.com/alexjustesen/speedtest-tracker) and [henrywhitaker3/Speedtest-Tracker](https://github.com/henrywhitaker3/Speedtest-Tracker).
+Version 1 of the widget is compatible with both [alexjustesen/speedtest-tracker](https://github.com/alexjustesen/speedtest-tracker) and [henrywhitaker3/Speedtest-Tracker](https://github.com/henrywhitaker3/Speedtest-Tracker), while version 2 is only compatible with [alexjustesen/speedtest-tracker](https://github.com/alexjustesen/speedtest-tracker).
+
+| Speedtest Version (AJ) | Speedtest Version (HW) | Homepage Widget Version |
+| ---------------------- | ---------------------- | ----------------------- |
+| < 1.2.1                | ≤ 1.12.0               | 1 (default)             |
+| >= 1.2.1               | N/A                    | 2                       |
 
 Allowed fields: `["download", "upload", "ping"]`.
 
@@ -16,5 +21,7 @@ Allowed fields: `["download", "upload", "ping"]`.
 widget:
   type: speedtest
   url: http://speedtest.host.or.ip
+  version: 1 # optional, default is 1
+  key: speedtestapikey # required for version 2
   bitratePrecision: 3 # optional, default is 0
 ```
diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js
index 53fe47cc..c7b90ec7 100644
--- a/src/utils/config/service-helpers.js
+++ b/src/utils/config/service-helpers.js
@@ -432,7 +432,7 @@ export function cleanServiceGroups(groups) {
           // frigate
           enableRecentEvents,
 
-          // beszel, glances, immich, mealie, pihole, pfsense
+          // beszel, glances, immich, mealie, pihole, pfsense, speedtest
           version,
 
           // glances
@@ -610,7 +610,7 @@ export function cleanServiceGroups(groups) {
           if (snapshotHost) widget.snapshotHost = snapshotHost;
           if (snapshotPath) widget.snapshotPath = snapshotPath;
         }
-        if (["beszel", "glances", "immich", "mealie", "pfsense", "pihole"].includes(type)) {
+        if (["beszel", "glances", "immich", "mealie", "pfsense", "pihole", "speedtest"].includes(type)) {
           if (version) widget.version = parseInt(version, 10);
         }
         if (type === "glances") {
diff --git a/src/utils/proxy/handlers/credentialed.js b/src/utils/proxy/handlers/credentialed.js
index 9a333d6f..5e7d9dd1 100644
--- a/src/utils/proxy/handlers/credentialed.js
+++ b/src/utils/proxy/handlers/credentialed.js
@@ -99,6 +99,11 @@ export default async function credentialedProxyHandler(req, res, map) {
         headers.Authorization = widget.password;
       } else if (widget.type === "gitlab") {
         headers["PRIVATE-TOKEN"] = widget.key;
+      } else if (widget.type === "speedtest") {
+        if (widget.key) {
+          // v1 does not require a key
+          headers.Authorization = `Bearer ${widget.key}`;
+        }
       } else {
         headers["X-API-Key"] = `${widget.key}`;
       }
diff --git a/src/widgets/speedtest/component.jsx b/src/widgets/speedtest/component.jsx
index 9826f776..0cb3b6e4 100644
--- a/src/widgets/speedtest/component.jsx
+++ b/src/widgets/speedtest/component.jsx
@@ -9,18 +9,19 @@ export default function Component({ service }) {
 
   const { widget } = service;
 
-  const { data: speedtestData, error: speedtestError } = useWidgetAPI(widget, "speedtest/latest");
+  const endpoint = widget.version === 2 ? "latestv2" : "latestv1";
+  const { data: speedtestData, error: speedtestError } = useWidgetAPI(widget, endpoint);
 
   const bitratePrecision =
     !widget?.bitratePrecision || Number.isNaN(widget?.bitratePrecision) || widget?.bitratePrecision < 0
       ? 0
       : widget.bitratePrecision;
 
-  if (speedtestError) {
-    return <Container service={service} error={speedtestError} />;
+  if (speedtestError || speedtestData?.error) {
+    return <Container service={service} error={speedtestError ?? speedtestData.error} />;
   }
 
-  if (!speedtestData) {
+  if (!speedtestData?.data) {
     return (
       <Container service={service}>
         <Block label="speedtest.download" />
diff --git a/src/widgets/speedtest/widget.js b/src/widgets/speedtest/widget.js
index 09e0da7c..3517de3c 100644
--- a/src/widgets/speedtest/widget.js
+++ b/src/widgets/speedtest/widget.js
@@ -1,14 +1,18 @@
-import genericProxyHandler from "utils/proxy/handlers/generic";
+import genericProxyHandler from "utils/proxy/handlers/credentialed";
 
 const widget = {
   api: "{url}/api/{endpoint}",
   proxyHandler: genericProxyHandler,
 
   mappings: {
-    "speedtest/latest": {
+    latestv1: {
       endpoint: "speedtest/latest",
       validate: ["data"],
     },
+    latestv2: {
+      endpoint: "v1/results/latest",
+      validate: ["data"],
+    },
   },
 };