# `disposable_range` (phone): 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).

- Weight: +30
- Dataset: `disposable-phone-numbers`
- Read 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.

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` (https://spaw.co/docs/api/update-phone-policy) or the dashboard's SMS policy tab, and its `block_signals` may list any signal, this one included.

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.

```json
{
    "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
}
```

Related:

- [`disposable`](https://spaw.co/docs/signals/phone/disposable): published by an SMS-receiving website
- [`disposable_stale`](https://spaw.co/docs/signals/phone/disposable_stale): published by an SMS-receiving website, but not recently
- [The weights table in the phone guide](https://spaw.co/docs/phone-intelligence#signal-disposable_range)
- [Stop OTP abuse with block data and disposable numbers](https://spaw.co/guides/stop-otp-abuse-with-block-data-and-disposable-numbers)
- [Glossary: SMS policy](https://spaw.co/glossary/sms-policy)

Reference: https://spaw.co/docs/signals/phone/disposable_range
