diff --git a/api/funkwhale_api/users/views.py b/api/funkwhale_api/users/views.py
index 85103afc69e1ce37a88b3c3b6d7b151d6bbc34de..8cbb23bd11fbc445feda2782ac77da8242d4e8c8 100644
--- a/api/funkwhale_api/users/views.py
+++ b/api/funkwhale_api/users/views.py
@@ -28,6 +28,7 @@ class UserViewSet(mixins.UpdateModelMixin, viewsets.GenericViewSet):
     queryset = models.User.objects.all()
     serializer_class = serializers.UserWriteSerializer
     lookup_field = "username"
+    lookup_value_regex = r"[a-zA-Z0-9-_.]+"
     required_scope = "profile"
 
     @action(methods=["get"], detail=False)
diff --git a/api/tests/users/test_views.py b/api/tests/users/test_views.py
index 45e967e1256fb32972cd1c6f156dc99d2f11f883..956a7178cf98641e295cc6369d198cf954fd47e6 100644
--- a/api/tests/users/test_views.py
+++ b/api/tests/users/test_views.py
@@ -230,6 +230,21 @@ def test_user_can_get_subsonic_token(logged_in_api_client):
     assert response.data == {"subsonic_api_token": "test"}
 
 
+def test_user_can_request_new_subsonic_token_uncommon_username(logged_in_api_client):
+    user = logged_in_api_client.user
+    user.username = "firstname.lastname"
+    user.subsonic_api_token = "test"
+    user.save()
+
+    url = reverse(
+        "api:v1:users:users-subsonic-token", kwargs={"username": user.username}
+    )
+
+    response = logged_in_api_client.post(url)
+
+    assert response.status_code == 200
+
+
 def test_user_can_delete_subsonic_token(logged_in_api_client):
     user = logged_in_api_client.user
     user.subsonic_api_token = "test"
diff --git a/changes/changelog.d/798.bugfix b/changes/changelog.d/798.bugfix
new file mode 100644
index 0000000000000000000000000000000000000000..d1cd2eb6c34d224e507b3028b47c8019dfc4d279
--- /dev/null
+++ b/changes/changelog.d/798.bugfix
@@ -0,0 +1 @@
+Allow users with dots in their usernames to request a subsonic password (#798)