SPAMADIN / DÉVELOPPEURS

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.

ChampUtilitéLimite
contentTexte original du message ; obligatoire1 à 12 000 caractères
typecontact ou comment ; obligatoireValeur d’énumération exacte
siteUrlURL du site requise. Les nouveaux sites sont ajoutés automatiquement dans la limite du forfait.HTTP(S), 2 048 caractères
context.title / descriptionContexte pertinent de la page fourni par votre serveur200 / 1 000 caractères
context.language / tagsLangue du site et jusqu’à dix étiquettes thématiques35 / 50 caractères
signals.elapsedMsDélai entre l’affichage du formulaire et l’envoi0–86 400 000 ms
signals.honeypotFilledIndique si un champ masqué a été rempliBooléen
signals.userAgent / userIpMétadonnées d’intégration facultatives ; non transmises aux modèles512 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.

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

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 ↗