Rapports SEO

L'application SEO (seo.inklura.fr) tire des données de plusieurs fournisseurs tiers et les assemble en rapports. Comme un rapport complet prend plus de temps qu'un rendu ne l'autorise, la génération s'exécute hors du chemin de rendu sur le task executor à chaud ; la surface développeur se résume à un endpoint POST et à un flux de progression SSE.

Fournisseurs de données

Les données de rapport proviennent d'appels sortants vers ces fournisseurs. Leurs clés d'API vivent dans le store bext KV par application :

Fournisseur Utilisé pour
DataForSEO Résultats SERP + volume / idées de mots-clés.
SE Ranking Données de classement.
GA4 + Google Search Console Trafic + analytics de recherche en lecture seule.
Crawler / spider on-page Audits on-page.
Note

Pour GA4 et Google Search Console, la danse Google OAuth se déroule dans auth.1clic.pro — l'application SEO ne fait que consommer le token qui en résulte, elle n'exécute pas elle-même le flux de consentement.

Le pipeline de rapport asynchrone

C'est la surface développeur principale. Générez un rapport avec :

POST /api/seo/reports
Content-Type: application/json

{ "websiteId": "<id>", "async": true }

La requête est protégée par session. Le comportement dépend de async :

async: true (par défaut)

La route écrit un job KV et le dispatch vers le task executor à chaud :

POST /__bext/sdk/tasks/run
Content-Type: application/json
X-Bext-App-Id: <seo app id>

{
  "task": "seo-report",
  "payload": { "jobId": "…", "websiteId": "…", "userId": "…" },
  "timeout_secs": 600
}

et retourne immédiatement :

202 Accepted

{ "jobId": "<id>", "status": "pending" }

async: false

Le rapport est généré en ligne, dans le délai de rendu (~28s). N'utilisez ceci que pour des rapports assez petits pour se terminer à temps ; tout ce qui est plus lourd devrait rester asynchrone.

Suivre la progression (SSE)

Suivez un job asynchrone via Server-Sent Events :

GET /api/seo/reports/stream?jobId=<id>

La réponse est de type text/event-stream. Le handler sonde le job KV environ toutes les 1,5s, émet des trames event: status et s'auto-termine au bout d'environ 24s — un client EventSource se reconnecte automatiquement et continue de suivre jusqu'à ce que le job soit terminé.

const es = new EventSource(`/api/seo/reports/stream?jobId=${jobId}`);
es.addEventListener("status", (e) => {
  const job = JSON.parse(e.data);
  // met à jour l'UI ; ferme quand le job signale l'achèvement
});

Le task-worker à chaud

Le travail derrière seo-report s'exécute à chaud, hors de tout délai de rendu, sous le superviseur de tâches. L'application enregistre deux tâches :

defineTask("seo-report", async (payload) => { /* construit le rapport */ });
defineTask("seo-weekly", async (payload) => { /* rapport hebdomadaire planifié */ });

Parce qu'elles s'exécutent sur l'executor à chaud plutôt que dans le pool de rendu, un rapport peut prendre autant de temps que son timeout_secs l'autorise.

Autres routes

L'application SEO expose d'autres routes sous /api/seo/*, dont :

/api/seo/audit
/api/seo/keywords
/api/seo/onpage
/api/seo/traffic
/api/seo/websites
/api/seo/geo
/api/seo/research

(et davantage). Le pipeline de rapport ci-dessus est celui sur lequel bâtir votre automatisation.

Voir aussi

  • Tasks — le task executor à chaud qui exécute seo-report
  • KV — où sont stockés l'état des jobs et les clés des fournisseurs
  • Vue d'ensemble des intégrations — la carte des deux mondes