Flock Hunting

March 22, 2025

With Easter just around the corner, memories turn to the childhood fun of the easter egg hunt--children running wild in the backyard garden. The thrill of being the first to find the prized eggs!

As an adult, you're not supposed to engage in such frivolity. But wait--maybe you still can! Perhaps you've noticed these clandestine automated license plate reader (ALPR) cameras popping up over the last couple of years. As an avid cyclist, I've certainly seen them bloom like spring flowers all over the Chicago north shore.


An ALPR Camera. Source (Wikimedia).

There's a site deflock.me (no affiliation) where people have been reporting camera locations on OpenStreetMap. If you have an OpenStreetMap account, it's pretty easy to do. Simply drop a new point on the map and paste the following tags onto it. Set the camera direction, upload changes, and you're done.

man_made=surveillance
surveillance:type=ALPR
camera:mount=pole
camera:type=fixed
surveillance=public
surveillance:zone=traffic
manufacturer=Flock Safety
manufacturer:wikidata=Q108485435

Around here, Flock cameras are the most common, but there are a few different manufacturers. Go to https://deflock.me/report for more details if you're seeing something different.

Turning it into a Game

Like an easter-egg hunt, once a camera has been reported, it's claimed forever. Too bad for others. However, believe me, there are a LOT of these cameras out there still waiting to be found. Since my dog loves driving around in the car more than anything in the world, we'll often go out cruising around on an early Sunday morning. Cameras tend to be placed along municipality boundaries so that's where you'll usually reap the most rewards.


Out on the hunt!

Also, being a bit competitive, I wrote a little Python script to help me keep a score of total cameras reported.

import json
import requests
from collections import Counter

state =	"US-IL"
overpass_url = "http://overpass-api.de/api/interpreter"
overpass_query = f"""
[out:json];
area["ISO3166-2"="{state}"]->.searchArea;
node["man_made"="surveillance"]["surveillance:type"="ALPR"](area.searchArea);
out meta;
"""
response = requests.get(overpass_url, params={'data': overpass_query})
rankings = Counter()
for node in response.json()['elements']:
    rankings[node['user']] += 1

for n, (user, count) in enumerate(rankings.most_common(), start=1):
    print(f'{n}. {user}, {count}')

At the moment, I'm ranked in the top ten for the state of Illinois--and I haven't even ventured more than about 5 miles from my house! Obviously, you could update the script for your particular state, city, or region.

In any case, it's all jolly fun. Happy hunting!

-- Dave


Copyright (C) 2005-2026, David Beazley