SMS-pumping (AIT) protection: read the risk score before you send
SMS-pumping — also called artificial-inflation of traffic (AIT) — is the fraud pattern where an attacker (or a complicit premium-rate number owner) drives fake traffic to destination numbers that pay out on inbound SMS. The attacker converts stolen signup forms, bot-driven OTP requests, or compromised senders into messages to IRSF (International Revenue Share Fraud) ranges and premium-rate destinations; the platform bills every accepted leg, and the fraudster pockets the carrier payout. Orbit ships three API surfaces that expose this pattern to you before and after it costs money. This guide explains what each surface computes, how to read the score, and where to wire it into a send path. Every surface below is advisory and read-only. None of them sends, routes, blocks, or modifies any outbound message — outbound traffic exits only through the Devotel softswitch, exactly as before. The platform computes the verdict; the decision to act on it — allow, review, or refuse a send — is always the tenant’s.1. What SMS-pumping actually looks like
A pumping attack inflates your SMS spend in two recognisable shapes:- Premium-rate / IRSF destinations. Traffic drifts to numbers on revenue-share ranges (historically Cuba, Somalia, Sierra Leone-class corridors). Each accepted message bills at several times a normal rate.
- OTP-completion collapse on Verify. Bots request real SMS OTPs but never enter a code. Verify’s per-destination conversion (verified ÷ sent) falls far below your tenant baseline while carrier spend keeps accruing.
2. The three surfaces
A fourth Verify-specific detector,
GET /api/v1/verify/conversion-anomaly, flags destinations whose OTP completion rate is far below your tenant baseline and reports the estimated spend at risk — run it periodically as the detection side of the same posture.
3. Reading the score
All scoring surfaces return the same three top-level fields:score— a composite risk score from 0 (clean) to 100 (certain block).band— a coarse label derived from the score: below 25low, 25+elevated, 50+high, 80+critical.recommendation— the mapped advisory action:allow,review, orblock.
high band means the same thing on POST /messages/risk-signals and on POST /risk/score.
The composite verdict also returns a per-channel breakdown — sms_pumping, url_reputation, verify_fraud, voice_biometrics — naming which detector(s) fired and their individual scores. The composite is the maximum of the present channels (worst present channel), chosen deliberately: a message that reviews on any single channel gets flagged rather than averaged back to low, and a destination with no signal at all returns a clean score of 0 rather than a misleading average.
The standalone SMS-pumping score returns a factors array instead — one entry per signal that contributed, with a machine-readable code, the points it added, and a human-readable detail. The per-factor breakdown sums (before the 100 cap) into the composite score, so the verdict is never a black box.
4. Advisory, not enforcing
Tenants that want the platform’s built-in enforcement layer on top can configure Fraud Shield on the messaging side (GET / PUT /api/v1/messages/fraud-shield, then POST /api/v1/messages/fraud-shield/evaluate to turn a score into a terminal allow/review/block decision against your own thresholds and country lists) and the Fraud Guard on the Verify side (which can refuse an OTP pre-send). Those are separate, tenant-owned configurations; this guide covers only the always-on scoring surfaces.
5. Worked examples
Composite verdict: POST /api/v1/risk/score
Query the fused verdict for a destination before a send. Supply channel so the correct velocity aggregate drives the SMS-pumping leg, and optionally the message body so URLs inside it are reputation-scanned.
verify_signal / voice_biometrics_signal so the composite folds them into the same verdict instead of you reconciling four independently-banded results.
Per-factor breakdown: POST /api/v1/messages/risk-signals
When the composite flags a destination, the standalone scorer tells you exactly which signals fired:
Historical posture: GET /api/v1/verify/fraud-analytics
Aggregate what the fraud-event ledger already caught over a window (1–90 days, default 30):
GET /api/v1/verify/conversion-anomaly (same window_days query) to see unblocked AIT suspects — destinations converting far below your baseline — and download GET /api/v1/verify/conversion-anomaly/evidence-export.csv when you need an RFC-4180 evidence pack for a carrier chargeback dispute.
6. Webhooks and the fraud-event ledger
Two streams make the posture observable after the fact:verification.fraud_blocked— emitted when the pre-send Fraud Guard refuses an OTP send. The payload carries the channel, destination, the computedrisk_score, and the machine-readablefraud_reasons(for example["risk_block", "roaming"]). Pre-send refusals are deliberately not reported asverification.failed— no verification row exists, so there is no phantom failure. See the webhook events reference for the full payload shape and the companionverification.fraud_step_upevent.- The fraud-event ledger — every block and step-up verdict persists to a per-tenant ledger.
GET /api/v1/verify/fraud-analytics(above) is the reporting surface over it: per-channel and per-reason totals, a per-day series, and the cumulative estimated spend saved by the blocked events.
7. Wire it into the send path
Query before committing spend, not after. The cheapest integration point is the campaign or send orchestration code that already validates a recipient:GET /api/v1/verify/fraud-analytics daily and GET /api/v1/verify/conversion-anomaly weekly; when the anomaly report flags a new destination, feed it back into your send-side policy (or your outbound blocklist, which the scorer itself reads) so the next send to that destination scores critical immediately.
What’s next
- Risk API reference — full parameter and response schema for the composite verdict.
- Messaging API reference — the
risk-signalsscorer, Fraud Shield configuration, and theevaluatedecision endpoint. - Verify API reference —
conversion-anomaly,fraud-analytics, and the evidence-export CSV. - Webhook events reference —
verification.fraud_blockedpayload and the pre-send-block error contract.