Pulling the list is the easy part. Cutting it down is where the leads are, and it's the step almost everyone skips.

I pull code violation exports for seven Puget Sound markets, and every one lands the same way: mostly closed, mostly untyped, a vacant building with an emergency order sitting three rows above a one-time weeds ticket. Mail that raw file and you're paying postage to reach people who already fixed their problem. The value was never in the list. It's in the cut.

Filtering a code violation list means cutting a raw export down to the properties that signal a motivated seller: keep open cases, drop the closed ones, sort by type so vacant and emergency rise while construction falls, and weight the properties cited more than once. A raw pull is roughly four-fifths dead weight. Filtering isn't a step in the work. It is the work.

This picks up where getting the code violation list for your city leaves off. If the file isn't on your screen yet, start there and come back. If you want the whole system these leads plug into, the guide to building code violations lays it out.

A four-step filter flow, drop closed, drop construction, keep repeats, weight recent, narrowing 84,430 raw cases to a few hundred worth mailing.

Cut one: drop every closed case

Status is the fastest cut you'll make, and the biggest. In the data I track, 66,435 of 84,430 code violation cases are marked Closed. That's nearly four out of every five. A closed case tells you a property once had a problem and the city signed off that it's handled. An open case tells you the problem is live right now, which is the only version you can do anything about.

Sort by status and keep everything that isn't closed. The labels vary by city. Seattle uses "Open" and "Under Investigation." Tacoma and the county feeds throw "Active," "NOV Issued," "Initiated," "Warning," and a dozen more. Don't get lost in them. The logic is binary: closed, or not closed. Keep not-closed.

Two things worth knowing. A case that closed last month can still be worth a look, because the owner just spent money they may not have had, and that pressure doesn't evaporate the day the city signs off. And "pending" isn't really a third bucket. In most feeds it's just another word for open. For a first pass, don't overthink it. Open stays, closed goes, and you've cut the file by nearly 80% in a single sort.

Cut two: sort by type, and delete construction first

Now the open cases that survived. Not every violation means distress, and one type means the opposite.

Two facts about the type field. First, most cases don't have one. 48,546 of the 84,430, well over half, arrive with no category at all, just an address and a line of free text. Second, of the cases that are typed, the single most common category is construction, close to 9,500 of them, about a quarter of everything labeled. Construction is the one you delete first. An owner pulling permits and catching a citation mid-project is improving the property, not fleeing it. Same logic for noise and graffiti: those target the building, not the owner's finances.

What you keep, in order: vacant building, emergency, and land-use cases go to the top. A vacant building is the strongest single signal in the file. An emergency order means the city considers the structure dangerous. Those are owners under real pressure.

Keep (distress signals) Drop (owner improving, or noise)
Vacant building Construction
Emergency order Noise
Land use Graffiti

For the majority of cases with no type, you fall back to the description text. Scan for the words that mean trouble: vacant, unsafe, structural, hazard, uninhabitable, abatement. That keyword pass is slow by hand, which is exactly why it stays undone, and part of why a code violation list stays less picked-over than the lists everyone buys.

Cut three: count the citations per property

Here's the cut that matters most, and almost nobody bothers. Dedupe the file by property, then count how many times each address shows up.

The raw 84,430 cases collapse to 47,108 distinct properties, because a chronic address appears once per case. Of those, 16,355, about a third, have two or more violations. Only 1,671 carry six or more. Those 1,671 are the actual list.

One citation is an event. Anybody can catch a weeds ticket during a rough month. Six citations over a few years isn't bad luck. It's an owner who stopped answering the city, and an owner who stopped answering the city has usually stopped keeping up with a lot more than the yard. Sort your deduped list by violation count, highest first, and work from the top down.

Cut four: check the dates

Last filter, and a quick one. A violation opened in 2018 that's still technically open is probably a data artifact, not a live lead, especially from the scrape-based feeds that never mark old cases closed. So weight recent activity. A case opened in the last year or two is a warm signal. One from five years ago is cold even if the status field never got touched. If the feed gives you an open date, sort by it and trust the recent stuff more.

What's left is the list

Run those four cuts and the funnel is steep. 84,430 raw rows become 47,108 properties, narrow to the roughly 16,000 cited more than once, and sharpen to a few hundred carrying severe types plus repeat, recent activity. That's a list you can actually afford to skip trace, because now you're paying to find owner contact info for hundreds of properties instead of tens of thousands.

That last step is why the earlier cuts matter so much. Owner names and phone numbers cost money per record, so every closed, construction, or one-off case you carried into skip tracing is money spent reaching someone who was never a lead. Filter first, pay second. If your export arrived with no owner names on it, which is the norm, skip tracing by address only is the workflow for turning it into contactable owners. And if you only need to check one address rather than build a whole list, looking up a single property's violations is the faster route.

Or skip the spreadsheet

Everything above is a weekend in a spreadsheet, redone every time you want fresh data. It's also exactly what FlaggedLeads does in the background: it pulls each market, drops the closed and construction cases, scores every property by type, repeat count, and recency, and puts what's left on a map. The free map shows you the filtered result for our live markets without any of the sorting. The four cuts above are the manual version of what the score runs automatically.

Either way, the rule holds. The raw list is not the lead list. The cut is the lead list.

Frequently asked questions

Should I market to closed code violations?

Generally no, at least not first. A closed case means the city considers the problem resolved, so the distress signal is stale. Filter to open and active cases for your first pass. The one exception is a case that closed very recently, because the owner just spent money to fix it and that financial strain can still be live. But when you're cutting a big file down, closed cases are the first four-fifths to go.

Open vs pending code violations, which should I pursue?

Both, because "pending" usually isn't a separate status. It's another label for an active, unresolved case. Different cities use different words, Open, Active, Under Investigation, NOV Issued, Pending, for the same basic state: not fixed yet. Keep all of them. The only line that matters is closed versus not closed.

Are minor code violations worth calling?

A single minor violation, on its own, usually isn't. One overgrown-vegetation ticket is noise. What makes a minor violation worth a call is repetition and company: the same property cited five times, or a minor case stacked on top of a vacant-building or emergency order. Volume and severity are the signal, not any one citation.

How much of a raw code violation list is actually usable?

Less than you'd hope. In the data I work, nearly 80% of cases are already closed, and of what remains, most properties carry a single minor citation. After filtering for open status, distress-signal type, and repeat activity, a raw file of tens of thousands of cases usually leaves a few hundred properties worth mailing. That shrinkage is the point, not a problem with the data.

Do I still need to filter a list I bought from a vendor?

Usually yes. Most vendor lists are built from the same public records and inherit the same problems: stale statuses, mixed severity, duplicate rows. A paid list saves you the pulling and matching, but it rarely does the distress-specific triage, keeping vacant and emergency, dropping construction, that turns a code violation file into a lead list. It's also worth knowing where that vendor data actually comes from before you trust how fresh it is.