diff --git a/Makefile b/Makefile
index 014748ef27a219a7416695ba8ab713f7ea559bb7..34fc384c01c440dd03e4b02f7d3c123d427fc104 100644
--- a/Makefile
+++ b/Makefile
@@ -7,7 +7,7 @@ PIP ?= pip -q
 POETRY ?= poetry
 PYLINT ?= pylint -sn
 PYTEST ?= pytest -v -s --no-header
-PYTHON ?= python3.9
+PYTHON ?= python3.10
 VENV ?= venv
 
 mypy = $(MYPY) --config-file mypy.ini
diff --git a/greg/api/filters.py b/greg/api/filters.py
index b8384d7960ddb9398d564830e4b7d9b7e9e443e4..c71b6be157731961facc75a8732abdac546ce9f1 100644
--- a/greg/api/filters.py
+++ b/greg/api/filters.py
@@ -4,6 +4,7 @@ from django.db.models import Q, When, Case, BooleanField
 from django_filters.rest_framework import (
     BaseInFilter,
     BooleanFilter,
+    CharFilter,
     FilterSet,
 )
 
@@ -26,10 +27,11 @@ class RoleFilter(FilterSet):
 class PersonFilter(FilterSet):
     verified = BooleanFilter(method="verified_filter")
     active = BooleanFilter(method="active_role_filter")
+    role_type = CharFilter(method="role_type_filter")
 
     class Meta:
         model = Person
-        fields = ["first_name", "last_name", "verified", "active"]
+        fields = ["first_name", "last_name", "verified", "active", "role_type"]
 
     def verified_filter(self, queryset, name, value):
         if value is True:
@@ -56,6 +58,9 @@ class PersonFilter(FilterSet):
 
         return queryset
 
+    def role_type_filter(self, queryset, name, value):
+        return queryset.filter(roles__type__identifier=value)
+
 
 class IdentityFilter(FilterSet):
     class Meta:
diff --git a/greg/api/views/person.py b/greg/api/views/person.py
index 6a574d27eec2778c7df2c4e25a718e881c4f4c5f..51b870853ef0897c534cf4aa1528de2b39dcf948 100644
--- a/greg/api/views/person.py
+++ b/greg/api/views/person.py
@@ -47,6 +47,11 @@ class PersonViewSet(viewsets.ModelViewSet):
                 required=False,
                 type=bool,
             ),
+            OpenApiParameter(
+                name="role_type",
+                required=False,
+                type=str,
+            ),
         ]
     )
     def list(self, request, *args, **kwargs):
diff --git a/greg/tests/api/test_person.py b/greg/tests/api/test_person.py
index 9f5d148d1b43446a69e0e976f4719f23e56fd2e5..dc411637cd75d2856c0ae0334816e64fb3884fd1 100644
--- a/greg/tests/api/test_person.py
+++ b/greg/tests/api/test_person.py
@@ -521,6 +521,52 @@ def test_filter_active_value_false(
     assert len(results) == 1
 
 
+@pytest.mark.django_db
+def test_filter_role_type(
+    client: APIClient,
+    person_foo: Person,
+    person: Person,
+    person_bar: Person,
+    role_type_test_guest: Role,
+    sponsor_guy: Sponsor,
+    unit_foo: OrganizationalUnit,
+):
+
+    date_today = datetime.date.today()
+
+    best_test_guest = RoleType.objects.create(
+        identifier="Best Test Guest",
+    )
+
+    Role.objects.create(
+        person=person_foo,
+        type=best_test_guest,
+        end_date=date_today + datetime.timedelta(days=1),
+        sponsor=sponsor_guy,
+        orgunit=unit_foo,
+    )
+    Role.objects.create(
+        person=person,
+        type=role_type_test_guest,
+        end_date=date_today + datetime.timedelta(days=1),
+        sponsor=sponsor_guy,
+        orgunit=unit_foo,
+    )
+    Role.objects.create(
+        person=person_bar,
+        type=role_type_test_guest,
+        end_date=date_today + datetime.timedelta(days=1),
+        sponsor=sponsor_guy,
+        orgunit=unit_foo,
+    )
+
+    url = reverse("v1:person-list")
+    response = client.get(url, {"role_type": "Best Test Guest"})
+    results = response.json()["results"]
+
+    assert len(results) == 1
+
+
 @pytest.mark.django_db
 def test_person_consents_get(
     client: APIClient, person: Person, consent_fixture_choice_yes: Consent