Where spam actually gets in
Spam is not one problem. A comment section, a lead form, a trial signup, and a public API fail in different ways, and a defence that works for one will be the wrong shape for another. Start by naming the surface you are protecting.
Comments and community posts
looks like Link drops, generic praise with a URL, fake “great post!” replies, trackback and pingback noise, AI-written comments that read cleanly but say nothing.
costs you Moderator hours, a comments section readers stop trusting, and outbound links that turn your domain into a link farm.
Comment spam and SEO →Contact and lead forms
looks like Fake names, disposable emails, gibberish messages, the same pitch across ten submissions, and bot traffic that never converts.
costs you Sales time on dead leads, polluted CRM data, and ad reporting that credits bots as buyers.
Stop contact-form spam →Signups, trials, and registrations
looks like Throwaway inboxes, automated account creation, multi-step forms filled faster than a human can type, and referral abuse.
costs you Support load, inflated metrics, free-tier abuse, and a user table you cannot trust.
Signup abuse →APIs, webhooks, and product surfaces
looks like Bulk content submitted through your API, spam in chat or messaging features, and payloads designed to look like normal traffic.
costs you Infrastructure spend, abuse reports, and moderation work that lands on your engineering team.
Headless and API-first stacks →The four layers, in the order you should add them
Each layer below removes a different kind of traffic. Add them in order: the cheap trap first, the classifier second, the limits third, and the human review last. Skipping ahead usually means paying for a classifier to look at traffic a hidden field would have stopped.
- 01
A trap that only bots fall into
- Catches
- Naive form-filling bots, scrapers that parse every input, and scripts that submit in under a second.
- Misses
- Targeted bots that read the DOM, AI agents that fill forms like a person, and human spam farms.
- User friction
- None when implemented invisibly.
- Effort
- About an hour.
A hidden field plus a timestamp is still the cheapest filter you can ship. It is not a strategy on its own — it removes the lazy traffic so the expensive layer only sees the determined traffic.
How honeypots work → - 02
A server-side content classifier
- Catches
- Spam text at any volume, including AI-written comments that pass grammar and tone checks, and payloads submitted through APIs rather than a form.
- Misses
- Pure link spam with no message body, coordinated reputation attacks, and abuse that is behavioural rather than textual.
- User friction
- None visible to the reader — the decision happens after submit.
- Effort
- Half a day for the first integration.
This is the layer that scales. A calibrated probability lets you choose three outcomes instead of two: allow, hold for review, or block. Binary verdicts force you to either accept false positives or over-moderate.
Reading a calibrated score → - 03
Rate limits and reputation
- Catches
- Floods, credential stuffing, repeated submissions from one source, and abuse that arrives faster than a person could type.
- Misses
- Slow, distributed, low-volume spam that stays under every threshold.
- User friction
- None for normal users; a visible error for the abuser.
- Effort
- Half a day, mostly configuration.
Rate limits are a cost control as much as a security control. They keep a spam wave from becoming a bill, and they give the classifier a smaller, more interesting queue to work with.
AI-driven abuse → - 04
A review queue for the middle band
- Catches
- Novel attacks, sarcasm, borderline promotional comments, and the disagreements between layers.
- Misses
- Nothing — but it does not scale without a scoring layer in front of it.
- User friction
- Depends entirely on the thresholds you set.
- Effort
- Ongoing, measured in minutes per day.
The review band is where trust is won or lost. Route the 0.40–0.75 scores to a human, auto-allow below it, auto-block above it, and tune the band with real examples from your own traffic.
Audit a form first →
Pick the stack by site type
The same four layers combine differently depending on what you run. This is the short version; each row links to the detailed use case.
| Site type | Stack | Why this shape |
|---|---|---|
| Blog with comments | Honeypot, classifier in the comment handler, moderation queue for the middle band. | Comment volume is spiky and the cost of a false positive is a lost reader. Score first, hold the ambiguous, block only at the top of the range. |
| SaaS signup or trial | Rate limit, classifier on the signup payload, email verification for the allowed set. | Fake accounts are cheap to create and expensive to clean up. Score the payload before you spend money provisioning an account or sending mail. |
| Contact or lead form | Honeypot, classifier on submit, CRM dedupe, no visible CAPTCHA. | Every extra challenge is a lost lead. A server-side score costs the buyer nothing and keeps the CRM clean. |
| Marketplace or UGC platform | Classifier, rate limits, reputation, review queue, and an appeal path. | You are moderating other people's livelihoods. Three-way decisions and a visible appeal path matter more than raw accuracy. |
| Ghost blog | Classifier in the theme's comment or member handler, honeypot on the signup form. | Ghost gives you the webhook or server route, so one classification call covers comments and member signups without a plugin. |
| Static site or headless CMS | Classifier call from a serverless function or edge worker, with the provider's secret held server-side. | There is no backend to hook into, so the classification call becomes the backend. Keep the key out of the browser. |
A 30-minute setup that removes most text spam
Add a hidden field and a timestamp
Reject submissions that fill the hidden input or complete in under two seconds. This is a few lines in the form handler and it removes the cheapest bots before they cost you anything.
Score the submission server-side
Send the text to a classifier from your backend, never from the browser. Keep the API key in the server environment.
curl curl -sX POST https://api.siftfy.io/v1/predict \ -H "X-API-Key: $SIFTFY_KEY" \ -H "Content-Type: application/json" \ -d '{"text": "Great post! Visit my site for cheap backlinks"}'json { "spam_probability": 0.93, "likelihood": "high", "max_confidence": 0.84, "score_source": "model" }Choose three bands, not two
Allow below
0.40, hold between0.40and0.75, block above it. Start wider than you think and tighten with real examples.Rate-limit the submit path
Cap submissions per IP and per account per minute. Rate limits protect your bill and keep a flood from becoming a classification bill.
Log every decision
Store the score, the band, and the text you blocked. Without that log you cannot tell whether a threshold change helped or just moved the problem.
What not to do
Blocking every comment that contains a link
Legitimate readers link to their own work and to sources. You train people to stop commenting, and you lose the good signal with the bad.
Putting the classifier in the browser
A client-side check is a suggestion. Anyone can skip it, and an API key in a bundle is a key you have already leaked.
Using a CAPTCHA as the whole strategy
Puzzles cost real conversions, fail accessibility, and still lose to human farms. Use them when you must, not as a default.
Deleting silently
A spam comment that disappears with no trace teaches you nothing. Log the score, the reason, and the text you blocked so you can tune later.
Blocking by keyword list
Keyword lists are easy to write and easy to evade. They also produce the worst false positives, because the words people use to describe their own business are the words you banned.
Treating spam as a one-time project
Spam adapts. The thresholds that worked in January are usually too loose by summer. Put a review on the calendar.
How to measure it
Spam protection is a trade between two errors: letting spam through and blocking real people. Measure both, or you will optimise one into the other.
| Metric | Definition | What to watch |
|---|---|---|
| Spam capture rate | Share of known spam blocked or queued before it reaches a human. | Establish a baseline first; it is only meaningful against your own traffic. |
| False-positive rate | Real submissions blocked or held. Measure on a labelled sample, not on vibes. | Should fall as you tune the middle band; watch it weekly after any threshold change. |
| Moderator minutes per 100 submissions | The real cost of the middle band. | Falls when the classifier is doing its job; rises when the review band is too wide. |
| Form completion rate | Real users who finish the form after you add a defence. | Should be flat or up. If it drops, the defence is visible and you have paid in conversions. |
| Blocked-then-allowed rate | Submissions your rules blocked that a reviewer later restored. | A leading indicator that a threshold is too aggressive. |
Choosing a provider without the marketing
The honest split is between plugins that live inside a platform and APIs that return a score your application owns. Both are correct answers to different questions.
| Method | Blocks | Cost to real users | Upkeep | Verdict |
|---|---|---|---|---|
| Honeypot + time trap | Lazy bots | No friction | Low | Necessary baseline, never sufficient alone. |
| CAPTCHA or proof-of-work | Scripted submissions | Visible challenge for some users | Low, but adds a third-party script | Strong at blocking, weak at conversion. Accessibility and privacy costs are real. |
| CMS plugin (Akismet, CleanTalk) | Comment and form spam on supported platforms | No friction | Low until you leave the platform | Excellent fit for WordPress. Less so for a custom product or API. |
| Content classification API | Text spam at any volume, including AI-written spam | No friction | One integration | Returns a score you own. Best fit when the spam is text and the stack is yours. |
| IP and reputation blocking | Known bad sources | Risk of shared-IP false positives | Medium | Useful as a layer. Dangerous as the only layer, especially behind CGNAT or corporate proxies. |
Ready to compare specific products? Read the alternatives hub or the spam detection API buying guide. Both are written to be useful even if you choose someone else.
Spam protection questions
What is the best way to stop spam on a website?
Use layers, not a single filter: an invisible honeypot or time trap, a server-side content classifier that returns a score, rate limits on the submit path, and a human review queue for borderline scores. The combination catches the lazy traffic cheaply, the targeted traffic accurately, and keeps the ambiguous cases out of your users' way.
Do I need a CAPTCHA to stop spam?
No. Most text spam is a content problem, not a humanity problem. A server-side classifier can block spam comments and form fills without showing a puzzle, which removes the conversion cost and the accessibility problems a CAPTCHA introduces. Keep a challenge for high-abuse paths where behavioural signals matter.
Is a honeypot enough on its own?
No. A honeypot catches bots that fill every field, which is still a large share of cheap traffic, but it misses targeted bots that parse the DOM and any human or AI agent filling the form deliberately. Treat it as the first layer that keeps the expensive layer's queue small.
How do I stop AI-generated comment spam?
Score the text rather than the grammar. AI-written comments are usually fluent, generic, and promotional, so a content classifier trained on spam signal still catches them. Combine the score with a link count, a submission-time check, and a review band for the ambiguous ones.
Will spam protection hurt my conversion rate?
Only if the user can see it. A server-side classifier adds no fields and no challenges, so conversion stays flat while the spam rate falls. Visible CAPTCHAs, puzzle challenges, and aggressive link blocking are the changes that cost you real submissions.
What should I do with the comments I am unsure about?
Hold them. A three-way decision — allow, hold, block — is the main practical advantage of a calibrated score over a binary verdict. Review the middle band for a week, label what you see, and use those labels to move the thresholds rather than guessing.
When should I switch from a plugin to an API?
When your spam is no longer confined to one platform. A plugin is the right answer while you run a single WordPress or Ghost site. Once you have a custom product, an API endpoint, a mobile app, or a second CMS, one server-side classifier is cheaper to maintain than three plugins and gives you one consistent threshold.
start here
Score your first submission in five minutes.
10,000 requests a month free. One endpoint, a calibrated probability, and no puzzle for your readers.