API REST + serveur MCP

API Rapport SEO pour
développeurs et agents IA

Créez des rapports via REST, interrogez-les jusqu'à leur achèvement et lisez le même rapport enregistré que votre équipe voit sur le site web. La même clé API de votre plan payant connecte tout agent compatible MCP.

Modèle d'accès

Plan payant + clé API

L'accès API est lié au compte et verrouillé par clé. Choisissez un plan, créez une clé API dans votre compte, et chaque nouveau site que vous lancez via l'API utilise les crédits de votre plan, exactement comme sur le site web. Les crédits se réinitialisent le premier jour de chaque mois (UTC) et ne sont jamais reportés.

Un objet de rapport

Sessions du site web, appels API, et sessions d'agent lisent à partir du même état de rapport enregistré

Flux simple

Créez un rapport, interrogez son statut, puis lisez les résultats complets depuis le même objet.

Points de terminaison disponibles

POST/api/v1/reports/preview

Créez un aperçu de score pour les intégrations partenaires sur un plan payant.

POST/api/v1/reports

Créez un nouveau rapport ou réutilisez-en un qui existe déjà. Ajoutez "forceRerun": true pour analyser à nouveau le site.

GET/api/v1/reports/:id

Obtenez le dernier statut et les sections du rapport.

GET/api/v1/reports/:id/result

Lisez les résultats complets du rapport.

GET/api/v1/reports/:id/download?format=json

Exporter le payload du rapport en JSON pour les intégrations programmatiques.

Quickstart : un rapport SEO depuis curl

Trois requêtes couvrent l’ensemble du flux, en utilisant une clé API de votre plan payant. La première crée le rapport, la seconde le vérifie jusqu’à ce que son statut ne soit plus en file d’attente ou en cours, et la troisième l’exporte. Un nouveau site utilise un crédit ; relancer un site pour lequel vous avez déjà un rapport ne consomme pas de crédit.

Créer, vérifier et exporter un rapportBash
export SEOREPORT_API_KEY="sr__live_your_api_key"
# Send the key as a header file so it never sits in curl's argv, where ps shows
# it to every local user. printf is a shell builtin, so it spawns no process.
auth() { printf 'Authorization: Bearer %s\n' "$SEOREPORT_API_KEY"; }

# 1. Create a report and keep its job ID
JOB_ID=$(curl -s -X POST https://seoreport.dev/api/v1/reports \
  -H @<(auth) \
  -H "Content-Type: application/json" \
  -d '{"url": "example.com"}' | jq -r '.report.jobId')

# 2. Poll until the report is no longer queued or running
while :; do
  STATUS=$(curl -s "https://seoreport.dev/api/v1/reports/$JOB_ID" \
    -H @<(auth) | jq -r '.report.status')
  case "$STATUS" in queued|running) sleep 3 ;; *) break ;; esac
done
echo "status: $STATUS"

# 3. Export the finished report (format=pdf, md and txt also work)
curl -s "https://seoreport.dev/api/v1/reports/$JOB_ID/download?format=json" \
  -H @<(auth) -o report.json

Ce que renvoie l’API de rapports SEO

Chaque rapport terminé s’exporte en un seul document JSON : le score global et son niveau, un score par domaine, le nombre de pages analysées, les problèmes ouverts par gravité, et chaque constatation dans l’ordre de correction, avec son enjeu, la correction à apporter, la façon de la vérifier, ainsi que les preuves et les pages concernées. Le Markdown, le texte et le PDF sont générés à partir du même diagnostic.

GET /api/v1/reports/:id/download?format=json (extrait)JSON
{
  "exportVersion": 1,
  "jobId": "3f6c2a1e-8d4b-4c7a-9e21-5b0d7f4a6c18",
  "targetUrl": "https://example.com",
  "status": "completed",
  "isSnapshotReady": true,
  "auditedAt": "2026-10-14T09:12:41.000Z",
  "locale": "en",
  "score": { "overall": 72, "band": "stable" },
  "areas": [
    { "id": "access_crawl", "name": "Crawl & Index", "score": 61 },
    { "id": "metadata_onpage", "name": "On-Page SEO", "score": 78 },
    { "id": "security", "name": "Security", "score": 84 }
  ],
  "pagesAnalyzed": 24,
  "openIssues": { "critical": 0, "high": 2, "medium": 5, "low": 3, "total": 10 },
  "findings": [
    {
      "rank": 1,
      "title": "Render parity mismatch",
      "status": "fail",
      "severity": "high",
      "area": { "id": "access_crawl", "name": "Crawl & Index" },
      "whyItMatters": "Raw HTML and rendered DOM should tell the same SEO story so crawlers and AI systems do not see conflicting versions of the page.",
      "fix": "Ensure raw HTML and rendered DOM contain the same critical SEO elements (title, H1, canonical, meta description, structured data). If content is injected by JavaScript, move it to server-side rendering so crawlers see it immediately.",
      "verification": [
        "Recheck these recorded examples: https://example.com/pricing. Method: compare the raw HTML with the rendered DOM. Previously observed: H1 present only after rendering",
        "Expected after the change: the same critical elements in both. Obtain a fresh capture and compare the same check and URLs; a changed sample alone does not verify a fix."
      ],
      "evidence": ["Raw HTML and rendered DOM were compared for critical elements."],
      "pages": ["https://example.com/pricing"]
    }
  ]
}

Erreurs et limites

Chaque refus ci-dessous indique son code. En les gérant, un script ne réessaie jamais à l’aveugle.

402PAYMENT_REQUIREDAucun abonnement payant derrière la requête : la clé est absente, invalide ou révoquée, ou le compte n’a pas d’abonnement actif. Sans clé, la réponse est 402, pas 401.
402REPORT_CREDITS_EXHAUSTEDLes crédits de nouveaux sites du mois sont épuisés. Relancer un site pour lequel vous avez déjà un rapport fonctionne toujours, et les crédits se réinitialisent le premier jour de chaque mois (UTC).
429FRESH_RUN_LIMITPlus de 30 nouvelles exécutions (forceRerun) en une heure pour un même compte. Attendez la durée indiquée par l’en-tête Retry-After.
200status: failed | dead_letteredLe rapport n’a pas pu aboutir. GET /api/v1/reports/:id renvoie error.code, error.message et error.retryable lorsque la cause a été enregistrée ; ne réessayez que si retryable vaut true.
200pollAfterMsLe délai à respecter avant de redemander l’état ; 0 une fois le rapport terminé.

API de surveillance SEO

Un domaine enregistré pour la surveillance est réaudité chaque semaine. Lorsqu’une modification survient, l’adresse d’alerte reçoit un e‑mail : une nouvelle découverte critique ou de haute gravité, une découverte critique résolue, ou un passage à une bande de score différente. Une semaine sans changement n’envoie rien.

PUT/api/v1/monitors

Démarre la surveillance hebdomadaire d’un domaine ; "enabled" : false le met en pause.

GET/api/v1/monitors

Liste les domaines que ce compte surveille.

DELETE/api/v1/monitors?url=

Arrête la surveillance d'un domaine et supprime ses résultats stockés.

Surveiller un domaineBash
# Uses the auth() helper from the quickstart above.
# Re-audit a domain every week and email [email protected] when it changes
curl -X PUT https://seoreport.dev/api/v1/monitors \
  -H @<(auth) \
  -H "Content-Type: application/json" \
  -d '{"url": "example.com", "alertEmail": "[email protected]"}'

# List monitored domains
curl https://seoreport.dev/api/v1/monitors \
  -H @<(auth)

# Stop monitoring (pass the host the list returns)
curl -X DELETE "https://seoreport.dev/api/v1/monitors?url=example.com" \
  -H @<(auth)

La surveillance est incluse avec les plans payants et ne dépense pas de crédits de rapport.

Client officiel TypeScript

Un client typé pour l’API REST. Authentifiez-vous avec la clé API de votre plan, puis créez, vérifiez et exportez des rapports depuis TypeScript.

Ligne de commande

Exécutez des rapports depuis votre terminal avec votre clé API. Une installation globale.

Bash
npm install -g @seoreport/client

Serveur MCP — même API, même clé

Pointez n'importe quel client compatible MCP vers https://seoreport.dev/mcp et authentifiez-vous avec la même clé API Bearer que pour REST. Les outils de rapport et de compte sont annoncés à la connexion : un agent peut lancer un audit et lire les constats sans code intermédiaire.

Configuration du client MCPJSON
{
  "mcpServers": {
    "seoreport": {
      "url": "https://seoreport.dev/mcp",
      "headers": {
        "Authorization": "Bearer sr__live_your_api_key"
      }
    }
  }
}
seoreport_create_report

Lancez un rapport pour une URL et récupérez un identifiant de tâche.

seoreport_get_report_status

Interrogez la tâche jusqu'à ce que le rapport soit prêt.

seoreport_get_report

Lisez le rapport terminé avec son score et ses constats.

seoreport_list_reports

Listez les rapports du compte.

seoreport_get_report_download

Obtenez une URL de téléchargement en JSON, Markdown, texte ou PDF.

seoreport_get_account

Consultez le plan du compte, les crédits restants et la date de renouvellement.

Le paiement renvoie un lien à ouvrir dans le navigateur au lieu de débiter directement : un agent peut l'amorcer, seule une personne peut payer. La résiliation d'un plan, la gestion des clés API et la suppression du compte restent dans votre tableau de bord.

Prêt à construire?

Choisissez un plan, créez une clé API, et commencez à intégrer des rapports SEO dans votre produit.