Detect spam
Send a batch of comments, contact-form fills or reviews and each one comes back with a spam likelihood and a short reason, so junk is approved, rejected or routed to review before a moderator reads it. You pay per use, with no subscription.
Run it online
Run this on our servers with your account. Free tools run in your browser; this one bills your KIT balance per the price above.
Every open form on the internet eventually becomes a spam magnet.
Why keyword filters stopped being enough
Anyone running a comment section, a signup form, a marketplace review box or a support inbox eventually hits the same wall: bots and low-effort spam outnumber real submissions. Small teams have no moderation staff, and large ones do not want people reading pitches for counterfeit shoes all day. Spam filtering has always been an arms race. The earliest filters were keyword blocklists, then came statistical filters trained on labeled examples, and today language-aware models read intent and phrasing instead of matching fixed patterns. That matters because modern spam rarely repeats itself word for word: it is paraphrased, translated or generated on the fly.
Where the score fits in your workflow
Score every incoming comment before it publishes, hide anything above your threshold automatically and queue borderline cases for a moderator. Filter bot-generated form fills so a sales inbox only receives submissions worth a reply. Catch fake reviews and promotional spam before they affect a product's rating, and strip junk tickets out of the support queue so agents spend their time on real customer issues. Because each item carries a likelihood and a short reason, you decide how conservative to be. Large batches are the normal way to use it, and a failed task is retried automatically three times.
Who actually needs this
Anyone running a comment section, a signup form, a marketplace review box or a support ticket intake eventually hits the same wall: bots and low-effort spam outnumber real submissions. Small teams don't have a moderation staff, and large ones don't want one reading pitches for counterfeit shoes all day.
Why spam detection is a moving target
Spam filtering has always been an arms race: the earliest heuristics were keyword blocklists, then Bayesian filters learned from labeled corpora, and now language-aware models read intent and phrasing rather than matching fixed patterns. That shift matters because modern spam rarely repeats itself word-for-word — it's paraphrased, translated, or generated on the fly, so a filter that only knows yesterday's spam misses today's.
What you can do with it
Comment sections at scale
Score every incoming comment before it publishes, auto-hiding anything above your spam threshold and queueing borderline cases for a moderator.
Contact and lead forms
Filter out bot-generated form fills so your sales inbox only receives submissions worth a reply.
Marketplace and review pages
Catch fake reviews and promotional spam before they affect a product's rating or public trust.
Support ticket intake
Strip junk tickets out of the queue so agents spend time on real customer issues, not ad spam.
FAQ
Is there a free tier for spam detection?
There's no free tier — free tiers get abused and slow everyone down. No subscription, no tokens, no invented credits, and a failed task is never charged.
What does the response actually contain?
Each item gets a spam likelihood and a short reason code, enough to drive auto-approve, auto-reject or human-review logic in your own workflow.
Does it work on languages other than English?
The model reads intent and phrasing rather than matching fixed keyword lists, which lets it handle spam across languages, not just English patterns.
What happens if a scoring task fails?
The task retries automatically up to three times; if it still fails, you get a clear error and are not charged for that item.
How do I handle borderline messages?
Set your own threshold. Each item gets a spam likelihood and a short reason, so you can auto-approve clear cases, auto-reject obvious junk and send everything in between to a moderator, as strict or lenient as your workflow needs.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/text/spam \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"El informe trimestral cerró con 1,2 M€ de ingresos."}'const res = await fetch("https://api.kit.forhosting.com/text/spam", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "El informe trimestral cerró con 1,2 M€ de ingresos."
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/spam",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "El informe trimestral cerró con 1,2 M€ de ingresos."
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/spam", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"El informe trimestral cerró con 1,2 M€ de ingresos."}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"El informe trimestral cerró con 1,2 M€ de ingresos."}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/spam", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"text": "El informe trimestral cerró con 1,2 M€ de ingresos."
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.spam",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_tokens | 20000 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
422 | task_failed | The task failed after 3 retries. You are never charged for it. |
Technical notes
This spam detection API scores incoming text — comments, contact-form submissions, reviews, forum posts — so you can hold, flag or drop the junk before it ever reaches a moderator's queue.
Who actually needs this
The text.spam endpoint exists for that exact gap — a scoring layer you drop in front of anything users can type into.
What you send and what comes back
Each item in the result carries a spam likelihood and a short reason code, which is enough signal to auto-approve, auto-reject or route to human review, depending on how conservative your workflow needs to be. You POST an array of text items to /text/spam and immediately get a task_id — the scoring itself runs asynchronously so you're never holding a connection open while a batch of ten thousand comments gets classified.
Fitting it into a pipeline
Because results land on a signed webhook, the typical setup is a queue worker that submits new comments as they arrive and updates a status column when the webhook fires — no polling loop needed. Teams that prefer not to run a receiving endpoint can instead fetch the result from the signed link, valid for 24 hours, which is enough time for a nightly moderation batch.
What it costs and when
Pricing is a flat $0.003 per request plus $0.0135 per item scored, and you're only billed for items that were actually processed — a failed task is retried three times automatically and never charged if it still fails. There's no free tier and no trial balance; access requires an prepaid balance, which keeps the endpoint free of the abuse that free tiers tend to attract.
Technical questions
How does the spam detection API work?
You send text items to POST /text/spam, get a task_id back, and receive a spam score plus reason code per item once processing finishes, delivered by webhook or signed link.
How much does it cost to score comments or form entries?
It's $0.003 per request plus $0.0135 per item scored, and you're never charged for a task that ultimately fails.
Can I send a large batch of comments at once?
Yes, the endpoint is built for bulk scoring — submit an array of items in one request and results arrive asynchronously as a batch.
How do I get the results — webhook or polling?
Results are delivered via a signed webhook, which is recommended, or through a signed link valid for 24 hours if you'd rather fetch on your own schedule.