Guides
Last updated
August 21, 2026

What Is SMS Pumping Fraud? How to Detect and Stop It

Nicolas Rios
Nicolas Rios

Table of Contents:

Get your free
IP Geolocation
 API key now
stars rating
4.8 from 1,863 votes
See why the best developers build on Abstract
START FOR FREE
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
No credit card required

Your OTP bill doubled overnight, verification completion collapsed, and the traffic all points at number ranges you have never sold to. That is SMS pumping fraud, and it is billed to you at full price. This guide covers how the scheme works, what it costs, the signals that expose it, and a pre-send gate you can deploy today.

Try Phone Validation for free and check any number’s line type and country before you send the OTP. 100 free requests a month, no credit card required.

What is SMS pumping fraud?

SMS pumping fraud is a scheme where attackers trigger large volumes of SMS messages, usually one-time passcodes, from your app to premium-rate or revenue-share numbers they control. The fraudster splits the termination fee with a complicit party in the delivery chain, and you pay for every message. It is also called SMS traffic pumping or artificially inflated traffic (AIT).

How an SMS pumping attack works

The attack needs only a form that sends an SMS: a signup flow, a login with SMS 2FA, or a phone verification step. Bots submit thousands of numbers from ranges where the attacker earns a share of the termination fee. Your platform dutifully sends each message, and none of the codes is ever entered.

  1. The attacker acquires or controls number ranges with high termination payouts.
  2. Bots feed those numbers into your signup or 2FA form.
  3. Your backend sends an OTP to each number at your cost.
  4. The carrier or aggregator in the chain pays a revenue share to the attacker.
  5. Verification is never completed, and the cycle repeats until you notice the bill.

What SMS pumping costs: a worked model

The cost is send volume times per-message price, minus nothing, because no fraudulent send converts to revenue. The table below uses explicitly labeled assumptions so you can substitute your own numbers: 10,000 bot-driven OTP requests per day, an assumed average of $0.05 per international A2P message, and an assumed 80% of fraudulent sends hitting high-payout ranges.

These per-message prices are illustrative assumptions, not quotes. Your real rates come from your SMS provider invoice, and they vary widely by destination and route.

ScenarioFraudulent sends per dayAssumed cost per sendMonthly cost of fraud
Ungated signup form10,000$0.05$15,000
Same form, VoIP line-type gating2,500$0.05$3,750
VoIP gating plus a country allowlist400$0.05$600

The reduction factors are also assumptions to calibrate, not guarantees: gating removes the share of attack traffic that resolves to VoIP or to countries you never sell to, and that share is different for every service. Measure your own split before and after enabling each control.

Which destinations carry the most risk?

SMS pumping concentrates where termination fees are highest and oversight is weakest. Rather than publishing a rate sheet that would be stale in a quarter, classify destinations into three buckets and set a default action per bucket. Review the buckets monthly against your own delivery invoice, which is the one rate source that is always current for you.

BucketHow to define itDefault action
Countries you sell toYour active customer geographyAllow, monitor completion rate
Countries you might sell toAdjacent markets, low current volumeChallenge: require an extra step before sending
Countries with no business relevanceNo customers, no roadmap, high per-message price on your invoiceBlock by default, allow by exception

Detection signals and starting thresholds

No single signal is conclusive. Combine the five below, and treat every threshold as a calibration starting point against your own baseline, not an industry constant. Each row notes what legitimate traffic looks like so you tune rather than copy.

SignalHow to measure itStarting pointFalse-positive risk
Send-to-completion ratio by countryOTPs entered divided by OTPs sent, grouped by country codeInvestigate any country under half your global averagePoor delivery routes also depress completion
Prefix clusteringCount of sends sharing the first 7 to 8 digits in an hourAlert at 10 or more per prefix per hourOffices and campuses share prefixes legitimately
VoIP share of requestsShare of numbers resolving to a voip line type pre-sendAlert when the share doubles over your 30-day baselineSome real users live on VoIP numbers
Burst clusteringSends per minute against the same hour last weekAlert at 5 times the baselineMarketing pushes create honest bursts
IP-to-number ratioUnique numbers requested per IP per hourAlert at 5 or more numbers from one IPCarrier-grade NAT pools many users on one IP

Build a pre-send gate

The cheapest message is the one you never send. Before your backend hands a number to the SMS provider, resolve its line type and country with one request to Abstract’s Phone Validation, then refuse VoIP numbers and countries outside your allowlist. A real response looks like this:

{
  "phone": "+14152007986",
  "valid": true,
  "format": { "international": "+14152007986", "local": "(415) 200-7986" },
  "country": { "code": "US", "name": "United States", "prefix": "+1" },
  "location": "California",
  "type": "voip",
  "carrier": "Twilio"
}

The type field and the country object are the two decision inputs. Here is the same gate in Node.js and Python, returning a structured reason code your risk team can log:

// Pre-send gate: refuse to send an OTP to risky numbers
const API_KEY = process.env.ABSTRACT_PHONE_KEY;
const ALLOWED_COUNTRIES = ["US", "CA", "GB"];

async function canSendOtp(phone) {
  const url = "https://phonevalidation.abstractapi.com/v1/?api_key="
    + API_KEY + "&phone=" + encodeURIComponent(phone);
  const res = await fetch(url);
  const data = await res.json();

  if (!data.valid) {
    return { allow: false, reason: "invalid_number" };
  }
  if (data.type === "voip") {
    return { allow: false, reason: "voip_line_type" };
  }
  if (!ALLOWED_COUNTRIES.includes(data.country.code)) {
    return { allow: false, reason: "country_not_allowed" };
  }
  return { allow: true, reason: "ok" };
}
# Pre-send gate: refuse to send an OTP to risky numbers
import os
import requests

API_KEY = os.environ["ABSTRACT_PHONE_KEY"]
ALLOWED_COUNTRIES = {"US", "CA", "GB"}

def can_send_otp(phone):
    res = requests.get(
        "https://phonevalidation.abstractapi.com/v1/",
        params={"api_key": API_KEY, "phone": phone},
        timeout=5,
    )
    data = res.json()
    if not data.get("valid"):
        return {"allow": False, "reason": "invalid_number"}
    if data.get("type") == "voip":
        return {"allow": False, "reason": "voip_line_type"}
    if data.get("country", {}).get("code") not in ALLOWED_COUNTRIES:
        return {"allow": False, "reason": "country_not_allowed"}
    return {"allow": True, "reason": "ok"}

You can sanity-check any suspicious number by hand first: check a number’s line type free, no key required, or confirm the number is live on a network with an HLR check before trusting a burst of signups.

Enter an IP address to start
Need inspiration? Try
73.162.0.1
LOCATE
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Checking
5
Results for
ip address
Country:
TEST
Region:
TEST
City:
TEST
Coordinates:
TEST
Zip code:
TEST
Connection:
TEST
Get free credits, more data, and faster results

SMS pumping vs toll fraud vs smishing vs spoofing

Four different schemes share the SMS label, and mixing them up leads to the wrong defense. SMS pumping inflates your outbound sending bill. Toll fraud pumps voice calls to premium numbers, classically through a compromised PBX. Smishing targets your users with fraudulent inbound texts. Spoofing forges the sender identity on a message. Only the first one is fixed by gating your own sends.

What is an SMS spoofing attack?

SMS spoofing forges the sender ID on a text so it appears to come from a brand or person the victim trusts. It attacks your users’ trust rather than your sending budget, and the defenses are sender-ID registration and user education, not send-path gating.

How can you check if an SMS is real or fake?

Check the sender against the short code or number the brand publishes, distrust links, and go to the app or site directly instead of tapping through. For businesses, registering sender IDs where local regulation supports it makes forgery harder.

What are the main types of SMS fraud?

The recurring families are SMS pumping (inflated outbound traffic billed to a business), smishing (phishing by text), spoofing (forged sender identity), and grey-route abuse (messages delivered outside sanctioned carrier agreements). Each has a different victim and a different fix.

What to monitor after you gate

Track one number weekly: send-to-completion ratio by country. A gated flow should show completion rising toward your home-market baseline while total sends fall. If a specific country stays near zero completion after gating, move it from the challenge bucket to the block bucket and note the date so you can attribute the cost drop on the next invoice.

What number gating does not stop

Honesty matters here. A pre-send gate does not stop an attacker rotating real mobile numbers in your home market, and it cannot fix a compromised route inside a carrier. Layer rate limits per IP and per account, a bot challenge on the form itself, and provider-side destination controls on top. Gating removes the cheap, scaled version of the attack, which is most of it, and it does so before the message is billed. For the account-farming half of the same problem, see OTP bots, which attack the same send path from the other side, and the underlying signal in how VoIP number verification works.

Frequently Asked Questions

What is SMS pumping?

SMS pumping is fraud where attackers use bots to trigger one-time passcodes from your app to premium-rate or revenue-share numbers they control. They collect a share of each message’s termination fee while you pay the sending bill, and no verification is ever completed.

How do you detect SMS pumping?

Watch the send-to-completion ratio by country, bursts of sends to numbers sharing a prefix, a rising share of VoIP line types, and many numbers requested from one IP. A sudden SMS cost spike with flat signups is usually the first visible symptom.

How do you prevent SMS pumping?

Gate before you send: resolve each number’s line type and country, refuse VoIP numbers, and enforce a country allowlist. Add per-IP and per-account rate limits and a bot challenge on the form. Every blocked send is money saved, because you pay per message.

Who pays for SMS pumping fraud?

The business sending the messages. Fees settle through the carrier chain regardless of whether a human ever reads the message, and refunds are rare. The attacker’s payout comes from a revenue-share agreement somewhere along the delivery route.

Is SMS pumping the same as toll fraud?

No. SMS pumping inflates outbound text volume billed to your messaging account, while toll fraud pumps voice calls to premium-rate numbers, often through a hijacked phone system. The economics rhyme, but the entry points and defenses are different.

Does blocking VoIP numbers hurt real users?

Some legitimate users do run VoIP numbers, so measure the share in your own traffic first with a tool like Abstract’s free line type checker. Many teams challenge VoIP signups with an alternative verification method instead of refusing them outright.

Nicolas Rios
Nicolas Rios

CEO at Abstract API

Get your free
IP Geolocation
key now
See why the best developers build on Abstract
get started for free

Related Articles

Get your free
IP Geolocation
key now
stars rating
4.8 from 1,863 votes
See why the best developers build on Abstract
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
No credit card required