diff --git a/CHANGELOG b/CHANGELOG
index 15eacce4f09d9b5083bcd2625daf333102f3bb67..8c08fccff0eb6aa7d93959f31d08c444db330403 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -40,7 +40,7 @@ The last step involves generating RSA private and public keys for signing
 your instance requests on the federation. This can be done via::
 
     # on docker setups
-    docker-compose --rm api python manage.py generate_keys --no-input
+    docker-compose run --rm api python manage.py generate_keys --no-input
 
     # on non-docker setups
     source /srv/funkwhale/virtualenv/bin/activate
diff --git a/api/funkwhale_api/federation/serializers.py b/api/funkwhale_api/federation/serializers.py
index 62a4500db5f39e92bc9d9dc316deedcca2ab5d76..6e3754203133db56afd44485f45f721ecf61adda 100644
--- a/api/funkwhale_api/federation/serializers.py
+++ b/api/funkwhale_api/federation/serializers.py
@@ -1,6 +1,8 @@
 from django.urls import reverse
 from django.conf import settings
 
+from dynamic_preferences.registries import global_preferences_registry
+
 from . import utils
 
 
@@ -8,6 +10,10 @@ def repr_instance_actor():
     """
     We do not use a serializer here, since it's pretty static
     """
+    actor_url = utils.full_url(reverse('federation:instance-actor'))
+    preferences = global_preferences_registry.manager()
+    public_key = preferences['federation__public_key']
+
     return {
         '@context': [
             'https://www.w3.org/ns/activitystreams',
@@ -18,4 +24,15 @@ def repr_instance_actor():
         'type': 'Service',
         'inbox': utils.full_url(reverse('federation:instance-inbox')),
         'outbox': utils.full_url(reverse('federation:instance-outbox')),
+        'preferredUsername': 'service',
+        'name': 'Service Bot - {}'.format(settings.FEDERATION_HOSTNAME),
+        'summary': 'Bot account for federating with {}'.format(
+            settings.FEDERATION_HOSTNAME
+        ),
+        'publicKey': {
+            'id': '{}#main-key'.format(actor_url),
+            'owner': actor_url,
+            'publicKeyPem': public_key
+        },
+
     }
diff --git a/api/funkwhale_api/federation/urls.py b/api/funkwhale_api/federation/urls.py
index 0c59a1414aee428deadbf0be58ec348bbf3f5317..5b7895451f815924589d1864b30e5ebd63166481 100644
--- a/api/funkwhale_api/federation/urls.py
+++ b/api/funkwhale_api/federation/urls.py
@@ -4,7 +4,7 @@ from . import views
 
 router = routers.SimpleRouter(trailing_slash=False)
 router.register(
-    r'instance',
+    r'federation/instance',
     views.InstanceViewSet,
     'instance')
 router.register(
diff --git a/api/tests/conftest.py b/api/tests/conftest.py
index 41c03856d83aff2da6fc9b82e6a38d0a00e33213..2b5a4f799d0fd23cba94372bdf7415a373eafd66 100644
--- a/api/tests/conftest.py
+++ b/api/tests/conftest.py
@@ -54,7 +54,7 @@ def nodb_factories():
 
 
 @pytest.fixture
-def preferences(db):
+def preferences(db, cache):
     manager = global_preferences_registry.manager()
     manager.all()
     yield manager
diff --git a/api/tests/federation/test_serializers.py b/api/tests/federation/test_serializers.py
new file mode 100644
index 0000000000000000000000000000000000000000..68672e6b404977bcac18603960605691e87874d7
--- /dev/null
+++ b/api/tests/federation/test_serializers.py
@@ -0,0 +1,36 @@
+from django.urls import reverse
+
+from funkwhale_api.federation import keys
+from funkwhale_api.federation import serializers
+
+
+def test_repr_instance_actor(db, preferences, settings):
+    _, public_key = keys.get_key_pair()
+    preferences['federation__public_key'] = public_key.decode('utf-8')
+    settings.FEDERATION_HOSTNAME = 'test.federation'
+    settings.FUNKWHALE_URL = 'https://test.federation'
+    actor_url = settings.FUNKWHALE_URL + reverse('federation:instance-actor')
+    inbox_url = settings.FUNKWHALE_URL + reverse('federation:instance-inbox')
+    outbox_url = settings.FUNKWHALE_URL + reverse('federation:instance-outbox')
+
+    expected = {
+        '@context': [
+            'https://www.w3.org/ns/activitystreams',
+            'https://w3id.org/security/v1',
+            {},
+        ],
+        'id': actor_url,
+        'type': 'Service',
+        'preferredUsername': 'service',
+        'name': 'Service Bot - test.federation',
+        'summary': 'Bot account for federating with test.federation',
+        'inbox': inbox_url,
+        'outbox': outbox_url,
+        'publicKey': {
+            'id': '{}#main-key'.format(actor_url),
+            'owner': actor_url,
+            'publicKeyPem': public_key.decode('utf-8')
+        },
+    }
+
+    assert expected == serializers.repr_instance_actor()
diff --git a/api/tests/federation/test_views.py b/api/tests/federation/test_views.py
index 3d8218c230293211f45b16594d32cdbdc131f2f4..6a8de8c14a8af9944e23860feb2951f07c0a4fc1 100644
--- a/api/tests/federation/test_views.py
+++ b/api/tests/federation/test_views.py
@@ -2,6 +2,7 @@ from django.urls import reverse
 
 import pytest
 
+from funkwhale_api.federation import serializers
 from funkwhale_api.federation import webfinger
 
 
@@ -9,21 +10,9 @@ def test_instance_actor(db, settings, api_client):
     settings.FUNKWHALE_URL = 'http://test.com'
     url = reverse('federation:instance-actor')
     response = api_client.get(url)
-    assert response.data['id'] == (
-      settings.FUNKWHALE_URL + url
-    )
-    assert response.data['type'] == 'Service'
-    assert response.data['inbox'] == (
-      settings.FUNKWHALE_URL + reverse('federation:instance-inbox')
-    )
-    assert response.data['outbox'] == (
-      settings.FUNKWHALE_URL + reverse('federation:instance-outbox')
-    )
-    assert response.data['@context'] == [
-      'https://www.w3.org/ns/activitystreams',
-      'https://w3id.org/security/v1',
-      {},
-    ]
+
+    assert response.status_code == 200
+    assert response.data == serializers.repr_instance_actor()
 
 
 @pytest.mark.parametrize('route', [
diff --git a/api/tests/federation/test_webfinger.py b/api/tests/federation/test_webfinger.py
index 4cee9c8c71083798e8f0156140e0ca5303d358e3..d2b00f8f1c61afee1133c31749f25af1ce6522a4 100644
--- a/api/tests/federation/test_webfinger.py
+++ b/api/tests/federation/test_webfinger.py
@@ -54,12 +54,12 @@ def test_service_serializer(settings):
         'links': [
             {
                 'rel': 'self',
-                'href': 'https://test.federation/instance/actor',
+                'href': 'https://test.federation/federation/instance/actor',
                 'type': 'application/activity+json',
             }
         ],
         'aliases': [
-            'https://test.federation/instance/actor',
+            'https://test.federation/federation/instance/actor',
         ]
     }
 
diff --git a/front/config/index.js b/front/config/index.js
index 925b4defe3fb89ca4879702c7e3eb5b4cdfbbabf..669ce54f37dbfe912cf61dda75b7ccb6366c0824 100644
--- a/front/config/index.js
+++ b/front/config/index.js
@@ -34,7 +34,7 @@ module.exports = {
         changeOrigin: true,
         ws: true,
         filter: function (pathname, req) {
-          let proxified = ['.well-known', 'staticfiles', 'media', 'instance', 'api']
+          let proxified = ['.well-known', 'staticfiles', 'media', 'federation', 'api']
           let matches = proxified.filter(e => {
             return pathname.match(`^/${e}`)
           })