Index: src/routes/admin-seo.js
===================================================================
--- src/routes/admin-seo.js	(revision 64016815dd12ec86d05866d6d71bca783024094d)
+++ src/routes/admin-seo.js	(revision 013e16c6f24f30b8d59a5c851a20e0d9a6ddef6b)
@@ -19,4 +19,6 @@
 import { requireGod } from '../middleware/auth.js';
 import { getPrimarySite } from '../middleware/site.js';
+import { isMbid } from '../services/ap-core.js';
+import MusicBrainz from '../services/MusicBrainzService.js';
 
 const router = express.Router();
@@ -37,4 +39,5 @@
   renderPage(req, res, 'pages/admin-seo', {
     pageTitleKey: 'admin.t_seo',
+    pageJs: 'admin-seo',
     bodyClass: 'on-admin',
     site,
@@ -42,4 +45,22 @@
     error: req.query.error || null,
   });
+});
+
+/**
+ * "Zoek jezelf op" -- kandidaten uit MusicBrainz (shaer-mbz).
+ *
+ * De zoekopdracht draait HIER en niet in de browser: MusicBrainz staat een
+ * verzoek per seconde toe per APPLICATIE, en dat is alleen af te dwingen als
+ * alles langs een plek gaat. Bovendien eisen ze een User-Agent met contact, en
+ * die kan een browser niet zetten.
+ *
+ * Wij kiezen NIET. Ook niet als er precies een treffer is: een verkeerd geraden
+ * MBID zet jouw naam onder andermans werk.
+ */
+router.get('/api/musicbrainz', requireGod, async (req, res) => {
+  const site = getPrimarySite(req);
+  const q = String(req.query.q || (site && (site.publisher_name || site.title)) || '').trim();
+  if (!q) return res.json({ ok: true, q: '', kandidaten: [] });
+  res.json({ ok: true, q, kandidaten: await MusicBrainz.zoekArtiesten(q) });
 });
 
@@ -72,6 +93,14 @@
       publisher_url = ?,
       publisher_logo = ?,
+      mb_artist_id = ?, mb_artist_name = ?,
       updated_at = CURRENT_TIMESTAMP
     WHERE id = ?
+  // De MusicBrainz-koppeling (shaer-mbz). Alleen een echte MBID komt de kolom
+  // in: zonder deze zeef sluipt er een URL of een handle in het veld dat naar
+  // buiten gaat, en het gaat naar TWEE uitgangen -- de JSON-LD en de actor.
+  // Leeg is een geldige keuze; dat is ontkoppelen.
+  const mbRuw = String(f.mb_artist_id || '').trim().toLowerCase();
+  const mbArtistId = isMbid(mbRuw) ? mbRuw : null;
+
   `).run(
     f.robots_index ? 1 : 0,
@@ -93,4 +122,6 @@
     trimOrNull(f.publisher_url, 200),
     trimOrNull(f.publisher_logo, 500),
+    mbArtistId,
+    mbArtistId ? (String(f.mb_artist_name || '').trim().slice(0, 200) || null) : null,
     primary.id,
   );
Index: src/routes/admin-sites.js
===================================================================
--- src/routes/admin-sites.js	(revision 64016815dd12ec86d05866d6d71bca783024094d)
+++ src/routes/admin-sites.js	(revision 013e16c6f24f30b8d59a5c851a20e0d9a6ddef6b)
@@ -27,5 +27,4 @@
 import { mediaDir } from '../config/paths.js';
 import AP from '../services/ActivityPubService.js';
-import MusicBrainz from '../services/MusicBrainzService.js';
 
 
@@ -323,23 +322,4 @@
 
 // ==================== SAVE ====================
-/**
- * "Ben jij dit?" -- kandidaten uit MusicBrainz (shaer-mbz).
- *
- * De zoekopdracht draait HIER en niet in de browser: MusicBrainz staat een
- * verzoek per seconde toe per APPLICATIE, en dat is alleen af te dwingen als
- * alles langs een plek gaat. Bovendien eisen ze een User-Agent met contact, en
- * die kan een browser niet zetten.
- *
- * Wij kiezen NIET. Ook niet als er precies een treffer is: een verkeerd geraden
- * MBID zet jouw naam onder andermans werk.
- */
-router.get('/:slug/api/musicbrainz', requireSiteManagerBySlug, async (req, res) => {
-  const site = db.prepare('SELECT title, mb_artist_id, mb_artist_name FROM sites WHERE slug = ?').get(req.params.slug);
-  if (!site) return res.status(404).json({ error: 'no_site' });
-  const q = String(req.query.q || site.title || '').trim();
-  if (!q) return res.json({ ok: true, q: '', kandidaten: [] });
-  res.json({ ok: true, q, kandidaten: await MusicBrainz.zoekArtiesten(q) });
-});
-
 router.post('/:slug/save', requireSiteManagerBySlug, async (req, res) => {
   const site = db.prepare('SELECT id, ap_aliases FROM sites WHERE slug = ?').get(req.params.slug);
@@ -366,10 +346,4 @@
   // accent: only accept colors from the curated ACCENTS list. Falls back to
   // the orange default if the submitted value isn't recognised.
-  // De MusicBrainz-koppeling (shaer-mbz). Alleen een echte MBID komt de kolom
-  // in: zonder deze zeef sluipt er een hele URL of een handle in het veld dat
-  // straks naar buiten gaat. Leeg is een geldige keuze -- dat is ontkoppelen.
-  const mbRuw = String(f.mb_artist_id || '').trim().toLowerCase();
-  const mbArtistId = MusicBrainz.isMbid(mbRuw) ? mbRuw : null;
-
   const accent = ThemeService.validateAccent(f.accent) || '#e8b04b';
 
@@ -381,5 +355,4 @@
       profile_links = ?,
       ap_aliases = ?,
-      mb_artist_id = ?, mb_artist_name = ?,
       is_public = ?, robots_index = ?, require_login_to_comment = ?,
       enable_audio_player = ?,
@@ -401,6 +374,4 @@
     profileLinksJson,
     apAliasesJson,
-    mbArtistId,
-    mbArtistId ? (String(f.mb_artist_name || '').trim().slice(0, 200) || null) : null,
     f.is_public ? 1 : 0,
     f.robots_index ? 1 : 0,
