---
page: backlink
sous-page: reservoir
route: /backlink/reservoir
statut: draft
version: 0.1
transverse-liées: [reservoir-data-model (TBD), sources, conventions, i18n, design-system]
date: 2026-06-03
---

# CdC — `backlink/reservoir`

> **Reservoir GLOBAL** (partagé entre tous les sites) des **sources de liens** : à la fois **prospects** (opportunités) et **backlinks existants** (profil acquis). Filtré par **thème + langue**. **Pas d'isolation par site** ici — le site n'intervient qu'en `recherche`/`planning`.

## 1. Objectif

Constituer une **bibliothèque mutualisée** de domaines référents (le « capital netlinking »), réutilisable sur **tous** les sites, où chaque source porte ses **métriques multi-fournisseurs** (TF/CF, DR, DA…), sa **pertinence (thème + langue)**, et l'état de ses **relations par site** (existant / prospect). Sert à **précharger**, **prospecter** et **monitorer** au même endroit ; alimente `recherche`/`planning` par site.

## 2. Périmètre

- **Dans** : pool **global** de `link_source` (domaine, option page) ; métriques **taguées fournisseur** (TF/CF Majestic, DR/referring domains Ahrefs, DA/PA Moz, trafic) + `raw` ; **thème(s) + langue** ; **anti-footprint** (quels sites utilisent déjà une source) ; flags `toxic/disavow` ; filtres/recherche/tri ; dédup/merge de domaines ; détail source (métriques par fournisseur + relations par site).
- **Hors** : triage vers un site (→ `recherche`), campagne/monitoring par site (→ `planning`), connecteurs (→ `export-import`).

## 3. User stories *(persona : consultant SEO / netlinker multi-sites)*

- Je vois **toutes** mes sources de liens au même endroit, filtrées par **thème + langue**.
- Pour un domaine, je vois **TF/CF (Majestic)** et **DR (Ahrefs)** **côte à côte**.
- Je repère qu'un domaine **lie déjà 4 de mes sites** (footprint) → je ne le sur-exploite pas.
- Je distingue **prospects** (opportunités) et **backlinks existants** (profil acquis).
- Je flague un domaine **toxic** et je l'envoie en **disavow**.

## 4. Fonctionnalités

- F1 — **Vue GLOBALE** (le sélecteur de site est **ignoré** ici) ; filtre par **thème + langue**.
- F2 — Table dense des sources : `domaine · langue · thème(s) · TF/CF · DR · DA · referring domains · trafic · type · footprint(n sites) · fournisseurs · maj`.
- F3 — Filtres : thème, langue, **plages** (TF/CF/DR/DA/trafic), type (dofollow/nofollow), **état** (existant / prospect / toxic), fournisseur, tags. Recherche + tri. Vues sauvegardées.
- F4 ⭐ — **Multi-sources miscibles** : métriques par fournisseur côte à côte sur la même source + `raw` conservé.
- F5 ⭐ — **Anti-footprint** : pour une source, **quels sites** la référencent déjà (existants/prospects) ; alerte de sur-exploitation.
- F6 ⭐ — **Pertinence par thème** (Topical Trust Flow) **+ langue** ; mise en avant des sources alignées.
- F7 — **Dédup/merge** de domaines (variantes `www`/non-`www`, sous-domaines).
- F8 — Édition : thème(s), langue, tags, note, **flags `toxic/disavow`**.
- F9 — **Détail source** : métriques par fournisseur (historique), **liste des relations par site** (existant/prospect), ancres connues.

## 5. UI / écrans

- **DataTable globale** virtualisée + filtres (thème/langue en tête) + bulk-actions ; **pas** de sélecteur de site.
- **Sheet détail** : métriques multi-fournisseurs, footprint (badges sites), relations par site.
- Badges d'état (`existant` / `prospect` / `toxic`) — tokens `design.md` (`badge-*`).
- États vide/chargement/erreur ; responsive (table → cards). **Conventions R1/R2** (`_transverse/conventions.md`).

## 6. Données & actions

- **Affiché** : table globale + agrégats (par thème/langue/état) + détail.
- **Actions** : filtrer/trier, éditer (thème/langue/tags/flags), merger, flag toxic→disavow, ouvrir le footprint, envoyer une source en **prospect** pour un site (→ `recherche`/`planning`).

## 7. Modèle de données *(esquisse — détail dans `_transverse/reservoir-data-model.md`, TBD)*

```
link_source(id, domain, domain_norm, language, themes[], type_default,
            tags[], note, flags[toxic, disavow], created, updated)        -- GLOBAL, pas de site_id
link_source_metric(id, link_source_id, provider, tf, cf, dr, da,
            referring_domains, traffic, captured_at, raw JSONB)            -- 1 ligne par (source × fournisseur × snapshot)
backlink(id, link_source_id, target_site_id, target_url?, status,
            link_type, anchor?, first_seen?, last_seen?,
            flags[toxic, disavow], created, updated)                       -- la relation par site
   status ∈ { prospect, planned, in_progress, live, lost }
```

- **`link_source` est global** (clé : `domain_norm`). La dimension « site » vit dans **`backlink`**.
- **Footprint** = agrégat des `backlink` d'une source (par site/statut).
- « **existant** » = `backlink.status = live` ; « **prospect** » = `prospect`/`planned`.
- **Pertinence** = `themes` + `language` (pas de site).
- PG relationnel ; **SurrealDB candidat** pour le graphe source ↔ sites.
- **À trancher** : granularité **domaine** (défaut) vs **page** (URL précise) ?

## 8. API Hono

- `GET /backlinks/sources` *(GLOBAL — filtres thème/langue/plages/état)*
- `GET /backlinks/sources/:id` *(métriques par fournisseur + relations par site)*
- `PATCH /backlinks/sources/:id` *(thème/langue/tags/flags)*
- `POST /backlinks/sources/merge`
- `GET /backlinks/sources/:id/footprint`
- `POST /sites/:siteId/backlinks/prospect` *(marque une source comme prospect pour un site → recherche/planning)*

> ⚠️ Les routes sources sont **globales** (pas de `siteId`), au contraire de keywords. Les **relations** passent par `/sites/:siteId/backlinks/...`.

## 9. Capacités requises *(fonctionnel — mapping modules TBD)*

Stockage **global** de sources · métriques **multi-fournisseurs** + série/historique · dédup de domaines · calcul de **footprint** (source × sites) · scoring de **pertinence** (thème/langue) · filtres/recherche performants.

## 10. Tools / capacités MCP

- `bl_reservoir_query` (read) · `bl_source_get` (read) · `bl_footprint` (read)
- `bl_source_update` (write) · `bl_merge` (write/destructive) · `bl_mark_prospect` (write) · `bl_flag_toxic` (write)

> Privé vs public-limité : **TBD**.

## 11. i18n

- La **langue de la source** est une **dimension de pertinence** (par source), distincte de l'UI. Réf. fiches `hreflang`, `lang-attribute`, `locale-content`.
- UI localisée. Réf `_transverse/i18n.md` (TBD).

## 12. Qualité *(réf. fiches des 128 par slug)*

- **Perf** : table **globale** potentiellement très large → virtualisation, agrégats serveur, index sur `domain_norm`, `(themes, language)`. `core-web-vitals`, `cache-control`.
- **A11y** : `data-tables`, `keyboard-navigation`, `focus-indicators`, `touch-target-size`.
- **Sécu** : données **mutualisées** (pas d'isolation par site ici) → **contrôle d'accès** à définir si multi-utilisateur ; `cookie-attributes`, auth.
- **Indexation** : app privée → `meta-robots` (noindex).

## 13. Critères d'acceptation

- [ ] Filtrer par **thème + langue** retourne les sources pertinentes, sans dépendre d'un site.
- [ ] Une source affiche **TF (Majestic)** et **DR (Ahrefs)** côte à côte (multi-fournisseurs), `raw` conservé.
- [ ] Le **footprint** d'une source liste les sites qui la référencent (existants/prospects).
- [ ] Marquer une source **prospect pour un site** crée un `backlink` visible en `recherche`/`planning`.
- [ ] La **dédup** fusionne `www`/non-`www` du même domaine.
- [ ] Flag **toxic** propage l'option **disavow**.

## 14. Dépendances & risques · questions ouvertes

- **Dépend de** : `_transverse/sources` (Majestic/Ahrefs/Moz), `_transverse/reservoir-data-model` (`link_source` / `backlink`), `backlink/export-import` (alimentation profil + prospects), `backlink/recherche` & `backlink/planning` (relations par site), `_transverse/conventions`.
- **Risques** : volumétrie globale ; dédup de domaines ; **contrôle d'accès** sur données mutualisées ; fiabilité du scoring de pertinence.
- **Questions ouvertes** :
  - Granularité **domaine** vs **page** ?
  - Découverte des **backlinks existants** = import du profil (Ahrefs/Majestic) → quel mapping ?
  - Modèle d'**accès** aux données globales si plusieurs utilisateurs/clients ?
