Cactus

API JSON

Exécutez les mêmes analyses d'URL et de courriels de façon programmatique. Publique, à débit limité, aucune clé d'API requise.

Points de terminaison

Une description OpenAPI 3 lisible par machine de chaque point de terminaison ci-dessous est offerte à /openapi.json — importez-la dans Postman, Insomnia ou un générateur de clients.

GET /api/check-url

Analyse une seule URL. À utiliser pour les vérifications rapides, les signets et la ligne de commande.

Paramètres de requête :

  • u — l'URL à analyser (max 2048 caractères). Requis.
  • lang — langue de la réponse : en-CA (par défaut) ou fr-CA. Optionnel.

Exemple :

curl "https://your-safecheck-host/api/check-url?u=https://example.com"
curl "https://your-safecheck-host/api/check-url?u=https://example.com&lang=fr-CA"

POST /api/check-url

La même analyse, mais avec un corps JSON. À utiliser quand l'URL risque de contenir des caractères peu commodes dans une chaîne de requête.

curl -X POST "https://your-safecheck-host/api/check-url?lang=fr-CA" \
     -H "Content-Type: application/json" \
     -d '{"url":"https://example.com"}'

POST /api/check-email

Analyse le corps d'un courriel, avec les en-têtes bruts en option.

Corps JSON :

  • emailBody — le texte du courriel (max 20000 caractères). Requis.
  • rawHeaders — les en-têtes bruts du courriel (max 20000 caractères). Optionnel.
curl -X POST https://your-safecheck-host/api/check-email \
     -H "Content-Type: application/json" \
     -d '{
       "emailBody": "Dear customer, your account has been suspended...",
       "rawHeaders": "From: PayPal \nReply-To: [email protected]"
     }'

GET /api/check-tls

Analyse la configuration TLS/SSL d'un hôte : protocole et chiffrement négociés, détails et chaîne du certificat, HSTS, révocation, et une note globale de A+ à F. Seuls les hôtes publics sur le port 443 sont analysés.

Paramètres de requête :

  • host — le domaine ou l'hôte à analyser (max 255 caractères). Requis.
curl "https://your-safecheck-host/api/check-tls?host=example.com"

GET /api/check-email-auth

Vérifie la posture d'authentification des courriels d'un domaine — SPF, DKIM et DMARC — avec une note globale de A à F. Accepte un domaine ou une adresse courriel.

Paramètres de requête :

  • domain — le domaine ou l'adresse courriel à vérifier (max 255 caractères). Requis.
curl "https://your-safecheck-host/api/check-email-auth?domain=example.com"

Le champ grade (p. ex. "A+", "F") est le résultat principal. Les réponses de /api/check-tls et /api/check-email-auth retournent des clés de localisation (gradeNoteKeys, noteKeys, errorKey) plutôt que du texte localisé ; résolvez-les côté client si vous avez besoin de texte d'affichage.

POST /api/check-message

Analyse un message texte (texto ou clavardage) pour y repérer des signaux d'arnaque, avec des heuristiques locales. Le message n'est jamais conservé.

Corps JSON :

  • message — le texte du message (max 20000 caractères). Requis.
curl -X POST https://your-safecheck-host/api/check-message \
     -H "Content-Type: application/json" \
     -d '{"message":"URGENT: your parcel is held, pay at http://bit.ly/x"}'

GET /api/check-headers

Note les en-têtes de sécurité HTTP d'un site (HSTS, CSP, X-Content-Type-Options, options de cadrage, Referrer-Policy, Permissions-Policy) avec une note de A+ à F.

Paramètres de requête :

  • url — l'URL du site à analyser (max 2048 caractères). Requis.
curl "https://your-safecheck-host/api/check-headers?url=https://example.com"

GET /api/check-typosquat

Génère les variantes sosies (typosquattage) d'un domaine et indique lesquelles sont réellement enregistrées (c'est-à-dire qu'elles résolvent dans le DNS).

Paramètres de requête :

  • domain — le domaine à vérifier (max 255 caractères). Requis.
curl "https://your-safecheck-host/api/check-typosquat?domain=example.com"

GET /api/check-certs

Liste les enregistrements de transparence des certificats d'un domaine — les sous-domaines uniques et un échantillon des certificats les plus récents. Source : crt.sh, avec Cert Spotter en relève automatique. Le champ source indique lequel a répondu.

Paramètres de requête :

  • domain — le domaine à rechercher (max 255 caractères). Requis.
curl "https://your-safecheck-host/api/check-certs?domain=example.com"

GET /api/check-acme

Diagnostique pourquoi Let's Encrypt / ACME refuse d'émettre ou de renouveler un certificat pour un domaine — enregistrements DNS et CAA, accessibilité des ports 80 et 443, problèmes de redirection et limites d'émission.

Paramètres de requête :

  • domain — le domaine qui refuse d'émettre ou de renouveler (max 255 caractères). Requis.
  • method — le défi ACME à déboguer : http-01, dns-01 ou tls-alpn-01. Optionnel ; sans lui, toutes les vérifications applicables s'exécutent.
curl "https://your-safecheck-host/api/check-acme?domain=example.com"
curl "https://your-safecheck-host/api/check-acme?domain=example.com&method=dns-01"

GET /api/check-ip

Réputation et identité d'une adresse IP, par DNS public seulement : DNS inversé, propriétaire/ASN (Team Cymru) et un échantillon de listes noires DNS. Aucune connexion n'est faite à l'IP elle-même.

Paramètres de requête :

  • ip — l'adresse IPv4 ou IPv6 (max 255 caractères). Requis.
curl "https://your-safecheck-host/api/check-ip?ip=8.8.8.8"

GET /api/check-dns

Les enregistrements DNS courants d'un domaine — A, AAAA, CNAME, MX, TXT, NS, CAA et SOA — regroupés par type. DNS public seulement ; aucune connexion à l'hôte.

Paramètres de requête :

  • domain — le domaine à rechercher (max 255 caractères). Requis.
curl "https://your-safecheck-host/api/check-dns?domain=example.com"

GET /api/check-whois

Le dossier public d'enregistrement (WHOIS) d'un domaine, lu par RDAP auprès du registre officiel du domaine (rdap.org en relève) — registraire, dates de création, d'expiration et de mise à jour, codes d'état EPP, DNSSEC, serveurs de noms et tout titulaire non caviardé. Aucune connexion au domaine lui-même.

Paramètres de requête :

  • domain — le domaine à rechercher (max 255 caractères). Requis.
curl "https://your-safecheck-host/api/check-whois?domain=example.com"

GET /api/check-hash

La réputation multimoteur de VirusTotal pour un fichier, recherchée par empreinte (MD5, SHA-1 ou SHA-256). Seule l'empreinte est envoyée — aucun fichier n'est téléversé ni analysé. found: false signifie que le fichier est inconnu de VirusTotal, ce qui n'est pas synonyme de sécuritaire.

Paramètres de requête :

  • hash — une empreinte hexadécimale MD5, SHA-1 ou SHA-256. Requis.
curl "https://your-safecheck-host/api/check-hash?hash=275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f"

Plusieurs de ces points de terminaison retournent des clés de localisation (p. ex. titleKey, errorKey, clés de signaux) plutôt que du texte localisé ; résolvez-les côté client si vous avez besoin de texte d'affichage.

Essayez

Entrez n'importe quelle URL pour appeler GET /api/check-url en direct et voir la réponse JSON complète.

Forme de la réponse

La réponse est le même objet d'analyse que celui rendu par l'interface Web. Les énumérations (niveaux de gravité, etc.) sont retournées sous forme de chaînes, non d'entiers. Exemple de forme pour /api/check-url :

{
  "input": "https://example.com",
  "normalizedUrl": "https://example.com",
  "analyzedHost": "example.com",
  "confidenceScore": 95,
  "verdict": "Likely low risk",
  "verdictKey": "verdict.lowRisk",
  "summary": "This link does not show obvious warning signs from the available checks.",
  "summaryKey": "summary.url.lowRisk",
  "isInconclusive": false,
  "recommendedAction": "This link does not show obvious warning signs, but stay cautious...",
  "findings": [
    {
      "title": "Uses HTTPS",
      "titleKey": "finding.usesHttps.title",
      "description": "The link uses HTTPS. This is good, but HTTPS alone does not prove a site is safe.",
      "descriptionKey": "finding.usesHttps.description",
      "severity": "Info",
      "scoreImpact": 0,
      "parameters": null,
      "sourceHintKey": null
    }
  ],
  "redirects": {
    "wasAttempted": true,
    "wasSuccessful": true,
    "wasBlockedByPolicy": false,
    "hops": [],
    "finalUrl": "https://example.com",
    "finalHost": "example.com",
    "hitMaxHops": false,
    "unresolvable": false,
    "containsHttpsToHttpDowngrade": false,
    "errorMessage": null,
    "skipReason": null
  },
  "domainAge": {
    "wasAttempted": true,
    "wasSuccessful": true,
    "lookedUpDomain": "example.com",
    "registeredAt": "1995-08-14T04:00:00+00:00",
    "ageInDays": 10878,
    "ageBand": "established",
    "humanReadableAge": "Registered about 29 years ago",
    "errorMessage": null,
    "skipReason": null
  }
}

Codes d'état

  • 200 — analyse retournée. Le corps de la réponse contient toujours un résultat ; consultez verdict, confidenceScore et isInconclusive.
  • 400 — champ requis manquant ou entrée au-delà de la limite de longueur. Le corps de la réponse est { "error": "..." }.
  • 429 — limite de débit dépassée. Le corps de la réponse est du texte brut.

Limites de débit

Par IP client, partagées avec le formulaire HTML :

  • 10 / minute pour /api/check-url (GET et POST partagent la même partition) et /api/check-message (analyse locale).
  • 5 / minute chacun pour /api/check-email, /api/check-tls, /api/check-email-auth, /api/check-headers, /api/check-certs, /api/check-whois, /api/check-dns, /api/check-hash et /api/check-ip (travail sortant à chaque requête).
  • 3 / minute pour /api/check-typosquat et /api/check-acme (chacun déclenche des dizaines de recherches DNS).

Langue et localisation

Les points de terminaison URL et courriel offrent des réponses bilingues (anglais et français canadien). Deux façons de demander le français :

  • Paramètre de requête : ajoutez ?lang=fr-CA (ou simplement ?lang=fr) à l'URL de la requête.
  • En-tête : envoyez Accept-Language: fr-CA. Le paramètre de requête a priorité si les deux sont présents.
  • Corps d'erreur : le corps d'erreur 400 suit la même sélection de langue sur chaque point de terminaison.

Quand une langue est demandée, les champs texte de la réponse (verdict, summary, recommendedAction, ainsi que le title et la description de chaque constat) sont retournés dans cette langue. Les champs *Key (p. ex. verdictKey, titleKey) sont toujours retournés et permettent de rechercher ou de réafficher les traductions côté client.

Remarques

  • Aucune authentification ni clé d'API pour l'instant. Planifiez en conséquence si vous intégrez l'URL de l'hôte dans un endroit public.
  • Aucun en-tête CORS n'est émis : l'API est donc destinée aux échanges serveur à serveur, aux scripts et aux manifestes d'extensions de navigateur — pas aux appels directs d'une application monopage d'une autre origine.
  • La même mise en cache que les pages HTML s'applique (résultats mémorisés en mémoire jusqu'à 6 heures), donc les requêtes identiques ne coûtent rien après la première. La cache est neutre quant à la langue — l'étape de localisation s'exécute au moment de la réponse sans retoucher la cache.
  • Consultez la page Confidentialité pour savoir ce que chaque analyse envoie à des tiers (Google Web Risk, rdap.org).