Something new starting with this issue.
There are 25 videos in the catalog now, and most of you found this list somewhere in the middle of that, off the free FOIA page. So from here on, each issue takes one video and opens it up. The videos run about 3 minutes. An email has no clock on it at all, and that is where every number that would not fit is going to go. Plus I want the fine people on my email list to get the full run down, since you’re the ones who care about it the most.
Housekeeping first. If this one landed in Promotions or Spam, dragging it into your inbox once is what keeps the next one out of there.
Starting with the one that built the file room.
The final numbers, stated once
Everything further down works off this list. If a figure anywhere else disagrees with this list, this list is the one that is right.
Records | Flock Safety camera audit logs, City of Kalamazoo Department of Public Safety, Michigan FOIA request #P022224-061526 |
Period | January 1 through June 30, 2026. 182 days |
Distinct searches | 116,017 |
Rows as produced | 140,561. The gap is 24,542 search IDs that appear in 2 overlapping report series, plus 2 extra copies of 1 ID |
Run by agencies other than Kalamazoo | 91,063 searches, 78.5% |
Carrying a case number | 49,617 searches, 42.8% |
Cost to me | $0.00 |
Superseded, do not cite | 143,038 rows. That was an earlier, partial file the city sent on July 21, 2026 and later replaced. Any percentage computed on raw row counts instead of distinct search IDs is also superseded |
June 13 to July 22
On June 13, 2026 I asked the City of Kalamazoo Department of Public Safety for the search logs from its Flock Safety camera system, plus the contract, the camera inventory, the ALPR policy, and any data-sharing agreements. Michigan FOIA, MCL 15.231.
On July 8 the city issued its determination through the GovQA portal at 4:37 PM. Partial denial. Balance due, $0.00.
Item 5, the audit and query logs, was denied. The city's words, verbatim: the logs were "not held in the regular course of business," and the city stated it was not obligated to create a new record or compilation.
I filed the appeal the same day.
Two weeks later the logs arrived anyway. 116,017 searches, at no cost, from a system the city had said kept no such record in the regular course of business.
Nuts and bolts: how the file got here, and what I got wrong
Skippable. Nothing in the findings depends on this section, and the numbers in it are marked where they were later corrected. If you want the results, keep scrolling to "Who was actually searching Kalamazoo's cameras."
June 24. The city took its 10-day extension, moving the answer to July 8.
July 8, 4:37 PM. Partial denial. The fee waiver was honored, so nothing was charged. Item 1 (the Flock agreement) and item 4 (the ALPR policy) were produced. Item 3 (camera inventory and locations) was denied. Item 5 (the logs) was denied. Item 2 (data-sharing agreements) was not addressed at all, which means no records, no exemption claimed, and no certification that none exist.
July 8, that night. Appeal filed by email, addressed to the Mayor, which is the route the city's letter laid out.
July 16. The city's outside counsel wrote to say the response was being amended and more records were coming. He also asked for a phone call. I said no, and I have said no every time since. Every date in this section has a timestamp on it because all of it happened in writing.
July 21, 8:51 PM. The supplemental production landed in a SharePoint folder, in 3 subfolders keyed to the 3 open items. The audit log arrived in a file with the word Incomplete in its name. 143,038 rows.
Alongside it: the search-filter column withheld until the end of July, a fee estimate floated on the theory that 143,000 rows would be reviewed in 15-minute increments at a staff hourly rate, and a question about whether I would withdraw the appeal.
July 22, 12:35 PM. I answered in writing. The appeal was not being withdrawn, and I still wanted the filters.
July 22, 2:36 PM. The folder updated. A new file appeared, named Audit Logs - Complete.csv. 140,561 rows. That is the file every number in this issue comes from. No fee was ever charged.
July 22, 4:29 PM. The Mayor's written determination came through the City Attorney, 1 day before the statutory deadline. Item 2 was ruled moot on the supplemental production. Item 3 was upheld as to exact camera locations. Item 5 was upheld as to the plate and case number redactions, and the logs were otherwise produced.
What I got wrong. I started working off the Incomplete file the night it landed, and some of what I wrote then went out before the corrected file arrived. Here is the whole list.
What I said on July 21, superseded | What is true, and what is published |
|---|---|
143,038 rows | The final production is 140,561 rows, which is 116,017 distinct searches |
65% of searches came from outside agencies, 93,540 of them | 78.5%, 91,063 searches |
Michigan State Police ran 52% of all searches | 64.2% |
Kalamazoo ran 49,498 searches | 24,954. The larger figure counted the same searches twice |
Median search touched 1,165 networks, 66% touched more than 500 | 1,185, and 74.7% |
The city redacted selectively, leaving 177 Kalamazoo officers named while blanking every outside-agency name | Wrong, and retracted. The city produced 2 different report formats, and 1 of them never carries an officer name in any row, for any agency. There was no selective redaction |
Every one of those errors has the same cause. The city produced 12 monthly exports in 2 overlapping series, and 24,542 search IDs appear in both. Counting rows counts those searches twice. Counting distinct IDs does not.
The last row is the one I would want a reader to see. I read a pattern in the file as a decision somebody made, and it was an artifact of how Flock generates 2 different reports. I found it, I pulled it, and the explanation is written out in the method sheet in the pack rather than buried.
Who was actually searching Kalamazoo's cameras
Agency | Searches | Share | With case # |
|---|---|---|---|
Michigan State Police | 74,448 | 64.2% | 50.9% |
Kalamazoo MI PD | 24,954 | 21.5% | 9.7% |
Michigan Department of Corrections | 4,953 | 4.3% | 99.9% |
Grand Rapids MI PD | 4,428 | 3.8% | 15.2% |
Kalamazoo County MI SO | 2,543 | 2.2% | 20.3% |
Portage MI PD | 1,951 | 1.7% | 100.0% |
Battle Creek MI PD | 1,293 | 1.1% | 46.2% |
Western Michigan University MI PD | 714 | 0.6% | 18.3% |
Kalamazoo Township MI PD | 699 | 0.6% | 64.1% |
Lincoln Township PD MI | 34 | 0.0% | 32.4% |
91,063 searches, 78.5% of the file, came from agencies other than Kalamazoo.
Grand Rapids appears only at the start. All 4,428 of its searches fall between January 1 and February 18, 2026, and it does not show up in the file again. The log does not say why.
The case number
A case number is the one field in this system that ties a search to a real investigation. 49,617 of the 116,017 searches carry one. 66,400 do not.
The department that runs the cameras documents the least of anybody in the file. Kalamazoo at 9.7%. Portage, one town over, at 100.0%.
22,538 Kalamazoo searches carry no case number at all.
At the account level, across the 177 Kalamazoo accounts in the log, the busiest account ran 1,580 searches and 2 of them carry a case number. The next four ran 1,177, 1,050, 881 and 835, and none of those carry one. Account names were replaced with pseudonyms before I published any of this.
What it means, and this part is argument rather than measurement: without a case number there is nothing to audit a search against. Nobody outside the department can tell a real query from a personal one, because the record the department keeps does not distinguish them.
How wide one search reaches
The median search touched 1,185 camera networks. 86,680 searches, 74.7%, touched more than 500. The largest single search touched 6,398.
44,444 searches touched more than 500 networks and carried no case number. That is 38.3% of the whole file.
176 searches applied filters spanning 49 or 50 states plus Canada and Mexico. 11 of those covered all 50. The other 165 covered every state except Michigan, which is the state the cameras are in.
The agreements
The Mayor's written determination of July 23 says the city supplemented by "providing complete and unredacted versions of all data-sharing agreements, memoranda of understanding, or interoperability agreements between the Kalamazoo Department of Public Safety and any federal agency, state agency, or private entity governing access to or use of Flock Safety ALPR data."
One memorandum of understanding arrived. Kalamazoo County Consolidated Dispatch.
It has 2 problems on its face. Only Flock signed it, on June 11, 2026, and the document says it commences once fully executed. Its numbered sections run 8, 10, 11. There is no section 9.
9 outside agencies appear in the log. If the city's account is right and that one MOU is the complete set, then those 9 agencies ran 91,063 searches of Kalamazoo's cameras with nothing in writing between them, and the largest is the state police.
I am not a lawyer and I am not going to tell you what any of that means legally. What I can say is what the paper says, and this is what the paper says.
What the file will not tell you
The License Plate column reads REDACTED on 98,737 rows. The Case # column was redacted as well, so the file shows whether a case number existed and never what it was.
54 searches were run as free-text AI prompts instead of plate lookups. All 54 came from the Michigan State Police, all were flagged allow by Flock's moderation, and all describe vehicles rather than plates. Verbatim, from the file:
objectClass:vehicle older sedan missing hubcap rear driver side
A plate search finds one car. A description search finds every car that matches the description.
All of it is free and all of it is checkable
Download the whole production - both CSVs, the analysis files, the source documents, the request, the denial and the appeal.
Read the findings sheet if you want the short version with every figure sourced, or the method sheet for how the deduplication and the redactions were handled.
Every number in this issue recomputes from the CSVs in that zip. If one of them is wrong, tell me and I will post the correction, the same way I posted the ones above.
And if you want to run this on your city, the paperwork is at foia.magneticnorse.com. My request, the denial, the appeal including the item I lost, and blank fillable versions you can send yourself. No email, no payment.
- Mags
