diff --git a/src/api/client_server/keys.rs b/src/api/client_server/keys.rs
index 2de785fd32bf49dbd3664b708dbfa2d3df547f13..86cfaa495899d0c7ef1900f34903081813800d0c 100644
--- a/src/api/client_server/keys.rs
+++ b/src/api/client_server/keys.rs
@@ -440,25 +440,35 @@ pub(crate) async fn claim_keys_helper(
 
     let mut failures = BTreeMap::new();
 
-    for (server, vec) in get_over_federation {
+    let mut futures: FuturesUnordered<_> = get_over_federation
+        .into_iter()
+        .map(|(server, vec)| async move {
         let mut one_time_keys_input_fed = BTreeMap::new();
-        for (user_id, keys) in vec {
-            one_time_keys_input_fed.insert(user_id.clone(), keys.clone());
-        }
-        // Ignore failures
-        if let Ok(keys) = services()
-            .sending
-            .send_federation_request(
+            for (user_id, keys) in vec {
+                one_time_keys_input_fed.insert(user_id.clone(), keys.clone());
+            }
+            (
                 server,
-                federation::keys::claim_keys::v1::Request {
-                    one_time_keys: one_time_keys_input_fed,
-                },
+                services()
+                    .sending
+                    .send_federation_request(
+                        server,
+                        federation::keys::claim_keys::v1::Request {
+                            one_time_keys: one_time_keys_input_fed,
+                        },
+                    )
+                    .await,
             )
-            .await
-        {
-            one_time_keys.extend(keys.one_time_keys);
-        } else {
-            failures.insert(server.to_string(), json!({}));
+        }).collect();
+
+    while let Some((server, response)) = futures.next().await {
+        match response {
+            Ok(keys) => {
+                one_time_keys.extend(keys.one_time_keys);
+            }
+            Err(_e) => {
+                failures.insert(server.to_string(), json!({}));
+            }
         }
     }