diff --git a/api/funkwhale_api/federation/serializers.py b/api/funkwhale_api/federation/serializers.py
index 42054c7c4b349a834828f263523e66d625fba23a..620c27698e0301c6a7f1f6f7d6c69a016f7de377 100644
--- a/api/funkwhale_api/federation/serializers.py
+++ b/api/funkwhale_api/federation/serializers.py
@@ -176,6 +176,10 @@ class APILibrarySerializer(serializers.ModelSerializer):
         ] + read_only_fields
 
 
+class APILibraryScanSerializer(serializers.Serializer):
+    until = serializers.DateTimeField(required=False)
+
+
 class APILibraryCreateSerializer(serializers.ModelSerializer):
     actor = serializers.URLField()
     federation_enabled = serializers.BooleanField()
diff --git a/api/funkwhale_api/federation/views.py b/api/funkwhale_api/federation/views.py
index cac6c4163c80f562fba01147e5a2d3017619dc1b..9c56728bcb30cf8a7b4adfb51b323f3c90848c23 100644
--- a/api/funkwhale_api/federation/views.py
+++ b/api/funkwhale_api/federation/views.py
@@ -25,6 +25,7 @@ from . import models
 from . import permissions
 from . import renderers
 from . import serializers
+from . import tasks
 from . import utils
 from . import webfinger
 
@@ -186,7 +187,7 @@ class LibraryViewSet(
     )
 
     @list_route(methods=['get'])
-    def scan(self, request, *args, **kwargs):
+    def fetch(self, request, *args, **kwargs):
         account = request.GET.get('account')
         if not account:
             return response.Response(
@@ -195,6 +196,19 @@ class LibraryViewSet(
         data = library.scan_from_account_name(account)
         return response.Response(data)
 
+    @detail_route(methods=['post'])
+    def scan(self, request, *args, **kwargs):
+        library = self.get_object()
+        serializer = serializers.APILibraryScanSerializer(
+            data=request.data
+        )
+        serializer.is_valid(raise_exception=True)
+        id = tasks.scan_library.delay(
+            library_id=library.pk,
+            until=serializer.validated_data['until']
+        )
+        return response.Response({'task': id})
+
     @list_route(methods=['get'])
     def following(self, request, *args, **kwargs):
         library_actor = actors.SYSTEM_ACTORS['library'].get_actor_instance()
diff --git a/api/tests/federation/test_views.py b/api/tests/federation/test_views.py
index 72feaabfda85a4ac20fd3be60231dd4de3b75149..c54cc873ee79145cae492e0369aae4cb77f3de2f 100644
--- a/api/tests/federation/test_views.py
+++ b/api/tests/federation/test_views.py
@@ -1,5 +1,6 @@
-from django.urls import reverse
 from django.core.paginator import Paginator
+from django.urls import reverse
+from django.utils import timezone
 
 import pytest
 
@@ -168,13 +169,13 @@ def test_library_actor_includes_library_link(db, settings, api_client):
     assert response.data['url'] == expected_links
 
 
-def test_can_scan_library(superuser_api_client, mocker):
+def test_can_fetch_library(superuser_api_client, mocker):
     result = {'test': 'test'}
     scan = mocker.patch(
         'funkwhale_api.federation.library.scan_from_account_name',
         return_value=result)
 
-    url = reverse('api:v1:federation:libraries-scan')
+    url = reverse('api:v1:federation:libraries-fetch')
     response = superuser_api_client.get(
         url, data={'account': 'test@test.library'})
 
@@ -306,3 +307,25 @@ def test_can_patch_library(factories, superuser_api_client):
 
     for k, v in data.items():
         assert getattr(library, k) == v
+
+
+def test_scan_library(factories, mocker, superuser_api_client):
+    scan = mocker.patch(
+        'funkwhale_api.federation.tasks.scan_library.delay',
+        return_value='id')
+    library = factories['federation.Library']()
+    now = timezone.now()
+    data = {
+        'until': now,
+    }
+    url = reverse(
+        'api:v1:federation:libraries-scan',
+        kwargs={'uuid': str(library.uuid)})
+    response = superuser_api_client.post(url, data)
+
+    assert response.status_code == 200
+    assert response.data == {'task': 'id'}
+    scan.assert_called_once_with(
+        library_id=library.pk,
+        until=now
+    )
diff --git a/front/src/components/federation/LibraryForm.vue b/front/src/components/federation/LibraryForm.vue
index 5da46dc170bdfa05951e127ab67679a5735156e8..3aec5213d96ff6a3558380db3706233c1187d8b0 100644
--- a/front/src/components/federation/LibraryForm.vue
+++ b/front/src/components/federation/LibraryForm.vue
@@ -72,7 +72,7 @@ export default {
       this.isLoading = true
       self.errors = []
       self.result = null
-      axios.get('/federation/libraries/scan/', {params: {account: this.libraryUsername}}).then((response) => {
+      axios.get('/federation/libraries/fetch/', {params: {account: this.libraryUsername}}).then((response) => {
         self.result = response.data
         self.result.display_name = self.libraryUsername
         self.isLoading = false