diff --git a/scipost_django/api/urls.py b/scipost_django/api/urls.py
index 6b2f24c73bc7259be32cdc669763c73bbaa08eb7..417b7cb00e98f905dec14e67fecfd2c6da881409 100644
--- a/scipost_django/api/urls.py
+++ b/scipost_django/api/urls.py
@@ -21,7 +21,9 @@ from submissions.api.viewsets import SubmissionPublicAPIViewSet
 from conflicts.viewsets import ConflictOfInterestViewSet
 from news.viewsets import NewsItemViewSet
 
-from . import views
+from api.views.omniauth import OmniAuthUserInfoView
+import api.views.search as search_views
+
 
 app_name = 'api'
 
@@ -51,8 +53,13 @@ urlpatterns += [
 
     path( # /api/omniauth/userinfo/, for SciPost as GitLab/OmniAuth authorization server
         'omniauth/userinfo/',
-        views.OmniAuthUserInfoView.as_view(),
+        OmniAuthUserInfoView.as_view(),
         name='omniauth_userinfo'
     ),
+    path( # /api/available_search_tabs/
+        'available_search_tabs/',
+        search_views.available_search_tabs,
+        name='available_search_tabs'
+    ),
     path('finances/', include('finances.api.urls')),
 ]
diff --git a/scipost_django/api/views/__init__.py b/scipost_django/api/views/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/scipost_django/api/views.py b/scipost_django/api/views/omniauth.py
similarity index 100%
rename from scipost_django/api/views.py
rename to scipost_django/api/views/omniauth.py
diff --git a/scipost_django/api/views/search.py b/scipost_django/api/views/search.py
new file mode 100644
index 0000000000000000000000000000000000000000..fa71b0483b6a6631d9ff0a0cd9f4df8f5a39539d
--- /dev/null
+++ b/scipost_django/api/views/search.py
@@ -0,0 +1,30 @@
+__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
+__license__ = "AGPL v3"
+
+
+import json
+
+from rest_framework.decorators import api_view
+from rest_framework.response import Response
+
+
+@api_view()
+def available_search_tabs(request):
+    """
+    JSON info on Search tabs available for user.
+    """
+    tabsinfo = [
+	{
+	    'objectType': 'publication',
+	    'label': 'publications',
+	    'url': 'publications'
+	},
+	{
+	    'objectType': 'submission',
+	    'label': 'submissions',
+	    'url': 'submissions'
+	},
+    ]
+    if request.user.is_authenticated:
+        pass
+    return Response(tabsinfo)
diff --git a/scipost_django/api/viewsets/base.py b/scipost_django/api/viewsets/base.py
new file mode 100644
index 0000000000000000000000000000000000000000..05d716b90dd2728e71f7c4fb5c0ba595e86cf2fc
--- /dev/null
+++ b/scipost_django/api/viewsets/base.py
@@ -0,0 +1,27 @@
+__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
+__license__ = "AGPL v3"
+
+
+from rest_framework import viewsets
+
+
+class ExtraFilteredReadOnlyModelViewSet(
+        viewsets.ReadOnlyModelViewSet):
+
+    def get_queryset(self):
+        """
+        Filter queryset according to `extra_filterset_fields` attribute.
+        """
+        queryset = super().get_queryset()
+        for (label, queryspec) in self.extra_filters.items():
+            for lookup in queryspec['lookups']:
+                param = self.request.query_params.get(
+                    '%s__%s' % (label, lookup), None)
+                if param:
+                    query = Q()
+                    for field in queryspec['fields']:
+                        querydict = {}
+                        querydict['%s__%s' % (field, lookup)] = param
+                        query = query | Q(**querydict)
+                    queryset = queryset.filter(query)
+        return queryset
diff --git a/scipost_vue/components/Search.vue b/scipost_vue/components/Search.vue
index 62e3b29be1015a023dd58db31db4b760618aa9f1..33862d9fb03b87a28d7866908d0984c215bac76c 100644
--- a/scipost_vue/components/Search.vue
+++ b/scipost_vue/components/Search.vue
@@ -177,6 +177,9 @@
 </template>
 
 <script>
+const headers = new Headers();
+headers.append('Accept', 'application/json; version=0')
+
 import { ref, onMounted } from '@vue/composition-api'
 
 import SearchableObjectsTable from './SearchableObjectsTable.vue'
@@ -193,23 +196,20 @@ export default {
         },
     },
     setup(props, context) {
-	const availableTabs = ref(
-	    [
-		{
-		    objectType: 'publication',
-		    label: 'publications',
-		    url: 'publications'
-		},
-		{
-		    objectType: 'submission',
-		    label: 'submissions',
-		    url: 'submissions'
-		},
-	    ]
-	)
+	const availableTabs = ref([])
 	const initialQuery = ref('')
 
+	const fetchAvailableTabs = async () => {
+	    fetch('/api/available_search_tabs/', {headers: headers})
+		.then(stream => stream.json())
+		.then(data => {
+		    availableTabs.value = data
+		})
+	    .catch(error => console.error(error))
+	}
+
 	onMounted( () => {
+	    fetchAvailableTabs()
 	    initialQuery.value = JSON.parse(document.getElementById('json_q').textContent)
 	})
 	// Close search form in header in case it is open