# Placeholder addresses: what people type instead of an address

asdf, n/a, no address, 123 Fake Street: what a form gets when nobody means to give an address, how Spaw spots it by whole name, why Test Valley Road is safe.

Date: 2026-09-17

Updated: 2026-09-23

Every address field that is required and not validated fills up with the same things. "asdf". "test". "n/a". "none". "no address". "same as above". "123 Fake Street, Anytown". A row of x's. A keyboard run. They are not typos and they are not fraud in the usual sense; they are what a person types when the form insists on an address they do not want to give, and they are what a script types when it needs the field to be non-empty. Until 17 September 2026 Spaw read them as addresses, because structurally they are: "asdf" is a street name of four letters, "Anytown" is a town, and a postcode beside them can be perfectly real. Every such answer now carries `looks_placeholder`, and when it is true, a `placeholder` signal of 60.

## The whole-name rule

The single most important thing about the detector is what it does not do: it never looks inside a name. "Test Valley Road" is a real road in Hampshire, "Sample Road" exists in a dozen American towns, "Nowhere Road" runs through Georgia, and a detector that flagged a street for containing the word "test" would flag every one of them. So the comparison is made on the whole folded name — the street with its suffix folded the way a register's is, so "Fake Street" and "Fake St" are one key, and the town as one folded word — against a bundled list of the things people type instead. "Test" alone is on the list; "Test Valley Road" folds to a key the list does not carry, and is not.

The list is short and deliberately dull: test words (test, testing, tester), keyboard runs (asdf, qwerty, zxcv), refusals (n/a, none, null, unknown, no address, not applicable, not provided, not telling), deferrals (same as above, see above, tbd, tba, pending, will provide), fillers (xxx, aaa, abc, blah, foo, lorem ipsum), fictions (fake street, 123 fake street, dummy, sample, example, placeholder), the non-places (anywhere, nowhere, somewhere, anytown, no street, my address, home, my house), and the honest ones (no fixed abode, homeless, refused). A word goes on the list only when nobody would name a place that way. "Main" and "Park" would flag real streets and are not there; "Sample" is, because "Sample Road" folds to a different key than "Sample" and stays safe.

## The four shapes

Beside the list, four shapes are judged as placeholders whatever the letters, applied to whole names only and, for a street, without the suffix and directional at its end, so "Sdfgh Road" reads as the no-vowel run it is rather than as a word that happens to end in a real one, and "MG Road" and "MLK Blvd" read as the initials they are.

| Shape | Example | Why |
| --- | --- | --- |
| No word with a vowel, and one word of four or more letters | "sdfgh", "hgfdk" | Every word lacks a vowel and one runs to four letters, so initials such as MLK Jr pass; y counts everywhere, w in Great Britain (Bwlch, Pwll) and r and l in Czechia and Slovakia (Tvrz, Srch). |
| One character repeated three or more times | "xxxx", "aaa", "1111" | A key held down. |
| Digits alone | "12345" as a town | A postcode or a phone number in the wrong field. |
| A run along a keyboard row of four or more | "asdfg", "qwer", "1234" as a street | The oldest placeholder there is. |

Short names are left alone. Rye, Ely and Ayr are towns, and so is Cwm, in Wales. The vowel rule and the keyboard run start at four letters and stay there; a single character repeated counts from three, and digits alone at any length.

## A part a dataset confirmed is never judged

Neither the list nor the shapes are applied to a street or a town that a dataset has already found. A street counts as found when a register matches it, at a building, a number range or the street itself, or when a company register, the mail-drop list or the registered-agent list holds the address; a town counts as found when the postcode directory lists it for the code or somewhere in the code's area, or when it names the code's region and that region is one city, as CDMX does for a Mexico City postcode. So "1 Test Road, Southampton, SO14 3JU" passes, though "test road" is on the list, because Open Names files a Test Road under SO14; and so do None, one of the places GeoNames lists for the Italian postcode 10060, and Jbphh, the place it lists for 96853, Joint Base Pearl Harbor–Hickam in Hawaii. A shape is a guess about what somebody typed, and a dataset that lists the name is evidence that it is a place.

## What the answer carries

`looks_placeholder` is true, false or null. True when the street or the town matched; false when the address had a street or a town and neither did; null when the address had neither to judge — a bare postcode, a box with no street line. A true answer adds `placeholder` to `risk_signals` at 60, which is `high` on its own, cites `address-placeholders` in `sources` with the list's version, and lands the address in the default shipping policy's block list: `ok_to_ship: false`, `blocked_by: placeholder`, without anyone configuring anything.

```json
{
  "street": "asdf",
  "locality": "Los Angeles",
  "looks_placeholder": true,
  "risk_signals": [{ "signal": "placeholder", "weight": 60, "dataset": "address-placeholders" }],
  "risk_score": 60,
  "risk_level": "high",
  "ok_to_ship": false,
  "blocked_by": "placeholder"
}
```

The weight is deliberately the same as a private mailbox's and higher than a mail drop's. A mail drop is a real place where post arrives; a placeholder is not a place, and the only reason it is not scored at 100 is that the other signals still have something to say about the postcode and the town beside it — a placeholder street with a terminated postcode is two facts, and the score should say so.

## What it is not

It is not a typo detector. "Amphitheater Pkwy" for "Amphitheatre Parkway" is a misspelt real street, and the register answers `street_suggestion` with the spelling it holds; the placeholder flag stays false. It is not a completeness check either: an address with no street at all is refused with `missing_street` before any of this runs, for free, and a placeholder only arises when something was written. And it does not read the organisation or the building line. "Test Ltd" is a company that exists, "The Test House" could be a building, and a customer who writes their company as "N/A" has written the truth.

It is also honest about its limits. A placeholder in a language the list does not carry, or a plausible-looking fiction — "42 Elm Street, Springfield" — passes, because it is a real-looking address that a register may or may not carry, and that is the register's question, answered through `exists`, `match_level` and the confirmation map, not this flag's. The list grows when a customer's outcome reports or a bulk file show a word it lacks, and its version travels in every answer that used it.

## What to do with it

For a signup form, block it: the default policy already does, and a form that lets "asdf" through will pay to verify it again on every later step. For a bulk file, the run summary counts `placeholders` beside the verdicts, which is the quickest measure of how much of an old list was never an address to begin with. For a monitored list it is a flag on the day a row first carries one; a row that was a real address and became "asdf" is a row somebody edited. And for a customer-facing message, `blocked_by: placeholder` is the one refusal that can be worded plainly: the address field needs an address.

Reference: https://spaw.co/guides/placeholder-addresses-what-people-type-instead-of-an-address
