Toutes exigent Authorization: Bearer tock_…. Le paramètre domaine accepte le nom (monsite.fr) ou l'identifiant ; omis, c'est le premier domaine de l'équipe. Les erreurs suivent la forme commune : {"erreur":{"code","message","aide","documentation"}}.
Une page atteinte par deux chemins n'est pas deux pages
Avant de compter les titres et les descriptions en double, l'audit déduplique. Deux lectures qui aboutissent à la même page n'en font qu'une :
- l'URL canonique l'emporte quand la page en déclare une — c'est l'adresse qu'elle revendique elle-même, et celle que les moteurs retiennent ;
- à défaut, l'URL finale, celle atteinte après les redirections. Un domaine nu qui redirige vers son
wwwne produit donc plus de faux doublon ; - la barre finale et le fragment ne distinguent pas deux pages.
Sans cette étape, l'audit reprochait un doublon là où il n'y avait qu'une seule page servie à deux adresses — et poussait à corriger ce qui était correct. Un audit qui reproche un défaut inexistant coûte plus cher qu'un audit qui se tait : il apprend à ignorer les constats suivants.
Les constats nomment les pages concernées. Quand deux racines se ressemblent, l'hôte complet est donné plutôt que deux « / » indiscernables.
GET /api/v1/seo
L'état de visibilité d'un domaine.
| Authentification | clé en lecture ou en écriture |
| Paramètres | domaine (facultatif) |
Réponse 200 | {"seo":{…}} |
| Erreurs | 401 cle_absente / cle_invalide, 404 domaine_inconnu |
L'objet seo porte : domaine, id, gravite, audit (le dernier passage : id, fait_le, origine, pages, requetes, serieux, attention, ok, quota_epuise, ms), conditions_de_citation, robots (un par robot connu : agent, usage, autorise, consequence_si_bloque), constats (cle, titre, gravite, constat, pourquoi, quoi_faire, code, detail, valeur, assume) et sources (source, famille, visiteurs_7j, visiteurs_7j_precedents, effondree).
Le champ code de chaque constat contient le bout à coller — c'est ce qui permet à un agent de proposer un correctif sans le deviner.
POST /api/v1/seo/audits
Lance un audit tout de suite, sans attendre le passage quotidien. Synchrone.
| Authentification | clé en écriture |
| Corps | {"domaine":"monsite.fr"} |
Réponse 201 | {"audit":{"id","pages","serieux","attention","ok"},"seo":{…}} |
| Erreurs | 403 lecture_seule, 404 domaine_inconnu, 429 quota_atteint, 400 corps_invalide |
Le 429 est rendu quand aucune page n'a pu être relue faute de quota. Il est délibérément distinct d'un audit vide : un audit qui n'a rien regardé ne doit jamais passer pour un audit qui n'a rien trouvé.
GET /api/v1/seo/audits
Les derniers passages d'un domaine.
| Authentification | clé en lecture ou en écriture |
| Paramètres | domaine, limite (1 à 100, défaut 12) |
Réponse 200 | {"domaine","audits":[{"id","fait_le","origine","pages","requetes","serieux","attention","ok","quota_epuise","ms"}]} |
| Erreurs | 404 domaine_inconnu |
origine vaut veille (le passage quotidien), manuel (le bouton de l'écran) ou api (cette route).
GET /api/v1/seo/pages
Les pages d'un audit, avec ou sans le détail de leurs constats.
| Authentification | clé en lecture ou en écriture |
| Paramètres | domaine, audit (défaut : le dernier), gravite (ok, attention, serieux, indetermine), url (une seule page), constats=1, format (json ou csv) |
Réponse 200 | {"domaine","audit","pages":[…]} ou un CSV en pièce jointe |
| Erreurs | 404 domaine_inconnu, 404 aucun_audit, 404 page_inconnue, 422 champ_format, 422 champ_gravite |
Chaque page rend url, url_finale, statut, gravite, titre, description, mots_servis, octets, ms et rendu (servi, partiel ou vide). mots_servis est le nombre de mots qu'un robot lit sans exécuter le JavaScript : c'est le chiffre le plus utile du module.
Et `constats=1` ajoute, page par page, le détail de ses vérifications — cle, titre, gravite, constat, pourquoi, quoi_faire, code, detail. C'est le paramètre à connaître : sans lui, gravite dit qu'il y a quelque chose et rien ne dit quoi. Un client a passé une soirée à vérifier à la main les treize points que le module mesure, sur une page marquée « attention », parce que cette phrase énumérait les champs rendus sans dire que ceux-là s'ajoutaient.
Le champ code porte le bout à coller. C'est ce qui permet de proposer un correctif sans le deviner, au niveau où les corrections se font : la page.
url=<adresse complète> rend une seule page. Sur un audit de deux mille pages, filtrer côté client pour en lire une fait transiter deux mille lignes pour rien — et avec constats=1, la charge utile triple. C'est un paramètre et non un segment d'adresse : une URL dans un chemin doit être encodée deux fois, et c'est la source d'erreur la plus banale qu'on puisse offrir.
``bash curl -s "https://letock.fr/api/v1/seo/pages?domaine=monsite.fr&constats=1&url=https%3A%2F%2Fmonsite.fr%2Fblog%2Fun-article" -H "Authorization: Bearer tock_…" ``