The 2026 problem: LLM-generated form spam
Form spam used to look like form spam. Misspelled brand names, broken English, link-stuffed paragraphs, the same template copy-pasted across every form on the open web. A regex on "buy cheap" or a domain blocklist for known link farms caught most of it. That world is gone.
In 2026 the average spam submission is generated by a fine-tuned open-source LLM running locally on a $200 GPU. The messages are grammatically clean, contextually relevant to your actual page (because the bot scraped your meta description first), and personalised with a plausible name and a real-looking email from a domain registered last week. They look like inquiries. Often they *are* inquiries — just from somebody trying to pitch their SEO agency, sell you a backlink package, or open a sales conversation that goes nowhere.
In our dataset across customer forms in Q1 2026, roughly 62% of all spam submissionswere human-grade fluent text — no broken English, no obvious URL stuffing, no template phrasing. Industry reports from the major CAPTCHA vendors quote similar shifts: Cloudflare's 2025 radar update flagged a 4x year-over-year jump in "text indistinguishable from human" form payloads.
The defenses built for the old world break here. Word-list blockers fire on legitimate "please send me your pricing" messages because the bot now writes prose that sounds exactly like that. Language-pattern detection (perplexity scoring, n-gram models) flags real non-native English speakers more aggressively than the bots. Even reCAPTCHA, which fingerprints the browser session rather than the message, has lost ground because solver farms run real Chromium instances with stealth plugins and pay $1-2 per 1,000 challenges to actual humans in low-wage regions.
The new spam doesn't look like spam. So the new defense has to stop reading the text and start reading everything else: how the form was filled, by whom, from where, in what time, with what behaviour, and only thenwhat was actually said. That's the shift this guide is about.
Defense techniques, ranked from weakest to strongest
Each technique below has a place; none of them work alone in 2026. We're ordering by "how much spam they catch on their own," not by "how useful they are in a stack." A weak technique can still be a high-value layer.
Honeypot fields
A honeypot is a hidden form input that real users never see. Bots that auto-fill every input populate it; you reject any submission where the field is non-empty. Setup is one input and a server-side check. See the implementation guide below for the details.
How bots defeat it:sophisticated bots render the page in a real headless Chrome, compute the visual bounding box of every input, and skip ones that aren't actually visible. A 2024 study by Imperva found roughly 40% of advanced spam bots were already honeypot-aware. By 2026 that number is closer to 60-70% for well-resourced campaigns.
When it still helps: the cheap, drive-by traffic — script-kiddie scrapers, mass form-fillers, and the long tail of low-effort spam — still trips honeypots. A honeypot blocks 50-75% of automated traffic at literally zero UX cost and zero third-party scripts. It is the cheapest first layer ever invented for forms. Keep it.
For deeper coverage of honeypot tradeoffs versus CAPTCHA, see our honeypot vs reCAPTCHA comparison.
Time-to-submit checks
Real humans take 4-30 seconds to fill out even a short form. Bots fill them in under 500ms. A time-to-submit check stamps the page render time (server-side, in a signed token) and rejects any submission that comes back faster than your minimum threshold — typically 2 seconds for a 3-field form.
How bots defeat it: add a setTimeout. Headless browsers running stealth scripts deliberately wait 3-15 seconds before submitting because everyone running these campaigns knows about time checks. Time-to-submit catches dumb bots; it adds nothing against tooling that's seen the inside of Hacker News.
When it still helps:as a cheap signal in a scoring system. Submissions under 1 second should be auto-junked; submissions over 60 minutes (browser tab left open, then auto- filled by a script) are also suspicious. Don't use it as a hard gate — use it as a feature into the AI classifier.
Rate limiting (per-IP / per-form)
Cap the number of submissions one source can make in a window. The reasonable shape: 5 submissions per IP per minute, 30 per IP per hour, with an exponential backoff after repeated trips. Implement at the edge (Cloudflare, Vercel Middleware, Cloudflare Workers) so the work never reaches your origin.
IPv6 considerations: rate-limiting on full /128 IPv6 addresses is useless — attackers have effectively unlimited addresses inside a /64. Limit on the /64 prefix or the /48, not the full address. For IPv4, a single /32 is fine. Both protocols also need a fingerprint fallback (UA + Accept-Language + viewport hash) for traffic behind shared residential proxies.
Where it fails: distributed campaigns rotate through residential proxy pools with millions of IPs. Each IP makes one submission, never tripping the limit. Rate limiting is necessary but never sufficient.
CAPTCHA (reCAPTCHA v2/v3, hCaptcha, Turnstile)
CAPTCHA shifts the cost of detection onto the user — either visibly (pick the traffic lights) or invisibly (run fingerprinting JavaScript and score the session). reCAPTCHA v3 and Turnstile are mostly invisible; v2 and hCaptcha's image-challenge mode are not.
UX cost: reCAPTCHA v2 drops form completion 5-15%. Even invisible v3 adds 100-300ms of JS load and flags a few percent of legitimate users for review.
How bots defeat them: three routes — buy solves from a human farm at $1-2 per 1,000 challenges, run ML-based solvers (which now work on most v2 image puzzles), or use stealth-plugin headless Chrome to score above the v3 threshold. Block rates have fallen from ~95% in 2022 to roughly 70-85% in 2026 depending on traffic mix.
Accessibility: screen readers struggle with image challenges. Motor-impaired users miss click-and-hold puzzles. The audio fallback in reCAPTCHA has been broken at various points in the last three years. If accessibility matters for your audience — and legally it has to in the EU and most US public sectors — invisible modes are the only acceptable form of CAPTCHA.
Domain allowlisting
Only accept submissions where the Origin or Referer header matches a list of approved domains. Useful when you control the form host (single-tenant SaaS, a single marketing site).
When it helps: single-tenant deployments, internal forms, JavaScript-only forms where you can enforce CORS at the edge. Catches a non-trivial slice of bots that POST directly to your endpoint without rendering your page.
When it breaks:multi-domain customers (any white-label SaaS, any agency-style usage), users on the same form across staging and production, browsers that strip the Referer header for privacy, and any bot that spoofs the Origin (trivially easy from outside a browser). It's a soft signal, not a hard gate.
Spam-word filters
The classic comment-spam tool: a regex of bad words and suspicious phrases ("viagra", "cheap", "SEO services", anything-followed-by-a-link). For comment systems in 2010 this was state of the art.
Status in 2026:mostly dead. LLM-generated spam doesn't use the trigger words because the bot was prompted not to. Worse, real users hit the filter constantly — "I need cheap pricing" is a legitimate inquiry that gets dropped. False-positive rates on word filters now exceed true-positive rates for any traffic that isn't comment-section spam from 2014.
Behaviour-based scoring (mouse movement, paste detection)
Track how the form was filled in: did the user move the mouse before clicking, did they tab between fields, did they paste the email in or type it, did they focus and blur fields naturally. Combine into a behavioural score.
Useful adjunct, not a primary defense. Modern browser-automation frameworks (Puppeteer-extra with stealth, Playwright with the right plugins, the entire CDP-stealth ecosystem) can fake all of these signals. But sloppy bots — and there are a lot of sloppy bots — submit without any pointer events at all. Capture the signals as features and feed them into a classifier; don't use them as binary blocks.
AI / ML spam classification
The modern primary defense. A classifier reads the submission (text fields plus metadata: time-on-page, IP reputation, behavioural score, honeypot status) and outputs a spam-likelihood probability. You set a threshold and route accordingly.
Why it works in 2026:the classifier isn't trying to detect "spammy words." It's learning the joint distribution of every signal. Even when the text is perfectly fluent, an LLM-generated submission tends to sit in a different region of that distribution than a real inquiry — different distribution of "ask" (what they want from you), different field-level entropy (an LLM's "company" field varies in characteristic ways), different alignment of message content to the page's actual subject.
What splitforms does: we run a custom-trained classifier on every submission, fine-tuned on millions of labeled form payloads (not blog comments, not chat — actual form submissions to actual contact and lead forms). False-positive rate runs at 1.5-3% in our production traffic depending on threshold; spam catch rate sits at 96-99% measured against manually-labeled hold-out sets. See our deep dive on AI form spam detection for the architecture.
Email verification (double opt-in)
For forms where the email itself is the conversion (newsletter, waitlist, ebook download), the cheapest spam filter on Earth is to email a confirmation link and only count the lead after they click. Bots almost never hold live mailboxes. Real users almost always do.
Orthogonal but powerful:double opt-in cuts list spam by 90%+, costs nothing, and (in the EU) is legally required for most marketing emails anyway. It doesn't protect against form-fill spam to your contactform, but on any newsletter or waitlist form it's the single highest-leverage move.
Layered defense: what actually works in 2026
No single layer catches everything. CAPTCHA is at 70-85%. Honeypot is at 50-75%. AI classifiers are at 96-99% but with a non-zero false-positive rate. The arithmetic of stacking layers is the whole game.
The right defense-in-depth stack for a modern form looks like this:
- Edge layer. Per-IP and per-prefix rate limiting at your CDN. Cloudflare, Vercel Edge, or AWS WAF — pick one, configure conservative buckets. This drops the firehose before it touches your code.
- Form layer (HTML). Honeypot field with proper accessibility attributes. Add a server-signed timestamp token to enable a time-to-submit check on the backend. Optional: Cloudflare Turnstile in invisible mode if you want a CAPTCHA tier.
- Backend layer.Validate the timestamp token (reject <2s and >60min). Compute a behavioural score from any captured client signals. Hash the IP and look it up in a reputation list (Spamhaus, Project Honey Pot, your own).
- AI layer.Pass message text plus every signal above (time-on-page, IP reputation, honeypot result, behavioural score, geographic mismatch with the form's expected audience) into a classifier. Output: spam probability.
- Routing layer.Below 0.4 → accept and deliver. 0.4-0.7 → accept, mark as "needs review", send a softer notification (no SMS, no Slack page). Above 0.7 → spam folder, deliver to a separate queue you can sample weekly.
- Verification layer. For opt-in forms (newsletter, waitlist, gated content): email a confirmation link and only count the lead post-click.
Each layer is independently tunable. The AI classifier is the heaviest hitter and the one you should actually look at every week — the others are static defenses, but the classifier's false positives shift as your traffic shifts. Sample 50 spam-flagged submissions weekly, label them by hand, and feed the disagreements back as training data.
splitforms ships layers 1, 2, 3, and 4 by default on every endpoint. Point your form at our endpoint and you get rate limiting, honeypot, time token, IP reputation, and the classifier — no configuration, no scripts, no consent banner. Layer 5 (routing) is exposed in the dashboard. Layer 6 (email verification) is a separate feature for newsletter forms. See splitforms spam protection for the full pipeline.
CAPTCHA's UX problem (and why it's costing conversions)
CAPTCHA is the most user-hostile spam defense ever shipped, and the conversion data has been catching up with industry intuition for years.
Conversion drop:industry estimates put reCAPTCHA v2 (the "select all images with traffic lights" flow) at an 8-12% drop in form completion. hCaptcha's image-challenge mode runs comparable — 5-12% depending on industry and audience. Even reCAPTCHA v3, which is mostly invisible, costs 1-3% of legitimate users when the score threshold flags their session and they get bounced into a fallback challenge or rejected outright.
For a B2B lead form converting at 4%, an 8% drop in completion is not 8% fewer leads — it's 8% fewer of the most-qualified portion of your funnel, the people who already filled in the email field. Pipeline math turns that into double-digit revenue impact at any scale.
Accessibility:WCAG 2.1 requires that authentication and verification mechanisms be accessible. Image-based CAPTCHAs fail this on every dimension: screen readers can't describe the image content, motor impairments make click-and-drag puzzles impossible, cognitive accessibility (the "am I a robot" framing itself) is hostile to neurodiverse users. Audio fallbacks have been intermittently broken and historically unusable in noisy environments.
GDPR exposure:reCAPTCHA loads Google scripts on every page that includes it (Google recommends loading it sitewide for v3 to work correctly), profiling visitors across the web. The Italian data protection authority has issued fines for sites using it without explicit, granular consent; France and Germany are moving the same direction. CAPTCHA isn't just a UX cost — it's a compliance exposure.
When CAPTCHA still makes sense:extreme-volume signup pages where adversaries are dedicated and motivated (think free-tier abuse on cloud platforms), login pages where credential-stuffing is the threat, and any case where you genuinely cannot run server-side defenses. For 95% of contact and lead forms in 2026, CAPTCHA is the wrong default.
GDPR, privacy, and your spam strategy
Spam protection that quietly profiles your visitors is not a free lunch. The provider you choose determines the compliance shape of every page that loads its script.
reCAPTCHA: shares data with Google, including IP, user-agent, and behavioural fingerprints tied across the web. The 2022 Italian DPA decision against a site using reCAPTCHA without consent set the EU precedent. If you serve EU traffic, deploying reCAPTCHA without an explicit consent banner is a compliance bet you will eventually lose.
hCaptcha:markets itself on privacy and provides a Data Processing Agreement, EU data residency, and no cross-site profiling. It's the least-bad CAPTCHA option for EU-heavy traffic. Caveat: the image-challenge difficulty has been criticised as significantly higher than reCAPTCHA, so the UX cost when challenges are triggered is real.
Cloudflare Turnstile:no cookies, no cross-site profiling, no behavioural fingerprinting in the persistent sense. It uses Cloudflare's own network telemetry rather than building a per-visitor profile. Free, fast, and the most privacy-preserving CAPTCHA-shaped option in 2026.
splitforms: our position is that spam protection should not require any third-party tracking. The classifier runs server-side on submission metadata, never on a persistent visitor profile. No scripts on your page, no cookies, no consent banner required. For teams that want a CAPTCHA tier on top we support Cloudflare Turnstile as an opt-in — never reCAPTCHA.
Honeypot field implementation guide
The cheapest first layer in any spam stack, but easy to get subtly wrong. Here's the version that actually works.
HTML.Use an input that looks legitimate to a bot — "website", "url", or "company_url" are good names because bots auto-fill them but real forms don't typically expect them. Avoid "email_2" or "name_alt" — those are blacklisted by bot frameworks.
<div class="hp-field" aria-hidden="true">
<label for="website">Website (leave blank)</label>
<input
type="text"
id="website"
name="website"
autocomplete="off"
tabindex="-1"
/>
</div>CSS. display: none is not enough. Some bots skip non-rendered inputs, and password managers / browser autofill can populate hidden fields. Use multiple hiding strategies in combination:
.hp-field {
position: absolute;
left: -9999px;
width: 1px;
height: 1px;
overflow: hidden;
opacity: 0;
pointer-events: none;
}The aria-hidden="true" attribute on the wrapper plus tabindex="-1" on the input takes the field out of screen-reader and keyboard-tab order. The autocomplete="off" tells password managers and browser autofill to skip it (most respect this; some don't — see common mistakes below).
Server-side check.Reject any submission where the honeypot field is non-empty. Reject silently — return a 200 OK with a fake success response so the bot doesn't learn you caught it.
// Express / Next.js Route Handler
export async function POST(req: Request) {
const data = await req.formData();
if (data.get("website")) {
// Honeypot tripped. Pretend success.
return Response.json({ ok: true });
}
// ... real handling
}Common mistakes.
- Visible to screen readers. Just
display: none+ a labeled input means screen-reader users can still hear and fill the field. Usearia-hiddenon the wrapper. - Autofilled by password managers. Some managers (older 1Password versions, Bitwarden in certain modes) ignore
autocomplete="off". Avoid field names like "email", "phone", "name" — they're aggressive autofill targets. Stick to "website", "url", or a custom name like "hp_token". - Detectable from CSS. Smart bots query the computed style of every field and skip ones with
opacity: 0or off-screen positioning. The only mitigation is to vary the hiding technique across deployments — splitforms rotates between five different CSS hide strategies on every page render. - Rejecting loudly. Returning a 4xx with "spam detected" in the body teaches the bot farm operator that your honeypot tripped. Respond 200 with a generic success message; the bot moves on.
For a fully wired-up honeypot in a real form, see our HTML form examples — every template ships with the hardened honeypot pattern above.
AI spam classification: how it works under the hood
"AI spam detection" covers two genuinely different architectures. Worth knowing the difference before you ship.
LLM-as-classifier.Send the form submission to a general-purpose LLM (GPT, Claude, a local Llama model) with a prompt like "classify this as spam or legitimate, return JSON with a score and reason." Cheap to start, surprisingly accurate out of the box, easy to iterate on the prompt. Works well on small volume; gets expensive fast at scale ($ per submission instead of $ per ten thousand).
Custom classifier.Train a small dedicated model — typically a fine-tuned BERT-style encoder or a gradient-boosted tree on hand-crafted features — on labelled form data. Slower to build, dramatically cheaper to run (under $0.0001 per submission), more controllable, and reliably faster. splitforms runs a custom classifier; the LLM-as- classifier route makes sense for low-volume teams who haven't collected enough labelled data yet.
Features that matter.The naive setup passes only the message text. The good setup passes everything: text fields, time-on-page, time-to-submit, IP reputation score, browser fingerprint hash, behavioural score, geographic match between IP country and the form's expected audience, honeypot status, referrer string, request headers, prior-submission history from the same IP/UA. The classifier learns their joint distribution. Spam tends to be inconsistent across these — text says "I'm a US-based CMO" but the IP geolocates to a residential proxy in a low-cost-labour region; that mismatch is a strong signal a single-feature model would miss.
Complement, not replacement.The classifier doesn't replace honeypot or rate limiting — it sits on top. Honeypot eliminates the cheapest 50-70% of traffic before classification even runs, which (a) saves the inference cost and (b) keeps the classifier focused on the harder cases where it actually adds value. Stripping the easy traffic first improves both cost and false-positive rate.
False-positive rate and tuning. A well-trained form classifier runs 1.5-4% false positives at the standard threshold. The number that matters more than the rate is the distribution — what kinds of legitimate submissions get flagged. Sales emails from real humans ("hi, I run an SEO agency, want to chat?") are the hardest segment; they look exactly like spam because they often arespam, just human-typed. Tune the threshold by sampling 50 flagged submissions per week and labeling them. If >5% of flags are false positives that matter to your business, lower the threshold. If >5% of accepted submissions are spam, raise it.
Cost considerations.Inference cost scales linearly with volume. A custom classifier runs $50-100/month per million submissions on commodity cloud hardware. An LLM-API approach can run $50-500 per million depending on the model. For most splitforms customers the per-submission cost of AI classification is a rounding error against the value of clean inboxes; for very high-volume newsletter signup pages (>10M submissions/month) it's a real line item and worth optimising.
Migrating from reCAPTCHA: a 30-minute walkthrough
The teams we see migrating off reCAPTCHA in 2026 share a small set of motivations. UX (conversion drop is real and measurable). GDPR exposure (Google data sharing is increasingly hard to defend post-Schrems II and the recent EU rulings). Accessibility (image challenges fail WCAG audits). And the slow erosion of reCAPTCHA's actual block rate as solver farms industrialised.
Step 1. Add a honeypot field using the implementation in the section above. Leave reCAPTCHA in place — you're going to A/B by traffic split, not flip the switch.
Step 2.Switch your form action to a spam-protected backend. If you're on splitforms, the classifier and rate limiter activate automatically — no configuration. If you're on a self-hosted backend, drop in a classifier API call (we use POST /api/classify internally; most providers expose something similar).
<!-- Before: reCAPTCHA wired in -->
<form action="/api/contact" method="POST">
<input name="email" required />
<textarea name="message" required></textarea>
<div class="g-recaptcha" data-sitekey="..."></div>
<button>Send</button>
</form>
<!-- After: honeypot + AI backend (splitforms) -->
<form action="https://splitforms.com/f/YOUR_FORM_ID" method="POST">
<input name="email" required />
<textarea name="message" required></textarea>
<div class="hp-field" aria-hidden="true">
<input type="text" name="website" autocomplete="off" tabindex="-1" />
</div>
<button>Send</button>
</form>Step 3.Run both stacks side-by-side for 7 days. Route 50% of traffic to each. Track three metrics: form completion rate, spam delivered to inbox, and false positives (real users blocked). The splitforms-side numbers are visible in the dashboard; for the reCAPTCHA side you'll need to instrument your own logging.
Step 4.After 7 days, decide. In the migrations we've run with customers the typical outcome is: completion rate up 4-9%, spam-in-inbox down 30-60%, false-positive rate equal or lower. If your numbers go the other way, hold reCAPTCHA — you probably have a high-adversary use case and a more aggressive defence is appropriate.
What to monitor in the first 7 days:
- Submission volume by hour. A surge of bot traffic that previously hit reCAPTCHA challenge rate-limits will now hit your endpoint. Confirm rate-limiting is working before you fully cut over.
- Spam-folder review. Sample 30 spam-flagged submissions on day 3 and day 7. Look for any pattern of legitimate inquiries being blocked — adjust the classifier threshold if so.
- Conversion lift in your funnel.The whole reason you're doing this. Compare the two arms' completion rates with statistical significance, not eyeballing.
- Customer reports.A small minority of users will report "your form rejected my message." That's normal at 2-3% false- positive rate. If you're getting more than one report per 1,000 legitimate submissions, lower the classifier threshold.
For a faster path, our free contact formships with the full layered stack out of the box; pair it with the hardened honeypot from the implementation guide and you're done. For a deeper comparison of single defenses see our head-to-head test of five spam methods.
Frequently asked questions
What's the best form spam protection in 2026?
There is no single best — the right answer is layered: a honeypot field to catch naive bots, per-IP rate limiting to slow brute-force, an AI classifier to read the actual message text, and (for opt-in forms) email verification. Each layer covers a different attack surface. CAPTCHA is optional and increasingly the wrong default because of UX and GDPR cost.
Is honeypot still effective?
Yes for naive bots, no for sophisticated ones. A well-implemented honeypot still blocks most drive-by spam at zero UX cost, but bots that render real headless Chrome and skip non-visible inputs will sail through. Honeypot is the cheapest first layer — keep it, but don't rely on it alone.
Is reCAPTCHA still worth using?
Increasingly no. Block rates have dropped as solving farms (real humans paid $1-2 per 1,000 challenges) industrialised, GDPR exposure has grown after EU regulators fined sites for using it without explicit consent, and conversion drop is measurable. Cloudflare Turnstile, hCaptcha, or a backend AI classifier replace it for most teams.
How does AI spam detection work?
An AI classifier reads the form fields (name, email, message, subject) and outputs a spam-likelihood score. Modern systems either fine-tune a small text model on labeled form data or prompt a general LLM with structured rules. Server-side, invisible to the user, so no UX cost — and unlike CAPTCHA, the message text itself is the signal.
Can I avoid CAPTCHA entirely?
Yes. The combination of honeypot, time-to-submit checks, per-IP rate limiting, and an AI classifier blocks 99%+ of spam without ever showing a challenge. CAPTCHA only really earns its UX cost on logins or extreme-volume forms (think: free signup pages for crypto products) where adversaries are dedicated.
Does splitforms include spam protection?
Yes. Every splitforms endpoint runs honeypot, time-to-submit, per-IP rate limiting, and an AI classifier by default. You don't paste in any keys, configure thresholds, or load any third-party scripts on your page. Cloudflare Turnstile is supported as an opt-in if you want a CAPTCHA tier on top.
What's the cheapest reCAPTCHA alternative?
Cloudflare Turnstile is free and unlimited. hCaptcha has a free tier. Honeypot is literally one line of HTML. The genuinely cheapest alternative is to delete reCAPTCHA, ship a honeypot, and rate-limit your endpoint server-side — all three are free and combined block more spam than reCAPTCHA alone.
How do I handle spam without making my form annoying?
Push the work to the server. Honeypot, time-to-submit, rate limit, AI classifier — all invisible to the user. Reserve any visible challenge (Turnstile, hCaptcha) for a small fraction of high-risk submissions, not every visitor. The user should never know spam protection exists.
Next steps
- Compare specific defenses head-to-head — how to stop contact form spam (5 methods compared).
- Go deeper on AI classification — AI form spam detection.
- Pick a CAPTCHA replacement — best CAPTCHA for a contact form.
- Honeypot or reCAPTCHA — honeypot vs reCAPTCHA.
- See the full pipeline — splitforms spam protection.