Retour à l’outil

API du vérificateur de lien

Une seule route, un seul verbe. Elle rend exactement la structure qu’affiche la page — il n’y a pas de « version API » du rapport, parce que deux descriptions du même résultat finissent toujours par diverger.

Appel

POST /api/verifier-lien
Content-Type: application/json

{ "url": "https://exemple.com/page" }

L’adresse voyage dans le CORPS et non dans l’URL : elle contient souvent un jeton personnel (lien de réinitialisation, invitation, partage de fichier), et un paramètre d’URL finirait dans les journaux d’accès, l’historique du navigateur et l’en-tête Referer de la page suivante. La réponse est no-store pour la même raison.

Réponse — analyse aboutie

{
  "ok": true,
  "rapport": {
    "version": 1,
    "date": 1755172800000,
    "url":        { "saisie", "normalisee", "hote", "hoteUnicode", "domaine",
                    "sousDomaines", "tld", "port", "chemin", "requete", "estIp" },
    "urlFinale":  Constat<string>,
    "redirections": Constat<Saut[]>,
    "domaine":    { "creeLe", "ageJours", "expireLe", "registrar", "statuts" },
    "dns":        { "a", "aaaa", "mx", "ns", "resout" },
    "tls":        { "valide", "emetteur", "sujet", "valideDu", "valideAu",
                    "joursRestants", "noms" },
    "contenu":    { "titre", "champMotDePasse", "formulaireExterne",
                    "typeContenu", "telechargement" },
    "reputation": RapportReputation[],
    "signaux":    Signal[],
    "verdict":    { "indice", "niveau", "confiance", "plafonne",
                    "couverture", "resume" },
    "sources":    SourceUtilisee[],
    "dureeMs":    number
  },
  "consigne": "…",
  "limites": [ "…" ],
  "quotaRestant": 118
}

L’enveloppe Constat<T>

Aucune valeur nue ne traverse ce module. Chaque champ des sections domaine, dns, tls et contenu est une enveloppe. Lisez `statut` AVANT `value` : afficher value sans regarder le statut est un bug, pas un raccourci.

{
  "value":     T | null,
  "statut":    "OBSERVE" | "CALCULE" | "DECLARE"
             | "INDISPONIBLE" | "NON_CONFIGURE" | "ECHEC",
  "source":    "url" | "dns" | "rdap" | "tls" | "http" | "reputation" | "calcul" | "aucune",
  "confiance": "haute" | "moyenne" | "faible",
  "note":      string,   // obligatoire hors OBSERVE / CALCULE
  "vuA":       number | null
}

Verdict

indice est un indice de CONFIANCE sur 100 : il monte vers le sûr, et il n’atteint jamais 0 ni 100. Il n’y a qu’une échelle — afficher tantôt « confiance 92 » et tantôt « risque 87 » mettrait deux échelles inversées dans la même interface.

niveauindicelibellé
faible≥ 78🟢 Risque faible
prudence≥ 38🟡 Prudence
eleve≥ 20🟠 Risque élevé
critique< 28🔴 Danger

plafonne: true signifie que la confiance a EMPÊCHÉ le verdict d’aller au bout de ce que l’indice suggérait. Le plafond joue dans les deux sens : à confiance faible, un lien ne peut être ni déclaré « risque faible », ni déclaré « danger ». Un client qui ignore ce champ affichera un verdict plus tranché que ce que l’analyse autorise.

Signaux

Le catalogue complet, avec son poids en points ajoutés à l’indice. Un seul signal est decisif : il exige une correspondance exacte de l’URL dans une base de menaces, et aucune heuristique n’y a accès.

idgravitépoints
reputation_malveillantdecisif-200
reputation_suspectserieux-34
marque_ressemblanteserieux-32
homoglypheserieux-30
telechargement_executableserieux-30
marque_dans_sous_domaineserieux-28
tls_nom_non_couvertserieux-28
mot_de_passe_sans_reputationserieux-26
tls_expireserieux-26
tls_invalideserieux-24
formulaire_externeserieux-22
ip_directeserieux-22
domaine_tres_recentattention-18
redirection_change_domaineattention-14
pas_de_httpsattention-14
encodage_inhabituelattention-12
sous_domaines_nombreuxattention-12
port_inhabituelattention-12
redirections_multiplesattention-12
domaine_sans_serveurattention-10
domaine_recentinfo-9
url_tres_longueinfo-8
tld_a_risqueinfo-8
mots_sensiblesinfo-7
marque_dans_chemininfo-6
raccourcisseurinfo-6
heberge_sous_domaine_ouvertinfo-6
parametres_suspectsinfo-6
domaine_tres_connurassurant+26
domaine_etablirassurant+22
reputation_proprerassurant+18
domaine_ancienrassurant+14
https_certificat_validerassurant+12
certificat_organisationrassurant+8
infrastructure_completerassurant+6
aucune_redirectionrassurant+5

Ces poids ne sont pas des probabilités mesurées : il n’existe pas ici de corpus de liens étiquetés. Ce sont des jugements d’ingénierie, réunis dans un seul objet (SCORING_POLICY) pour qu’ils puissent être balayés le jour où un corpus existera. L’indice de base est 58 — un lien dont on ne sait rien reste au milieu, et le milieu s’appelle « prudence ».

Sources de réputation

Une source non configurée ne contribue pas « un peu » : elle ne contribue pas. Son constat porte NON_CONFIGURE, elle est exclue de l’agrégation, et elle apparaît telle quelle dans sources. La confondre avec « rien trouvé » fabriquerait un signal rassurant à partir d’une absence de clé.

Refus et erreurs

// 200 — l'adresse n'a pas été analysée, et c'est le RÉSULTAT
{ "ok": false, "code": "identifiants", "message": "…", "limites": [ … ] }

// codes : vide · schema_dangereux · schema_inconnu · illisible
//         hote_absent · trop_longue · identifiants · reseau

// 400 — requête mal formée      { "erreur": "requete_invalide", "message": "…" }
// 429 — quota journalier épuisé { "erreur": "quota", "message": "…" }

Un refus d’analyse répond 200, pas 4xx. « Cette adresse contient un identifiant avant l’arobase, ne l’ouvrez pas » est l’information la plus utile que l’outil puisse rendre : la livrer sous un code d’erreur la ferait traiter comme une panne par la moitié des clients HTTP.

Quota

120 analyses par adresse IP et par jour. Chaque analyse ouvre de vraies connexions vers le site examiné : sans borne, cette route deviendrait un amplificateur pointé sur une cible choisie par l’appelant. Le quota restant est renvoyé dans quotaRestant.

Ce que l’API ne prouve pas