Index: src/routes/posts.js
===================================================================
--- src/routes/posts.js	(revision 9eb6e1bceee7058678085d70abe8ff4dffe8bff8)
+++ src/routes/posts.js	(revision 86cfa1a2d9b65efe6ad3db8bd0411bedd61b0f82)
@@ -881,5 +881,5 @@
     try { target = await ActivityPubService.resolveRemoteNote(uri, site ? { asSlug: site.slug } : {}); } catch { /* ignore */ }
     // Not a post? Maybe the URI is a profile/actor → offer Follow, not reply.
-    if (!target) { try { followTarget = await ActivityPubService.resolveRemoteActor(uri); } catch { /* ignore */ } }
+    if (!target) { try { followTarget = await ActivityPubService.resolveRemoteActor(uri, site ? { asSlug: site.slug } : {}); } catch { /* ignore */ } }
   }
   renderPage(req, res, 'pages/authorize-interaction', {
Index: src/routes/search.js
===================================================================
--- src/routes/search.js	(revision 9eb6e1bceee7058678085d70abe8ff4dffe8bff8)
+++ src/routes/search.js	(revision 86cfa1a2d9b65efe6ad3db8bd0411bedd61b0f82)
@@ -120,5 +120,7 @@
   if (remote) remoteKind = 'note';
   if (!remote) {
-    try { remote = await ActivityPubService.resolveRemoteActor(remoteUri); } catch { /* onbereikbaar */ }
+    // Ook ondertekend: een profiel op een instance met authorized fetch
+    // (mastodon.social) geeft anders een 401 en leek dan niet te bestaan.
+    try { remote = await ActivityPubService.resolveRemoteActor(remoteUri, { asSlug: site.slug }); } catch { /* onbereikbaar */ }
     if (remote) remoteKind = 'actor';
   }
Index: src/services/ap-following.js
===================================================================
--- src/services/ap-following.js	(revision 9eb6e1bceee7058678085d70abe8ff4dffe8bff8)
+++ src/services/ap-following.js	(revision 86cfa1a2d9b65efe6ad3db8bd0411bedd61b0f82)
@@ -172,9 +172,20 @@
 // authorize_interaction "Follow" flow). Returns display fields + inbox, or null
 // when it isn't a reachable actor (e.g. the input was a post, not a profile).
-export async function resolveRemoteActor(input) {
+//
+// ONDERTEKEND ALLEEN ALS DE AANROEPER DE SITE NOEMT (opts.asSlug). Een instance
+// met authorized fetch (mastodon.social) geeft een onbetekende GET een 401, en
+// dan leek een bestaand profiel te ontbreken -- terwijl een ander Mastodon
+// zonder die instelling het wel toonde. fetchActor probeert eerst onbetekend en
+// tekent pas als dat niet lukt.
+//
+// Tekenen is deze site die voor het verzoek instaat, met haar eigen sleutel.
+// Dat mag alleen namens een ingelogde beheerder van die site: de zoekbalk
+// (achter mayLookUp) en /authorize_interaction (requireSiteManager) zijn de
+// enige die asSlug meegeven. Zonder opts blijft dit onbetekend.
+export async function resolveRemoteActor(input, opts = {}) {
   const s = String(input || '').trim();
   const actorUrl = /^https?:\/\//i.test(s) ? (safeUrl(s) || null) : await webfingerResolve(s);
   if (!actorUrl) return null;
-  const actor = await fetchActor(actorUrl).catch(() => null);
+  const actor = await fetchActor(actorUrl, opts.asSlug ? { asSlug: opts.asSlug } : {}).catch(() => null);
   if (!actor || !actor.id || !actor.inbox) return null;
   const ai = actorInfo(actor, actor.id);
Index: test/search-fediverse.test.js
===================================================================
--- test/search-fediverse.test.js	(revision 9eb6e1bceee7058678085d70abe8ff4dffe8bff8)
+++ test/search-fediverse.test.js	(revision 86cfa1a2d9b65efe6ad3db8bd0411bedd61b0f82)
@@ -51,6 +51,8 @@
   };
 };
-AP.resolveRemoteActor = async (uri) => {
+let actorOpties = [];
+AP.resolveRemoteActor = async (uri, opts) => {
   gevraagd.push(['actor', uri]);
+  actorOpties.push(opts || {});
   if (!uri.includes('/u/')) return null;
   return {
@@ -281,2 +283,42 @@
 });
 
+// ── Een profiel op een instance met authorized fetch ────────────────────────
+//
+// mastodon.social geeft een onbetekende GET van een profiel een 401; arvr.social
+// niet. Het profiel werd onbetekend opgehaald, dus het ene Mastodon toonde een
+// profiel en het andere "niet gevonden". De post-kant was al ondertekend, de
+// profiel-kant niet (gemeten op dev, 30-9: onbetekend niets, als dev gevonden).
+//
+// En de regel eronder: ondertekenen is deze site die voor het verzoek instaat,
+// en dat mag alleen namens een INGELOGDE beheerder. Een bezoeker laat niets
+// ophalen, ondertekend of niet.
+
+test('een profiel wordt ondertekend opgehaald, op de zoekpagina en in de preview', async () => {
+  actorOpties = [];
+  await zoek('https://elders.test/u/oma');
+  assert.equal(actorOpties[0] && actorOpties[0].asSlug, 'robo', 'de zoekpagina haalt het profiel als de site op');
+  actorOpties = [];
+  await preview('https://elders.test/u/oma');
+  assert.equal(actorOpties[0] && actorOpties[0].asSlug, 'robo', 'de preview ook');
+});
+
+test('ook de interactiepagina haalt een profiel ondertekend op', async () => {
+  actorOpties = [];
+  await fetch(`http://127.0.0.1:${poort2}/authorize_interaction?uri=${encodeURIComponent('https://elders.test/u/oma')}`,
+    { signal: AbortSignal.timeout(10000) });
+  assert.equal(actorOpties[0] && actorOpties[0].asSlug, 'robo');
+});
+
+test('niet ingelogd gaat er geen enkel verzoek uit, dus ook geen ondertekend', async () => {
+  ingelogd = false;
+  try {
+    actorOpties = [];
+    await zoek('https://elders.test/u/oma');
+    await preview('https://elders.test/u/oma');
+    assert.deepEqual(gevraagd, [], 'geen post- en geen profielopvraging');
+    assert.deepEqual(actorOpties, [], 'en dus niets dat de sleutel van de site gebruikt');
+  } finally {
+    ingelogd = true;
+  }
+});
+
