Skip to content

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

markdown version: /docs/signals/phone/disposable_range.md