# `virtual` (phone): the block is held by a virtual-number wholesaler or VoIP provider

The Spaw phone risk signal virtual adds 40 points to risk_score when the regulator's allocation table shows the number's block allocated to a virtual-number wholesaler or VoIP provider (the regulator table of the number's country).

- Weight: +40
- Dataset: the regulator table of the number's country: `nanpa-co-codes`, `cnac-co-codes`, `ofcom-numbering`, `arcep-numbering`, `acma-numbering`, `acm-nummerregister`, `nad-number-register`, `ift-numeracion`, `uke-numeracja`, `mimit-numerazione`
- Read from: `is_virtual`
- Default SMS policy: does not block it on its own: +40 is within the default ceiling of 60, which blocks only a score above it.

Virtual-number providers hold whole blocks and rent numbers from them by the month or the day, so one person can collect many and let them go. Spaw reads the holder of the number's block from the regulator's table and classifies holders by name: is_virtual answers true for a block held by such a provider, false for another holder, and null when no regulator table covers the number. risk_signals names the table that answered.

In North America the holder also settles the line type: a block held by a virtual-number wholesaler answers line_type voip with line_type_source block_allocation, where the plan alone says fixed_line_or_mobile, and the plan-based voip signal does not fire beside it. In a pooled US code the holder is that of the number's own thousands-block where NANPA's block report lists it; in Canada the table is the code holder's alone.

**What it cannot tell you.**

- It names the original allocation, never who serves the number today: a number ported out of a wholesaler's block still carries the signal, and one ported into it does not.
- It does not separate fixed from non-fixed VoIP: a business line on a hosted phone system and a number rented through an app can both sit in such a block.
- Holders are classified by name, so a provider whose name settles nothing is not counted.

**What to do.** Weigh it with the rest: plenty of real people use virtual numbers. For one-time codes, read it beside range_burst and the disposable signals. On its own it scores 40 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-0102, cut to the fields that matter here. Test numbers are free on every key and name the dataset test-numbers; a live lookup names the regulator table that answered.

```json
{
    "valid": true,
    "e164": "+12025550102",
    "country": "US",
    "line_type": "voip",
    "line_type_source": "block_allocation",
    "carrier": "Spaw Test VoIP",
    "is_virtual": true,
    "risk_score": 40,
    "risk_level": "medium",
    "risk_signals": [
        {
            "signal": "virtual",
            "weight": 40,
            "dataset": "test-numbers"
        }
    ],
    "ok_to_send": true,
    "blocked_by": null
}
```

Related:

- [`reserved_block`](https://spaw.co/docs/signals/phone/reserved_block): the regulator's table marks the block reserved
- [The weights table in the phone guide](https://spaw.co/docs/phone-intelligence#signal-virtual)
- [Glossary: NPA-NXX](https://spaw.co/glossary/npa-nxx)
- [Why US numbers cannot be split into mobile and landline](https://spaw.co/guides/why-us-numbers-cannot-be-split-into-mobile-and-landline)
- [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/virtual
