diff --git a/scipost_django/api/urls.py b/scipost_django/api/urls.py
index 5422a80a5f0ee61703322bc0376c84a55e58d8cd..197189b2581e98517a4ebb89f1df79dfea56bf19 100644
--- a/scipost_django/api/urls.py
+++ b/scipost_django/api/urls.py
@@ -7,7 +7,7 @@ from django.urls import include, path
 
 from rest_framework import routers
 
-from journals.viewsets import PublicationViewSet
+from journals.viewsets import PublicationViewSet, PubFractionViewSet
 from organizations.api.viewsets import OrganizationViewSet, OrganizationNAPViewSet
 from submissions.viewsets import SubmissionViewSet
 
@@ -24,6 +24,7 @@ router = routers.SimpleRouter()
 
 # journals
 router.register('publications', PublicationViewSet)
+router.register('pubfractions', PubFractionViewSet)
 
 # organizations
 router.register('organizations', OrganizationViewSet)
diff --git a/scipost_django/journals/serializers/__init__.py b/scipost_django/journals/serializers/__init__.py
index b2c066a21d8057bc862862f0ad9204c7dbc8bde4..1281e63f6b8d53fdd0cba2c6b9ded4e113279f3e 100644
--- a/scipost_django/journals/serializers/__init__.py
+++ b/scipost_django/journals/serializers/__init__.py
@@ -3,3 +3,5 @@ __license__ = "AGPL v3"
 
 
 from .publication import PublicationSerializer
+
+from .pubfraction import PubFractionSerializer
diff --git a/scipost_django/journals/serializers/pubfraction.py b/scipost_django/journals/serializers/pubfraction.py
new file mode 100644
index 0000000000000000000000000000000000000000..9131a088816b6215d8ce7040b943824087c498dc
--- /dev/null
+++ b/scipost_django/journals/serializers/pubfraction.py
@@ -0,0 +1,30 @@
+__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
+__license__ = "AGPL v3"
+
+
+from rest_framework import serializers
+
+from ..models import OrgPubFraction
+from journals.serializers import PublicationSerializer
+from organizations.api.serializers import OrganizationSerializer
+
+
+class PubFractionSerializer(serializers.ModelSerializer):
+    organization = OrganizationSerializer(
+        fields=['url', 'name', 'acronym', 'country']
+    )
+    publication = PublicationSerializer(
+        fields=[
+            'url',
+            'title', 'author_list',
+            'doi_label', 'publication_date'
+        ]
+    )
+
+    class Meta:
+        model = OrgPubFraction
+        fields = [
+            'organization',
+            'publication',
+            'fraction'
+        ]
diff --git a/scipost_django/journals/serializers/publication.py b/scipost_django/journals/serializers/publication.py
index 59d16a85d6eb4dc50285e5012ff2212f05154cbc..f39f839d4097f69589075e92184ad2cfbdfe2030 100644
--- a/scipost_django/journals/serializers/publication.py
+++ b/scipost_django/journals/serializers/publication.py
@@ -20,3 +20,17 @@ class PublicationSerializer(serializers.ModelSerializer):
             'publication_date',
             'url'
         ]
+
+    def __init__(self, *args, **kwargs):
+        # Don't pass the 'fields' arg up to the superclass
+        fields = kwargs.pop('fields', None)
+
+        # Instantiate the superclass normally
+        super().__init__(*args, **kwargs)
+
+        if fields is not None:
+            # Drop any fields that are not specified in the `fields` argument.
+            allowed = set(fields)
+            existing = set(self.fields)
+            for field_name in existing - allowed:
+                self.fields.pop(field_name)
diff --git a/scipost_django/journals/viewsets/__init__.py b/scipost_django/journals/viewsets/__init__.py
index 0310997aacfb53a2e3bd76515af386536a6674ca..1087946c3ee5bccaaa2f2b2c38c900be4669626d 100644
--- a/scipost_django/journals/viewsets/__init__.py
+++ b/scipost_django/journals/viewsets/__init__.py
@@ -3,3 +3,4 @@ __license__ = "AGPL v3"
 
 
 from .publication import PublicationViewSet
+from .pubfraction import PubFractionViewSet
diff --git a/scipost_django/journals/viewsets/pubfraction.py b/scipost_django/journals/viewsets/pubfraction.py
new file mode 100644
index 0000000000000000000000000000000000000000..8af8e83f7ab704188892b470f3da07d3a60f04e9
--- /dev/null
+++ b/scipost_django/journals/viewsets/pubfraction.py
@@ -0,0 +1,45 @@
+__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
+__license__ = "AGPL v3"
+
+
+from django_filters import rest_framework as df_filters
+
+from rest_framework import viewsets
+from rest_framework.permissions import AllowAny
+
+from api.viewsets.mixins import FilteringOptionsActionMixin
+
+from ..models import OrgPubFraction
+from ..serializers import PubFractionSerializer
+
+
+class PubFractionFilterSet(df_filters.FilterSet):
+    class Meta:
+        model = OrgPubFraction
+        fields = {
+            'organization__name': ['icontains', 'istartswith', 'exact'],
+            'organization__country': ['exact',],
+            'publication__publication_date': [
+                'year', 'month', 'exact',
+                'year__gte', 'year__lte', 'year__range',
+                'gte', 'lte', 'range'
+            ],
+            'fraction': ['gte', 'lte', 'exact']
+        }
+
+
+class PubFractionViewSet(FilteringOptionsActionMixin,
+                         viewsets.ReadOnlyModelViewSet):
+    queryset = OrgPubFraction.objects.all()
+    permission_classes = [AllowAny,]
+    serializer_class = PubFractionSerializer
+    search_fields = [
+        'organization__name',
+        'publication__publication_date__year'
+    ]
+    ordering_fields = ['-publication_date',]
+    filterset_class = PubFractionFilterSet
+    default_filtering_fields = [
+        'organization__name__icontains',
+        'publication__publication_date__year__exact',
+    ]
diff --git a/scipost_django/organizations/api/serializers.py b/scipost_django/organizations/api/serializers.py
index 6864e040d89179e6fcd36a2c3201f700d2fec7c6..004d556a21a709d99963c2912ba94b7397f00d16 100644
--- a/scipost_django/organizations/api/serializers.py
+++ b/scipost_django/organizations/api/serializers.py
@@ -29,6 +29,20 @@ class OrganizationSerializer(serializers.ModelSerializer):
             'superseded_by',
         ]
 
+    def __init__(self, *args, **kwargs):
+        # Don't pass the 'fields' arg up to the superclass
+        fields = kwargs.pop('fields', None)
+
+        # Instantiate the superclass normally
+        super().__init__(*args, **kwargs)
+
+        if fields is not None:
+            # Drop any fields that are not specified in the `fields` argument.
+            allowed = set(fields)
+            existing = set(self.fields)
+            for field_name in existing - allowed:
+                self.fields.pop(field_name)
+
 
 class OrganizationNAPSerializer(OrganizationSerializer):
     nap = serializers.SerializerMethodField()