numbers_per_client
One client address tried several numbers within the window
The Spaw phone risk signal numbers_per_client adds 30 points to risk_score when the client address you sent with the lookup, or the browser visitor's own address, tried 5 or more distinct numbers on your account within 60 minutes, this one included (dataset account-velocity).
- risk weight
- +30
- dataset
- account-velocity
- reads from
- client_velocity
- 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
Send client_ip, the address of the person behind the lookup (your visitor, not your server), and client_velocity counts the distinct numbers tried from it on your account inside the window; an IPv6 address counts by its /64. A browser lookup with a publishable key counts the visitor's own address without being asked. The address is never looked up and never billed, and the dataset is account-velocity.
It does not fire for an address Spaw's own IP data places on a mobile carrier or a corporate proxy, where many people share one address, or for a private or reserved address, which is your own proxy rather than your visitor; those still answer the count.
What it cannot tell you
- It reads only your own account's single and browser lookups: batch, bulk and monitor runs, the test numbers and the guest demo never count, and no other account's traffic is read.
- It catches one script cycling numbers from one address, not an attack rotated through residential proxies. Without a client address the field is null and the signal cannot fire.
What to do
Challenge or rate-limit the client rather than the number. 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
An excerpt of an answer carrying this signal alone, with the number and the other fields left out, because no test number answers it. The score and the decision are worked out as the lookup and the default SMS policy work them out.
{
"valid": true,
"country": "GB",
"line_type": "mobile",
"line_type_source": "numbering_plan",
"risk_score": 30,
"risk_level": "medium",
"risk_signals": [
{
"signal": "numbers_per_client",
"weight": 30,
"dataset": "account-velocity"
}
],
"client_velocity": {
"distinct_numbers": 5,
"window_minutes": 60
},
"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
- range_burst · your account looked up several numbers in the same range within the window
- The weights table in the phone guide
- Your own traffic, in the phone guide
- Glossary: SMS policy
- All phone risk signals
markdown version: /docs/signals/phone/numbers_per_client.md