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) oufr-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-01outls-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 ; consultezverdict,confidenceScoreetisInconclusive.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-hashet/api/check-ip(travail sortant à chaque requête). - 3 / minute pour
/api/check-typosquatet/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
400suit 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).