diff --git a/bigbluebutton/api/bigbluebutton.py b/bigbluebutton/api/bigbluebutton.py
index 6871d4a6593b2fa81ad0e0c245f9242a6abd4320..99a47adf461fb56bc5c554d5330d2b9c5ded4ab1 100644
--- a/bigbluebutton/api/bigbluebutton.py
+++ b/bigbluebutton/api/bigbluebutton.py
@@ -637,19 +637,25 @@ class BigBlueButtonGroup:
             meeting = self._find_meeting(attrs["meetingID"], filter_meta)
             if meeting:
                 kwargs = Attendee.get_kwargs_from_url_args(attrs, meeting)
+
+                do_join = not (attrs.get("redirect", "true") == "true")
+
                 attendee = Attendee(meeting=meeting, **kwargs)
-                attendee.join()
-
-                # We need to construct this one response manually, because for some inobvious
-                # reason the designers of the BBB API changed their minds and started using
-                # snake_case instead of dromedarCase
-                return {
-                    "meeting_id": meeting.meeting_id,
-                    "user_id": attendee.user_id,
-                    "auth_token": attendee.auth_token,
-                    "session_token": attendee.session_token,
-                    "url": attendee.url,
-                }
+                res = attendee.join(do_join=do_join)
+
+                if do_join:
+                    # We need to construct this one response manually, because for some inobvious
+                    # reason the designers of the BBB API changed their minds and started using
+                    # snake_case instead of dromedarCase
+                    return {
+                        "meeting_id": meeting.meeting_id,
+                        "user_id": attendee.user_id,
+                        "auth_token": attendee.auth_token,
+                        "session_token": attendee.session_token,
+                        "url": attendee.url,
+                    }
+                else:
+                    return res
             else:
                 raise KeyError("Meeting not found.")
         elif method == "isMeetingRunning":
diff --git a/bigbluebutton/django/views.py b/bigbluebutton/django/views.py
index b625553902d84b73a073339b3ad4168a43cf7603..402645afc3a6cdc02a4372b1c5efbaac02482239 100644
--- a/bigbluebutton/django/views.py
+++ b/bigbluebutton/django/views.py
@@ -3,6 +3,7 @@ from typing import Optional
 from django.contrib.sites.shortcuts import get_current_site
 from django.db.models import QuerySet
 from django.http import HttpRequest, HttpResponse
+from django.shortcuts import redirect
 from django.views import View
 
 from defusedxml import minidom
@@ -61,7 +62,11 @@ class APIView(View):
             res = api_token.server_group.api_group.handle_from_data(
                 method, attrs, request.body, filter_meta
             )
-            return self._success("", res)
+
+            if isinstance(res, dict):
+                return self._success("", res)
+            elif isinstance(res, str):
+                return redirect(res)
         except NotImplementedError:
             return self._error(
                 404, "xInfraBlueUnknownAPICall", f"The API call {method} is not known"