diff --git a/bigbluebutton/api/bigbluebutton.py b/bigbluebutton/api/bigbluebutton.py
index aec5215be2adc7956eb88177a287afa4d0ff1323..00f870c39da7236d59bd243a4c569aa68da23f55 100644
--- a/bigbluebutton/api/bigbluebutton.py
+++ b/bigbluebutton/api/bigbluebutton.py
@@ -142,7 +142,18 @@ class BigBlueButton:
         if res.status_code != 200:
             raise BigBlueButtonError(f"Backend returned HTTP status {res.status_code}.")
 
-        xml = xmltodict.parse(res.text)
+        try:
+            xml = xmltodict.parse(res.text)
+        except Exception as ex:
+            raise BigBlueButtonError("Failed to parse XML response from backend.") from ex
+
+        if xml.get("returncode", "FAILED").upper() == "FAILED":
+            message_key = res.get("messageKey", "")
+            message = res.get("message", "Unknown error")
+
+            ex = BigBlueButtonError(f"Backend returned FAILED response: {message}")
+            ex.message_key = message_key
+            raise ex
 
         return xml["response"]