diff --git a/src/client/conversation_interface.cpp b/src/client/conversation_interface.cpp
index ce751194c56f517e725813237f944a7ff97dee74..95ce7a68958652b9663586ea0021f02d1c475ed1 100644
--- a/src/client/conversation_interface.cpp
+++ b/src/client/conversation_interface.cpp
@@ -140,8 +140,14 @@ addConversationMember(const std::string& accountId,
                       const std::string& contactUri)
 {
     if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
-        if (auto convModule = acc->convModule(true))
-            convModule->addConversationMember(conversationId, contactUri);
+        if (auto convModule = acc->convModule(true)) {
+            dht::InfoHash h(contactUri);
+            if (not h) {
+                JAMI_ERROR("addConversationMember: invalid contact URI `{}`", contactUri);
+                return;
+            }
+            convModule->addConversationMember(conversationId, h);
+        }
 }
 
 void
@@ -150,8 +156,14 @@ removeConversationMember(const std::string& accountId,
                          const std::string& contactUri)
 {
     if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId))
-        if (auto convModule = acc->convModule(true))
-            convModule->removeConversationMember(conversationId, contactUri);
+        if (auto convModule = acc->convModule(true)) {
+            dht::InfoHash h(contactUri);
+            if (not h) {
+                JAMI_ERROR("removeConversationMember: invalid contact URI `{}`", contactUri);
+                return;
+            }
+            convModule->removeConversationMember(conversationId, h);
+        }
 }
 
 std::vector<std::map<std::string, std::string>>
diff --git a/src/jamidht/conversation_module.cpp b/src/jamidht/conversation_module.cpp
index d5582154ec968be9999072c87deb3863dbfffcf0..d389cf777a1b34aeb7edda35ae41236051546dfd 100644
--- a/src/jamidht/conversation_module.cpp
+++ b/src/jamidht/conversation_module.cpp
@@ -2596,7 +2596,7 @@ ConversationModule::fetchNewCommits(const std::string& peer,
 
 void
 ConversationModule::addConversationMember(const std::string& conversationId,
-                                          const std::string& contactUri,
+                                          const dht::InfoHash& contactUri,
                                           bool sendRequest)
 {
     auto conv = pimpl_->getConversation(conversationId);
@@ -2606,19 +2606,20 @@ ConversationModule::addConversationMember(const std::string& conversationId,
     }
     std::unique_lock lk(conv->mtx);
 
-    if (conv->conversation->isMember(contactUri, true)) {
-        JAMI_DEBUG("{:s} is already a member of {:s}, resend invite", contactUri, conversationId);
+    auto contactUriStr = contactUri.toString();
+    if (conv->conversation->isMember(contactUriStr, true)) {
+        JAMI_DEBUG("{:s} is already a member of {:s}, resend invite", contactUriStr, conversationId);
         // Note: This should not be necessary, but if for whatever reason the other side didn't
         // join we should not forbid new invites
         auto invite = conv->conversation->generateInvitation();
         lk.unlock();
-        pimpl_->sendMsgCb_(contactUri, {}, std::move(invite), 0);
+        pimpl_->sendMsgCb_(contactUriStr, {}, std::move(invite), 0);
         return;
     }
 
     conv->conversation->addMember(
-        contactUri,
-        [this, conv, conversationId, sendRequest, contactUri](bool ok, const std::string& commitId) {
+            contactUriStr,
+        [this, conv, conversationId, sendRequest, contactUriStr](bool ok, const std::string& commitId) {
             if (ok) {
                 std::unique_lock lk(conv->mtx);
                 pimpl_->sendMessageNotification(*conv->conversation,
@@ -2627,7 +2628,7 @@ ConversationModule::addConversationMember(const std::string& conversationId,
                 if (sendRequest) {
                     auto invite = conv->conversation->generateInvitation();
                     lk.unlock();
-                    pimpl_->sendMsgCb_(contactUri, {}, std::move(invite), 0);
+                    pimpl_->sendMsgCb_(contactUriStr, {}, std::move(invite), 0);
                 }
             }
         });
@@ -2635,14 +2636,15 @@ ConversationModule::addConversationMember(const std::string& conversationId,
 
 void
 ConversationModule::removeConversationMember(const std::string& conversationId,
-                                             const std::string& contactUri,
+                                             const dht::InfoHash& contactUri,
                                              bool isDevice)
 {
+    auto contactUriStr = contactUri.toString();
     if (auto conv = pimpl_->getConversation(conversationId)) {
         std::lock_guard lk(conv->mtx);
         if (conv->conversation)
             return conv->conversation->removeMember(
-                contactUri, isDevice, [this, conversationId](bool ok, const std::string& commitId) {
+                    contactUriStr, isDevice, [this, conversationId](bool ok, const std::string& commitId) {
                     if (ok) {
                         pimpl_->sendMessageNotification(conversationId, true, commitId);
                     }
diff --git a/src/jamidht/conversation_module.h b/src/jamidht/conversation_module.h
index bfbd9462b9320b5eee99edeae22b6184733ac49b..546590b8058d2eec19f4a882a46ce25fdc3e9f28 100644
--- a/src/jamidht/conversation_module.h
+++ b/src/jamidht/conversation_module.h
@@ -356,7 +356,7 @@ public:
      * @param sendRequest   If we need to inform the peer (used for tests)
      */
     void addConversationMember(const std::string& conversationId,
-                               const std::string& contactUri,
+                               const dht::InfoHash& contactUri,
                                bool sendRequest = true);
     /**
      * Remove a member from a conversation (this will trigger a member event + new message on success)
@@ -365,7 +365,7 @@ public:
      * @param isDevice
      */
     void removeConversationMember(const std::string& conversationId,
-                                  const std::string& contactUri,
+                                  const dht::InfoHash& contactUri,
                                   bool isDevice = false);
     /**
      * Get members
diff --git a/test/unitTest/conversation/conversation.cpp b/test/unitTest/conversation/conversation.cpp
index a9a0baef78c5503c99033af561a7a5b3305c6b6f..d893aa75816dbd047886151f0321cb95e9e6b8c2 100644
--- a/test/unitTest/conversation/conversation.cpp
+++ b/test/unitTest/conversation/conversation.cpp
@@ -781,7 +781,7 @@ ConversationTest::testMergeTwoDifferentHeads()
     auto convId = libjami::startConversation(aliceId);
 
     auto msgSize = aliceData.messages.size();
-    aliceAccount->convModule()->addConversationMember(convId, carlaUri, false);
+    aliceAccount->convModule()->addConversationMember(convId, dht::InfoHash(carlaUri), false);
     CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return aliceData.messages.size() == msgSize + 1; }));
 
     // Cp conversations & convInfo
diff --git a/test/unitTest/conversation/conversationMembersEvent.cpp b/test/unitTest/conversation/conversationMembersEvent.cpp
index 15405b532ec1b6dfde5b8b02bc713b177e5254d9..7865729c6a25a825dbd4430398daa2020876bda7 100644
--- a/test/unitTest/conversation/conversationMembersEvent.cpp
+++ b/test/unitTest/conversation/conversationMembersEvent.cpp
@@ -1105,7 +1105,7 @@ ConversationMembersEventTest::testMemberJoinsNoBadFile()
     auto convId = libjami::startConversation(aliceId);
 
     auto aliceMsgSize = aliceData.messages.size();
-    aliceAccount->convModule()->addConversationMember(convId, carlaUri, false);
+    aliceAccount->convModule()->addConversationMember(convId, dht::InfoHash(carlaUri), false);
     CPPUNIT_ASSERT(cv.wait_for(lk, 5s, [&] { return aliceMsgSize + 1 == aliceData.messages.size(); }));
 
     // Cp conversations & convInfo
@@ -1164,7 +1164,7 @@ ConversationMembersEventTest::testMemberAddedNoCertificate()
     auto convId = libjami::startConversation(aliceId);
 
     auto aliceMsgSize = aliceData.messages.size();
-    aliceAccount->convModule()->addConversationMember(convId, carlaUri, false);
+    aliceAccount->convModule()->addConversationMember(convId, dht::InfoHash(carlaUri), false);
     CPPUNIT_ASSERT(cv.wait_for(lk, 5s, [&] { return aliceMsgSize + 1 == aliceData.messages.size(); }));
 
     // Cp conversations & convInfo
@@ -1214,7 +1214,7 @@ ConversationMembersEventTest::testMemberJoinsInviteRemoved()
     auto convId = libjami::startConversation(aliceId);
 
     auto aliceMsgSize = aliceData.messages.size();
-    aliceAccount->convModule()->addConversationMember(convId, carlaUri, false);
+    aliceAccount->convModule()->addConversationMember(convId, dht::InfoHash(carlaUri), false);
     CPPUNIT_ASSERT(cv.wait_for(lk, 5s, [&] { return aliceMsgSize + 1 == aliceData.messages.size(); }));
 
     // Cp conversations & convInfo