How to stop free-credit abuse on an AI app
Free credits on an AI product cost real inference. How credit farms work, why per-account rate limits don't stop them, and where in the signup flow to decide.
Why free credits on an AI product are different
On most SaaS products a fake account costs you a database row and some noise in your metrics. On an AI product every free account can spend real money: each prompt runs inference on GPUs you pay for. Free credits are effectively cash, and anything that converts to cash attracts automation.
That changes who abuses the free tier. Besides people who just want more free usage, you also get credit farms: scripts that create many accounts, collect the free credits from each, and either resell access or use it to run their own workloads through your API.
How a credit farm works
The details vary, but the shape is consistent:
- Accounts are created by a script, usually a headless browser driven by Puppeteer, Playwright or Selenium, sometimes an anti-detect browser that randomizes its fingerprint.
- Inboxes are throwaway: disposable domains, catch-all domains the farmer owns, or one Gmail account written dozens of ways with dots and plus tags.
- Traffic comes from servers: cloud providers and hosting companies are cheap, so many farms run there, sometimes behind proxies or Tor.
- Credits are drained fast, often in the first minutes, before any usage-based alarm can react.
Why per-account rate limits don't help
Rate limits protect you from one account using too much. A credit farm never does that: each account stays politely within its free allowance. The abuse is in the number of accounts, so the defence has to happen at signup, before the credits are granted — not later, at the usage layer.
The right question is not “is this request abusive?” but “should this new account get free credits at all, and how many?”.
Signals that expose a farm at signup
Automation
Browsers controlled by automation leave traces: navigator.webdriver set to true, a HeadlessChrome user agent, a DevTools-protocol client attached, software WebGL rendering, a zero-size window. Each can be patched by a careful operator, which is why they work best combined. Our guide on detecting headless browsers goes through them one by one.
Network
Real users sign up from home and mobile networks. Signups from cloud ranges (AWS, Google Cloud, Oracle, DigitalOcean, Linode) and Tor exits deserve more scrutiny, and so does any address or subnet that created many accounts today.
Inbox
Disposable domains, domains that cannot receive mail, and Gmail aliases of an existing account. See Gmail dots and plus aliases.
Links between accounts
The strongest signal for a farm is that its accounts belong together: same device, same normalized mailbox, same card fingerprint. One linked account is weak evidence; ten is a farm.
Where to put the check
Call your fraud check on the server after the signup form is submitted and before you credit the account. If credits are granted by a background job or on e-mail confirmation, put the check right before that step instead. The point is that the decision exists before the credits do.
// Node.js, before granting free credits const res = await fetch("https://attrelix.com/v1/check", { method: "POST", headers: { Authorization: `Bearer ${process.env.ATTRELIX_SECRET}`, "Content-Type": "application/json" }, body: JSON.stringify({ email, ip, visitor: req.body.attrelix_visitor }), signal: AbortSignal.timeout(3000), }).catch(() => null); const decision = res?.ok ? (await res.json()).decision : "allow"; const credits = { allow: 100, review: 10, block: 0 }[decision] ?? 100; await grantCredits(user.id, credits);
Graduated credits beat hard blocks
A pattern that works well for AI products is to scale the free credits with the risk instead of choosing between all or nothing:
- Allow: the full free allowance.
- Review: a small allowance — enough to try the product — and the rest after a card, a phone number or a verified e-mail.
- Block: no free credits; offer the paid plan.
Honest users who land in review still get to try the product, and a farm that gets a tenth of the credits per account loses most of its economics.
Know what it costs you
Put a number on the problem: multiply the value of the free credits a new account receives by the number of accounts your check would have sent to review or block. That is the monthly cost of doing nothing, and it tells you how much friction is worth adding. The Attrelix dashboard does this calculation from your own credit value.
Summary
- Credit farms stay within per-account limits; stop them at signup.
- Combine automation, network, inbox and account-link signals.
- Decide before the credits exist, and fail open if the check is unavailable.
- Scale credits with risk instead of blocking outright.