diff --git a/arkindex/documents/api/entities.py b/arkindex/documents/api/entities.py
index a367855115ee06f1b7294c1b7bd955c71c1bd7ca..60465f9341456b6e16d155b93063f73f76a738ca 100644
--- a/arkindex/documents/api/entities.py
+++ b/arkindex/documents/api/entities.py
@@ -29,6 +29,7 @@ from arkindex.documents.models import (
 )
 from arkindex.documents.serializers.elements import ElementEntitiesSerializer, ElementSlimSerializer
 from arkindex.documents.serializers.entities import (
+    BaseEntitySerializer,
     CreateEntityRoleErrorResponseSerializer,
     EntityCreateSerializer,
     EntityLinkCreateSerializer,
@@ -331,6 +332,22 @@ class ElementEntities(RetrieveAPIView):
         return Element.objects.filter(corpus__in=corpora).select_related('type').only('id', 'type__slug', 'name')
 
 
+@extend_schema_view(
+    get=extend_schema(
+        operation_id='ListCorpusEntities',
+        tags=['entities'],
+    )
+)
+class CorpusEntities(CorpusACLMixin, ListAPIView):
+    """
+    List all entities in a corpus.
+    """
+    serializer_class = BaseEntitySerializer
+
+    def get_queryset(self):
+        return self.get_corpus(self.kwargs['pk']).entities.order_by('name', 'id')
+
+
 @extend_schema_view(get=extend_schema(operation_id='ListElementLinks', tags=['entities']))
 class ElementLinks(CorpusACLMixin, ListAPIView):
     """
diff --git a/arkindex/documents/tests/test_entities_api.py b/arkindex/documents/tests/test_entities_api.py
index d38958f47b5e5b32eeb5f092940457bc37da986c..a284fba789d845ce6cebe39c57830f51985c4939 100644
--- a/arkindex/documents/tests/test_entities_api.py
+++ b/arkindex/documents/tests/test_entities_api.py
@@ -685,6 +685,43 @@ class TestEntitiesAPI(FixtureAPITestCase):
             }]
         )
 
+    def test_list_corpus_entities(self):
+        with self.assertNumQueries(3):
+            response = self.client.get(reverse('api:corpus-entities', kwargs={'pk': str(self.corpus.id)}))
+            self.assertEqual(response.status_code, status.HTTP_200_OK)
+        data = response.json()
+        self.assertDictEqual(data, {
+            'count': 2,
+            'previous': None,
+            'next': None,
+            'number': 1,
+            'results': [
+                {
+                    'id': str(self.entity.id),
+                    'name': 'entity 1',
+                    'type': 'person',
+                    'validated': False,
+                    'dates': [],
+                    'metas': None,
+                    'worker_version_id': str(self.worker_version_1.id),
+                },
+                {
+                    'id': str(self.entity_bis.id),
+                    'name': 'entity 2',
+                    'type': 'location',
+                    'validated': False,
+                    'dates': [],
+                    'metas': None,
+                    'worker_version_id': str(self.worker_version_2.id),
+                }
+            ]
+        })
+
+    def test_list_corpus_entities_acl(self):
+        with self.assertNumQueries(1):
+            response = self.client.get(reverse('api:corpus-entities', kwargs={'pk': str(self.private_corpus.id)}))
+            self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
+
     def test_list_element_entities(self):
         """
         List an element's entities sorted depending on their origin (metadata or transcriptions)
diff --git a/arkindex/project/api_v1.py b/arkindex/project/api_v1.py
index 26d6b27adaff08e8748a89dedeb51cd6f75340fc..79c8fa1c4a01619056aa07320dd3fe72328c0fdc 100644
--- a/arkindex/project/api_v1.py
+++ b/arkindex/project/api_v1.py
@@ -54,6 +54,7 @@ from arkindex.documents.api.elements import (
     WorkerResultsDestroy,
 )
 from arkindex.documents.api.entities import (
+    CorpusEntities,
     CorpusRoles,
     ElementEntities,
     ElementLinks,
@@ -135,6 +136,7 @@ api = [
     # `corpus` and not `pk` so that OpenAPI uses a `corpus` parameter
     path('corpus/<uuid:corpus>/elements/', CorpusElements.as_view(), name='corpus-elements'),
     path('corpus/<uuid:pk>/classes/', CorpusMLClassList.as_view(), name='corpus-classes'),
+    path('corpus/<uuid:pk>/entities/', CorpusEntities.as_view(), name='corpus-entities'),
     path('corpus/<uuid:pk>/roles/', CorpusRoles.as_view(), name='corpus-roles'),
     path('corpus/<uuid:pk>/allowed-metadata/', CorpusAllowedMetaData.as_view(), name='corpus-allowed-metadata'),
     path('corpus/<uuid:pk>/versions/', CorpusWorkerVersionList.as_view(), name='corpus-versions'),