Use case

SaaS free-trial and sign-up abuse

Score SaaS and AI-product sign-ups by line type, reachability, mailbox existence and spam reputation, spot repeated test patterns, and add friction only where the signals call for it.

Last updated

A laptop shows a cURL request and a JSON response next to tiles for REST API, SDKs, webhooks and test mode, under the headline One API, 42 checks, 5 families.
One API, 42 checks, 5 families; pay only for conclusive answers.

SaaS free-trial abuse is repeated sign-ups by the same people to reuse free trials, credits or free tiers. Checking the phone number and e-mail at sign-up gives you quality signals: line type, whether the mobile line is live, whether the mailbox exists and, where enabled, spam reputation. Use them to add friction selectively, never as identity claims.

Why is free-trial abuse hard to stop?

Free trials and free credits exist to let real prospects try the product. AI products have raised the stakes: a free tier that includes model usage has a direct compute cost per account, so each abusive sign-up costs real money, not just a seat in a database. The people farming trials know the usual defences:

  • Throwaway e-mail addresses. Invented or short-lived addresses at big webmail providers, or variations such as name1@, name2@, name3@.
  • Cheap phone numbers. Numbers from VoIP apps and online number services pass a format check and can often receive a code.
  • Automation. Scripts create accounts in bursts, often following a visible pattern in the addresses or numbers they use.
  • Real people, repeatedly. Some abuse is simply one person who never wants to pay, using a new address each month.

No single signal separates abusers from new users. What helps is a handful of cheap, explainable signals, combined with your own data, feeding a decision that adds friction only where it's needed. The OWASP Automated Threats project lists account creation (OAT-019) as a distinct automated threat worth designing for.

Which sign-up signals help?

  • Line type. The carrier lookup reports mobile, fixed_line, voip and other types. A VoIP number isn't bad on its own, but it changes how much trust a phone number adds. See VoIP number.
  • Reachability. The HLR lookup says whether a mobile number is assigned and reachable now. An unassigned number (status: invalid) can't be a real user's phone.
  • Mailbox existence. The e-mail mailbox check answers whether the mailbox exists at major webmail providers. A made-up address fails here before you spend a verification e-mail on it.
  • Spam reputation (limited access). Spam reputation reports regulator actions, complaint data, community reports and recently unassigned numbers, with the reasons.
  • Repeated test patterns. Look in your own sign-up data for addresses that differ only by digits, sequential phone numbers, or many sign-ups from one device or network. The API applies its own anti-enumeration rules: a request with 20 or more consecutive numbers, or 20 or more addresses on one domain that differ only by digits, is refused with suspected_enumeration.

None of these signals says who someone is. They say how much a given number or address is worth as evidence of a real, reachable user.

How does the workflow look?

  1. Normalize. Pass the number as entered with default_country if needed; the API converts it to E.164.
  2. Check. Call POST /v1/lookup with the number and address and checks: ["carrier", "email"], plus hlr or spam if you use them. Use wait: 5.
  3. Score. Combine the results with your own signals (device, IP reputation, payment method, prior accounts) into a tier: full trial, reduced trial, or verify first.
  4. Apply friction by tier. Full trial for strong signals; a smaller credit allowance or a second factor for mixed signals; card or manual review for weak ones.
  5. Don't block on missing data. unknown and pending count as neutral.
  6. Log the decision with checked_at, not the raw response, and review your thresholds regularly against real conversion and abuse data.

Which checks answer which question?

CheckWhat it answersWhen to run itLink
carrierMobile, VoIP, fixed line or another type?Every sign-up with a phone numberCarrier lookup
emailDoes the mailbox exist at a major webmail provider?Every sign-upE-mail mailbox check
hlrIs the mobile number assigned and reachable now?Sign-ups that unlock paid resourcesHLR lookup
spam (limited access)Is the number in spam or fraud reports?Where enabled for your accountSpam reputation
whatsappIs the number registered on WhatsApp?Optional extra weight for a real, in-use numberWhatsApp number check

What should you do with each result?

SignalsSuggested tier
Mobile line, reachable, mailbox existsFull trial
Mobile line, mailbox unknown (company domain)Full trial; company domains are often outside mailbox coverage
line_type: voip and an otherwise clean sessionReduced credits, or a second factor before the full allowance
Mailbox registered: falseAsk the user to fix the address before the trial starts
HLR status: invalidAsk for another number; this one isn't assigned
Spam risk_level: high (if enabled)Verify first: card check or manual review
Pattern match in your own data (e.g. name7@, name8@ minutes apart)Verify first, and review the burst
Checks unknown or pendingNeutral; decide on your other signals

What does a request look like?

This test-mode request checks one number and one address. +447700900002 has no carrier data (unknown, free) and [email protected] has no mailbox.

curl https://api.mobilevalidate.com/v1/lookup \
  -H "Authorization: Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym" \
  -H "Content-Type: application/json" \
  -d '{"numbers":["+447700900002"],"emails":["[email protected]"],"checks":["carrier","email"],"wait":5}'

Runs as pasted with the public sandbox key, which answers the test values only. In the SDKs, omit the key to use MOBILEVALIDATE_API_KEY.

Response (excerpt, test mode: the checks of the phone row, then of the e-mail row):

JSON
[
  {
    "network.carrier": {
      "service": "network.carrier", "status": "unknown", "registered": null, "attributes": null,
      "confidence": null, "confidence_score": null, "checked_at": null,
      "cached": false, "age_seconds": null, "billed": false, "reason": "NO_DATA", "poll_after_ms": null
    }
  },
  {
    "email.valid": {
      "service": "email.valid", "status": "completed", "registered": false, "attributes": null,
      "confidence": "high", "confidence_score": 0.99, "checked_at": "2026-09-29T11:20:05.733Z",
      "cached": false, "age_seconds": 0, "billed": false, "reason": null, "poll_after_ms": null
    }
  }
]

The carrier answer is neutral and free. The mailbox doesn't exist, so the sign-up form asks for a working address before the trial starts.

How much does it cost?

You pay per check, and only for conclusive answers. Unknown answers are free, as are invalid input, duplicates and unsupported countries. A two-check sign-up bills at most two checks. The HLR lookup is $0.005 per number; see pricing for the carrier, e-mail and other rates.

Compare that with what an abusive account costs you: free credits consumed, compute, support tickets and skewed funnel data. Most teams run the cheap checks on every sign-up and the HLR or spam check only on sign-ups that unlock expensive resources. Repeat checks of the same number inside the freshness window come from your cache for free, and max_cost caps any single request.

  • Tell users. Say in your privacy notice that you check phone numbers and e-mail addresses at sign-up to prevent fraud and abuse.
  • No identity claims. The results are risk signals about a number or an address. Don't present them to users or staff as identity verification, and don't use them for credit, employment, housing or insurance decisions.
  • Proportionate friction. Give flagged users a way through: a second factor, a card check or a support contact. Genuine users with VoIP numbers or new addresses exist.
  • Data minimization. Store the tier and checked_at, not full responses. Our privacy checklist lists the questions to settle before launch.
  • Only your own sign-ups. Check the details people give you. Our acceptable use policy forbids enumerating numbers or addresses.

What are the common mistakes?

  • One hard rule. "Block all VoIP" loses real customers and teaches abusers to buy a different number type. Use tiers.
  • Treating unknown as fraud. Company domains and slow networks return unknown. It's neutral.
  • Checking after the credits are granted. Run the check before the trial allowance is unlocked.
  • Retrying around suspected_enumeration. If the API refuses a request as a pattern, review the burst of sign-ups instead of splitting the request.
  • Never re-tuning. Abuse patterns change. Compare your tiers with actual conversions and abuse every month.

For the OTP side of the same problem, see OTP and sign-up fraud.

Frequently asked questions

What is free-trial abuse?

It is when one person or group signs up again and again to keep using a free trial, free credits or a free tier, usually with throwaway phone numbers and e-mail addresses. It costs compute, support time and distorted conversion data.

Which signals help at sign-up?

Line type (mobile, VoIP, fixed line), whether the mobile line is reachable, whether the e-mail mailbox exists, spam reputation where enabled, and patterns in your own sign-up data such as many addresses that differ only by a number.

Should I block VoIP numbers?

Usually not. Many real users have VoIP numbers, especially in business settings. Treat VoIP as a reason for a smaller trial, a second factor or a card check, not as an automatic block.

Does this identify the person behind a sign-up?

No. The checks describe the number or the address, never the person. We don't return names, profiles or linked accounts, and the results must not be used as identity verification.

Do you detect disposable phone numbers or disposable e-mail domains?

We don't sell a disposable-number or disposable-domain list. The carrier lookup reports VoIP line types and the mailbox check reports whether an address exists at major webmail providers; combine those with your own rules.

How fast is the check in a sign-up flow?

POST /v1/lookup waits up to 30 seconds (default 10). For sign-up, pass a short wait such as 5 seconds; anything still pending can finish in the background while the user continues.

What does an unknown answer mean?

No conclusive answer, for example after a timeout or for an e-mail provider we don't cover. It is not charged, and it should not count against the user.

Is spam reputation available to every customer?

Not yet. Spam reputation is in limited access (internal customers only). The carrier, HLR and e-mail checks are available to all customers.

Know before you send.

Tell us about your use case. We review every request and set you up with test and live keys.