Un chemin clair du
message à la décision.
Connectez votre backend à Spamadin. Gardez votre clé API Spamadin sur votre serveur. Enregistrez les messages dans votre propre système avant de demander leur classification.
Créez avec votre assistant de programmation
Donnez à votre assistant notre référence d’intégration et la spécification OpenAPI pour connecter votre site côté serveur.
Référence d’intégration · Spécification OpenAPI · Index de documentation pour l’IA
Extension WordPress
Installez Spamadin sur WordPress et collez votre clé API de compte dans Réglages → Spamadin. Utilisez la même clé sur tous les sites du forfait. La connexion ajoute le site automatiquement dans la limite du forfait et conserve la clé en sécurité sur votre serveur WordPress.
Télécharger l’extension WordPress
Les commentaires et formulaires compatibles sont protégés par défaut. Contact Form 7, WPForms, Gravity Forms, Fluent Forms et Elementor Pro sont pris en charge. Vous pouvez modifier la protection et les signaux facultatifs du navigateur dans les réglages de l’extension.
Les commentaires indésirables restent dans la file spam de WordPress ; les contrôles incertains ou indisponibles passent en modération. Les messages de formulaire retenus restent privés dans Réglages → Spamadin jusqu’à 30 jours. Examinez-les et contactez directement les expéditeurs légitimes ; les actions du formulaire ne sont pas relancées. Les corrections partagent uniquement une référence de contrôle et une étiquette, jamais le corps du message.
Déconnecter l’extension arrête les contrôles locaux. Bloquez le site dans votre tableau de bord Spamadin pour arrêter ses requêtes API et libérer sa place. Le reconnecter ne le débloque pas. Remplacer la clé du compte nécessite de mettre à jour toutes les intégrations.
1. Créez un compte et une clé
Vérifiez votre adresse e-mail, choisissez un abonnement dans le tableau de bord, puis créez une clé API de compte. Réutilisez-la sur tous vos sites. Chaque nom d’hôte autorisé occupe une place ; example.com et www.example.com comptent séparément. Les clés sont affichées une seule fois et stockées avec Argon2id.
Votre clé Spamadin authentifie les requêtes à notre service et diffère de nos identifiants internes du fournisseur IA. Votre abonnement inclut la classification ; aucun compte ni clé OpenRouter n’est nécessaire.
2. Contrôlez un message
Décrivez votre site lors de sa connexion. Spamadin utilise l’IA pour le catégoriser et intégrer ce contexte aux vérifications suivantes. Désactivez un site dans le tableau de bord pour arrêter ses requêtes et libérer une place. Après un changement vers une offre inférieure, les sites activés les plus anciens restent actifs dans la limite de l’offre ; désactivez-en un pour en activer un autre.
POST /api/v1/check · Corps JSON · Authorization: Bearer YOUR_SERVER_KEY
curl https://spamadin.com/api/v1/check \
-H 'Authorization: Bearer YOUR_SERVER_KEY' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: 45573012-1f18-4eaf-97a1-29702376ea21' \
-d '{
"type": "contact",
"siteUrl": "https://example.com",
"content": "Pouvez-vous nous envoyer un devis pour notre nouveau site ?",
"context": { "title": "Website design", "language": "en" },
"signals": { "elapsedMs": 8500, "honeypotFilled": false }
}'Vérifications groupées
Envoyez jusqu’à 20 messages à POST /api/v1/check/bulk avec votre clé API de compte. Les éléments peuvent provenir de différents sites du compte. Chacun nécessite un ID UUID unique et un objet submission. Les réponses gardent l’ordre et incluent le statut et le résultat de chaque élément. Réessayez avec le même ID et le même contenu. Les limites de sites, blocages et le quota mensuel partagé s’appliquent à chaque élément.
{
"checks": [
{
"id": "45573012-1f18-4eaf-97a1-29702376ea21",
"submission": {
"type": "contact",
"siteUrl": "https://example.com",
"content": "Pouvez-vous envoyer un devis ?"
}
}
]
}Contexte propre au formulaire
Créez un profil de formulaire dans votre tableau de bord à partir de son objectif, des libellés des champs et d’un texte public pertinent. Vérifiez et enregistrez le résumé proposé, puis incluez son formId dans les vérifications individuelles ou groupées. Utilisez les profils reader_comment pour les commentaires et les autres profils pour les formulaires de contact. Les profils apportent du contexte, sans autoriser automatiquement les messages promotionnels.
{
"formId": "d495b23a-cf83-4c3d-bd63-6973297ec401",
"type": "contact",
"siteUrl": "https://example.com",
"content": "Pouvez-vous envoyer un devis ?"
}Utilisez un nouvel UUID Idempotency-Key pour chaque message. Après une erreur réseau, renvoyez le même contenu avec la même clé. Une nouvelle tentative d’un contrôle terminé renvoie la décision existante sans nouveau décompte. Les clés sont conservées avec les métadonnées pendant 30 jours ; ne renvoyez pas d’anciens messages au-delà de cette durée.
| Champ | Utilité | Limite |
|---|---|---|
| content | Texte original du message ; obligatoire | 1 à 12 000 caractères |
| type | contact ou comment ; obligatoire | Valeur d’énumération exacte |
| siteUrl | URL du site requise. Les nouveaux sites sont ajoutés automatiquement dans la limite du forfait. | HTTP(S), 2 048 caractères |
| context.title / description | Contexte pertinent de la page fourni par votre serveur | 200 / 1 000 caractères |
| context.language / tags | Langue du site et jusqu’à dix étiquettes thématiques | 35 / 50 caractères |
| signals.elapsedMs | Délai entre l’affichage du formulaire et l’envoi | 0–86 400 000 ms |
| signals.honeypotFilled | Indique si un champ masqué a été rempli | Booléen |
| signals.userAgent / userIp | Métadonnées d’intégration facultatives ; non transmises aux modèles | 512 caractères / IP valide |
Déterminez le contexte et les signaux comportementaux sur votre serveur. Les horodatages du navigateur peuvent être falsifiés. Pour les futures extensions CMS, signez l’horodatage d’affichage et validez-le à l’envoi, utilisez un champ piège accessible et les hooks du cycle de vie serveur des commentaires ou formulaires. Ne transmettez pas de cookies, en-têtes d’autorisation, mots de passe, variables d’environnement complètes ou autres secrets.
3. Préservez les cas incertains
{
"id": "c18dd105-5d52-4939-a63e-0d52b2c0606d",
"verdict": "allow",
"score": 0,
"reasons": ["clear_legitimate_context"],
"degraded": false,
"latencyMs": 420,
"charged": true
}Cet exemple ne garantit aucun délai de réponse. Le score est un indicateur ordinal de risque : 0 (autoriser), 50 (examiner) ou 100 (fort accord sur le spam). Il ne s’agit pas d’une probabilité calibrée.
- allow: poursuivez la modération ou la livraison habituelle.
- review: conservez le message dans une file de vérification. Ne le supprimez jamais.
- spam: placez-le en quarantaine et prévoyez une récupération en cas de faux positif.
- degraded: true: un fournisseur a échoué ou renvoyé un résultat invalide. Conservez le message pour vérification. Ce contrôle n’est pas décompté.
La classification automatique du spam démarre en mode observation jusqu’à l’activation d’une politique de blocage évaluée par l’opérateur. Si l’appel réseau échoue ou renvoie un statut autre que 2xx, conservez le message pour vérification au lieu de le supprimer ou de réessayer indéfiniment.
4. Signalez une correction
POST /api/v1/feedback avec la même clé API Bearer et le JSON {"id":"CHECK_UUID","label":"legitimate"} ou le libellé spam. Les retours concernent uniquement les contrôles créés par cette clé. Ils enregistrent une correction pour l’évaluation, sans modifier un entraînement partagé ni autoriser immédiatement un expéditeur.
Vous pouvez aussi enregistrer une correction dans votre tableau de bord et contacter l’assistance avec la référence de vérification. Nous pouvons ajuster le contexte et la prudence pour votre site. N’envoyez pas de messages privés, de mots de passe ou de clés API par email. Les références restent disponibles pendant 30 jours.
Limites et gestion des erreurs
- Corps maximal : 32 Kio. Les champs inconnus et le JSON mal formé sont rejetés.
- 120 requêtes par clé et par minute. La concurrence est plafonnée par processus ; les contrôles excédentaires renvoient 503.
- 400 entrée invalide, 401 clé invalide/révoquée, 402 abonnement inactif, 409 tentative en attente ou différente, 413 corps trop volumineux, 429 limite de débit/quota, 503 capacité temporairement indisponible.
- Réessayez les erreurs transitoires avec un délai exponentiel plafonné. Réutilisez Idempotency-Key et respectez Retry-After si présent.
- Les quotas mensuels sont partagés entre toutes les clés et se réinitialisent à la date anniversaire mensuelle de l’abonnement, y compris pour les offres annuelles. Dans les mois plus courts, la date est ramenée au dernier jour. Aucun report ni dépassement automatique.
Signaler une erreur de classification
Signalez un message légitime classé comme spam à POST /api/v1/reports/false-positive, ou un spam non détecté à POST /api/v1/reports/missed-spam. Envoyez uniquement l’ID retourné avec votre clé API de compte. Aucun contenu n’est partagé et aucun contrôle n’est décompté. La dernière correction prévaut ; les signalements ne réentraînent pas immédiatement un modèle.
{
"id": "c18dd105-5d52-4939-a63e-0d52b2c0606d"
}La confidentialité par défaut
Les contrôles ordinaires conservent les métadonnées et une empreinte d’entrée avec clé pendant 30 jours, sans stocker le contenu des messages. Les formats courants d’e-mails et de téléphones sont masqués avant le traitement IA ; il s’agit de minimisation, pas d’anonymisation complète. Les exemples d’apprentissage volontairement partagés sont stockés séparément selon la politique de confidentialité.
Contrôles de formulaire invisibles facultatifs
Appelez POST /api/v1/form-token depuis votre serveur avec siteUrl, type et, éventuellement, un formId enregistré. Les jetons expirent après 30 minutes. Leur émission ne consomme aucun contrôle antispam et nécessite un accès actif au site.
Envoyez le jeton reçu dans signals.formToken et utilisez l’idempotencyKey reçu comme en-tête Idempotency-Key. Pour les contrôles groupés, utilisez-le comme id de l’élément. Les nouvelles tentatives doivent conserver exactement la requête initiale. Utilisez un nouveau jeton pour chaque nouvelle soumission.
Chargez /spamadin-behavior.js sur votre site et associez-le au formulaire. Votre point de terminaison de jetons, de même origine, appelle Spamadin depuis votre serveur et renvoie uniquement la réponse publique du jeton de formulaire. N’exposez jamais votre clé API et n’intégrez pas de jetons partagés dans des pages mises en cache.
SpamadinBehavior.attach(document.querySelector("#contact-form"), {
tokenEndpoint: "/form-evidence/token"
});Le script ajoute un champ masqué spamadin_evidence contenant token, idempotencyKey et les signaux du navigateur. Validez ce champ sur votre serveur, associez browser à signals.browser et transmettez token dans signals.formToken. Les signaux utilisent version 1, jsExecuted, focusCount, editCount, pasteCount, keyboardUsed, pointerUsed et, éventuellement, firstInteractionMs. Votre serveur peut aussi envoyer honeypotFilled et l’adresse IP du visiteur.
Ces signaux contribuent à la classification, mais ne suffisent jamais à établir qu’un message est du spam. Le collage, le remplissage automatique, l’absence de JavaScript et les technologies d’assistance peuvent être légitimes. Le délai mesure le temps écoulé depuis l’émission du jeton, sans prouver une activité humaine. Un jeton absent ou expiré ne rejette pas automatiquement les messages.
Le script n’enregistre ni texte saisi, ni contenu du presse-papiers, ni déplacements de souris, ni cookies. Les jetons et résumés d’interactions ne sont pas conservés dans l’historique des contrôles ni envoyés comme identifiants aux fournisseurs d’IA. Les contrôles accompagnés de signaux du navigateur sont toujours classifiés, sans réutiliser un verdict en cache.
Reconnaissance des répétitions
La reconnaissance des répétitions est limitée à chaque site. Les empreintes expirent après 24 heures et ne contiennent aucun texte enregistré. Une formulation similaire aide la classification, sans suffire à identifier du spam. Désactivez cette fonction dans les réglages du site pour effacer son historique et les signaux de campagnes approuvés. Bloquer un site ou signaler une correction efface aussi son historique récent.
Les contrôles identiques admissibles peuvent réutiliser un verdict récent de message légitime uniquement si cette fonction a été évaluée et activée. La réutilisation est limitée à cinq minutes et exige des données d’envoi, paramètres du site et du formulaire, configuration des modèles et règles de détection inchangés. Les correspondances approximatives passent toujours par l’IA. Chaque contrôle terminé compte une fois dans votre quota, y compris un verdict réutilisé ; les échecs du fournisseur ne sont pas décomptés.
Partager un exemple d’apprentissage corrigé
Envoyez POST /api/v1/training avec la clé d’origine, checkId, le libellé corrigé, l’objet d’envoi original inchangé et les deux autorisations de partage définies sur true. Le contrôle doit être terminé et dater de moins de 30 jours. Le partage est facultatif, ne consomme pas de contrôle et ne réentraîne pas immédiatement un modèle. Effectuez la requête sur votre backend et assurez-vous de fournir les informations requises et de disposer de l’autorité légale avant de partager le contenu des visiteurs.
{
"checkId": "c18dd105-5d52-4939-a63e-0d52b2c0606d",
"label": "legitimate",
"submission": {
"type": "contact",
"siteUrl": "https://example.com",
"content": "Pouvez-vous envoyer un devis ?"
},
"consent": {
"authorizedToShare": true,
"useForSpamImprovement": true
}
}GET /api/v1/training liste les références des exemples partagés par votre compte. Utilisez ?after=EXAMPLE_UUID pour la page suivante ou ?id=EXAMPLE_UUID pour récupérer un exemple réduit. DELETE au même endpoint avec l’ID de l’exemple le retire. Votre tableau de bord permet aussi de retirer les exemples après révocation de la clé.
Les exemples expirent après 90 jours. Limites : 500 exemples ou 2 MiB de données chiffrées par compte, 16 KiB de texte original par exemple et 24 KiB de contenu et contexte minimisés avant compression. Les requêtes restent limitées à 32 KiB. Un compte plein renvoie 429 ; une capacité temporairement indisponible ou l’absence de chiffrement renvoie 503. Aucun exemple n’est enregistré si une limite rejette la requête. Ne répétez pas indéfiniment et n’envoyez pas de pièces jointes privées. Le masquage est effectué au mieux et ne constitue pas une anonymisation.
L’API ne visite jamais les URL soumises. Les adresses IP facultatives contribuent à détecter les rafales de soumissions à court terme pour chaque site ; les agents utilisateurs n’influencent pas la classification. Aucun des deux n’est envoyé aux modèles. Utilisez notre extension WordPress ou connectez les autres CMS via l’API serveur.
Créer votre compte ↗