disposable_range
Not listed, but in a range crowded with SMS-receiving numbers
The Spaw phone risk signal disposable_range adds 30 points to risk_score when the number is not on the open SMS-receiving lists itself but sits in a 1,000-number range holding 10 or more listings that still score disposable (dataset disposable-phone-numbers).
- risk weight
- +30
- dataset
- disposable-phone-numbers
- reads from
- no field of its own
- default SMS policy
- does not block it on its own: +30 is within the default ceiling of 60, which blocks only a score above it.
What it means
SMS-receiving websites rent numbers in runs and the public lists lag the sites, so every daily sync counts, per 1,000-number range (the number without its last three digits, a run of digits rather than a regulator's block), the listings that still score disposable: numbers the lists carry and saw within the last 365 days, and numbers they dropped that were seen within the last 90 days. The dataset is disposable-phone-numbers.
A listed number scores its own listing instead, so the two never add up, and is_disposable stays false on a number this signal flags. GET /api/v1/phone/block/{country}/{prefix} reports the same count under disposable, and Spaw measures the signal weekly against the lists themselves.
What it cannot tell you
- It is an inference about the neighbours, not about the number: a real subscriber can hold a number beside a run of rented ones.
- It fires only where the lists have caught enough of a range; many rented numbers sit in ranges nobody has scraped.
What to do
Treat it as a prompt for a second check, not a refusal. On its own it scores 30 and passes the default SMS policy, which blocks a score above 60; beside other signals the score can pass that.
The SMS policy is set per account with PUT /api/v1/phone/policy or the dashboard’s SMS policy tab, and its block_signals may list any signal, this one included; the phone guide lists every rule and its default.
Example response
The sandbox answer for the test number +1 202-555-0113, cut to the fields that matter here. Test numbers are free on every key and name the dataset test-numbers; a live lookup names disposable-phone-numbers.
{
"valid": true,
"e164": "+12025550113",
"country": "US",
"line_type": "mobile",
"is_disposable": false,
"risk_score": 30,
"risk_level": "medium",
"risk_signals": [
{
"signal": "disposable_range",
"weight": 30,
"dataset": "test-numbers"
}
],
"ok_to_send": true,
"blocked_by": null
}A real answer carries every field, listed in the validate-phone reference; the weights of every entry in risk_signals sum to risk_score, capped at 100.
Related
- disposable · published by an SMS-receiving website
- disposable_stale · published by an SMS-receiving website, but not recently
- The weights table in the phone guide
- Stop OTP abuse with block data and disposable numbers
- Glossary: SMS policy
- Where the data comes from: SMS-receiving number lists
- All phone risk signals
markdown version: /docs/signals/phone/disposable_range.md