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.
- The attacker acquires or controls number ranges with high termination payouts.
- Bots feed those numbers into your signup or 2FA form.
- Your backend sends an OTP to each number at your cost.
- The carrier or aggregator in the chain pays a revenue share to the attacker.
- 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.
| Scenario | Fraudulent sends per day | Assumed cost per send | Monthly cost of fraud |
|---|
| Ungated signup form | 10,000 | $0.05 | $15,000 |
| Same form, VoIP line-type gating | 2,500 | $0.05 | $3,750 |
| VoIP gating plus a country allowlist | 400 | $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.
| Bucket | How to define it | Default action |
|---|
| Countries you sell to | Your active customer geography | Allow, monitor completion rate |
| Countries you might sell to | Adjacent markets, low current volume | Challenge: require an extra step before sending |
| Countries with no business relevance | No customers, no roadmap, high per-message price on your invoice | Block 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.
| Signal | How to measure it | Starting point | False-positive risk |
|---|
| Send-to-completion ratio by country | OTPs entered divided by OTPs sent, grouped by country code | Investigate any country under half your global average | Poor delivery routes also depress completion |
| Prefix clustering | Count of sends sharing the first 7 to 8 digits in an hour | Alert at 10 or more per prefix per hour | Offices and campuses share prefixes legitimately |
| VoIP share of requests | Share of numbers resolving to a voip line type pre-send | Alert when the share doubles over your 30-day baseline | Some real users live on VoIP numbers |
| Burst clustering | Sends per minute against the same hour last week | Alert at 5 times the baseline | Marketing pushes create honest bursts |
| IP-to-number ratio | Unique numbers requested per IP per hour | Alert at 5 or more numbers from one IP | Carrier-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.
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.