diff --git a/src/utils/media-utils.js b/src/utils/media-utils.js
index e4f812b59dd04d2402905e97e8a6e0f29f4e85f9..7d699d172b74d8582741132bd2e28c44d2b4c959 100644
--- a/src/utils/media-utils.js
+++ b/src/utils/media-utils.js
@@ -5,16 +5,21 @@ if (process.env.NODE_ENV === "development") {
   resolveMediaUrl = `https://${process.env.DEV_RETICULUM_SERVER}${resolveMediaUrl}`;
 }
 
+const farsparkCache = new Map();
 export const resolveFarsparkUrl = async url => {
   const parsedUrl = new URL(url);
-  if ((parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") || isHostWhitelisted(parsedUrl.hostname))
-    return { raw: url, origin: url };
+  if (farsparkCache.has(url)) return farsparkCache.get(url);
 
-  return await fetch(resolveMediaUrl, {
-    method: "POST",
-    headers: { "Content-Type": "application/json" },
-    body: JSON.stringify({ media: { url } })
-  }).then(r => r.json());
+  const resolved =
+    (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") || isHostWhitelisted(parsedUrl.hostname)
+      ? { raw: url, origin: url }
+      : await fetch(resolveMediaUrl, {
+          method: "POST",
+          headers: { "Content-Type": "application/json" },
+          body: JSON.stringify({ media: { url } })
+        }).then(r => r.json());
+  farsparkCache.set(url, resolved);
+  return resolved;
 };
 
 let interactableId = 0;