Joplin's Flock Contract Mystery

A Peculiar Purchase Process

Published on

By: Michael

Why We Started This Investigation

In late 2023 a $154,200, five‑year contract with Flock Safety was signed by the Joplin Police Department. The contract would install 10 ALPR cameras throughout Joplin. As you may know, these cameras enable warrantless tracking of people's movements nationwide. Since we have been unable to find much about this purchase, we wanted to know if proper procedure was followed when making the purchase.

When we searched the publicly posted council agendas, minutes, and packets using Joplin's website, we found no ordinance, motion, or budget amendment that mentioned “Flock,” “ALPR,” or even “license‑plate reader” before the contract was signed. However, we also noted many of the documents were not full text searchable such as meeting minutes. Why the City uploads these public records without a text layer is unknown, but we felt it was likely the City's search tool could not search these documents. We manually reviewed agendas, packets, and minutes for the 6 months prior to the contract being signed, but did not find any council business referencing Flock Safety.

To be absolutely sure we did not miss anything, we decided to:

  1. Download every council PDF from formal council meetings (agendas, minutes, packets) from 2022‑2025.
  2. OCR any scanned PDFs so they contain a text layer.
  3. Extract the text and run a laser‑focused regular expression that captures every plausible ALPR reference.

Below is the full, reproducible workflow we built, the code we used, and the conclusions we drew. If you aren't interested in our process and just want to see what we found, skip to the "what we found" section.

NOTE: Scraping websites can be controversial. This is not legal advice. Before scraping a website, check the websites terms of use, robots.txt, and your jurisdiction's laws for guidance. Limit your downloads to a polite rate with no concurrency so as not to overload the server. We checked for a terms of use and consulted robots.txt and found no prohibitions on our intended activity. We could not find a Missouri law that specifically forbids scraping websites. These documents are for public use, we had a public interest justification, and they were not meeting our needs on the city's website so we proceeded. We are posting the full steps for educational and transparency purposes. However, if you do not have a strong need to repeat our research, please consider not downloading more data than necessary from the City's website. If you would like a full copy of the pdfs that we could not upload to github, please reach out using our email contact listed on the github repo.

Scraping All Council PDFs

The Joplin website stores every meeting page under a predictable URL pattern:

https://www.joplinmo.org/AgendaCenter/City-Council-26?MOBILE=ON&year=YYYY

From each yearly overview page we can pull every meeting ID, then visit each meeting’s page and download every attached file (agenda, minutes, packet, etc.).

The Python scraper – DownloadPdfs.py

What it does

Step Action
Fetch yearly index Pulls the list of meeting IDs for 2022‑2025.
Iterate each meeting Loads the meeting page, parses the human‑readable date (e.g., “Monday, May 1, 2023”).
Collect every downloadable file Detects PDFs, ZIPs, DOCXs, and the special “ViewFile” links that the site uses for agendas, minutes, and packets.
Save with a deterministic name <MMDDYYYY>_<type>.<ext> (e.g., 05012023_agenda.pdf). This makes later processing painless.
Polite throttling 0.5 s delay between downloads, progress bars via tqdm.

Running python DownloadPdfs.py creates a folder joplin_council_pdfs/ with sub‑folders for each year, each containing every PDF the city has ever posted for the council for the selected years.

Turning Scanned PDFs into Searchable Text

Many of the PDFs we downloaded are scanned images – they contain no selectable text as we mentioned earlier. We used ocrmypdf (a thin wrapper around Tesseract OCR) to embed a hidden text layer, producing PDF/A‑2b files that are both archival‑grade and searchable.

Extracting Plain Text from the OCR PDFs

Even though the PDFs now contain a hidden text layer, searching them directly with PowerShell’s Select‑String is clunky. Instead we used Poppler’s pdftotext to dump the text into .txt files – a format that Select‑String handles perfectly.

The “all‑in‑one” PowerShell search script – ALPR_Search.ps1

What the script does

  1. Diagnostics – confirms we have the correct folders and PDFs inside them.
  2. Optional OCR – run if you need to create the searchable PDFs. We wanted to be able to run the parts separately while developing the script.
  3. Convert each OCR‑PDF to a plain‑text .txt using pdftotext.
  4. Run a tight regex that captures every realistic way the city might refer to ALPR equipment: \b(?:flock\s* safety|flock|alpr|lpr|license[-\s]?plate(?:\s*reader)?s?)\b
  5. Write clean results to alpr_matches.txt. Each line is: <full‑path‑to‑PDF>:<line‑number>: <exact snippet that matched>

If the file is empty, it means no ALPR‑related language appears in any searched document.

What We Found

Metric Result
PDFs processed (OCR‑output) 461
Text files generated 461
ALPR regex matches 20
First reference to any Flock purchase 05/13/2024 – five months after signing the contract.

Bottom line: The city never posted a council ordinance, motion, or budget amendment that authorized the $154,200 Flock Safety contract before it was signed.

Under Joplin’s own purchasing and procurement policy, any purchase that requires the completion of a signed contract requires formal adoption by the City Council to submit the PO to the finance department. The same policy also requires purchases over certain dollar amounts go before the council. Depending on how the purchase was classified and if it was appropriated in the budget, we could see there being wiggle room on the dollar amount requirement. However, the signed contract requirement is very clear. The below excerpt is from page 14 of the Purchasing and Procurement Policies document.

Image of purchasing and procuerment document showing requirement of formal adoption for all contracts signed by the city

Other Possible Irregularities

Given this lapse, we have also reached out to the City Attorney's office on 1/1/26 while reseraching this story to ask if they approved of the form of this contract. According to Article VI of the Joplin Charter, the City Attorney is required to sign off on the form of all contracts and mark their approval on the contract:

Image of Article VI showing requirement of City Attorney approval marked on the contract for all contracts

No approval from the City Attorney's office is found on the Flock contracts in our possession. We also asked if the Attorney's office archived the terms of Joplin's second contract. In the time between Joplin's first contract and the second contract, Flock moved the terms and conditions online. The website they are hosted on is subject to change without notice and cannot be archived by archive.org. It is highly likely the terms of the second contract superseded any terms of the first contract. We do not know what the new terms are. We did not receive a response by the time of this publication. We will make an update if they respond.

In addition to the requirement that contracts go before the council, the purchasing and procurement policy notes that requisitions should also be submitted before the placement of an order:

Image of purchasing and procurement document showing PO should be submitted before order placement

In both contracts we have POs for, it appears that the contract was signed before the PO was even entered. This seems to be another violation of Joplin's policies.

Image of Article VI showing requirement of City Attorney approval marked on the contract for all contracts

Why Does This Matter?

This matters because if the city did not follow its own procedures for procurement it opens a number of questions about fiscal accountability within the city and the police department in particular. It also raises concerns about transparency in government. Residents have a city council so that they can have a say in what is being decided in their community. If city officials are entering into contracts without consulting the city council, then it is our opinion that they are subverting the democratic process.

DeFlock Joplin is awaiting an official response to our inquiry at the attorney's office. The City Clerk's office is also supposed to have another response to us by the end of 1/9/26. It is possible there are legitimate explanations for these irregularities. Once we have those responses we will post an update as well as what we think Joplin residents should do next.

Update 01/04/2026: It occurred to us that we did not request information from the finance department at the same time that we asked the attorney's office. We are sending a message to the finance director and assistant finance director first thing on 1/5/26. (Update: Sent at 6:00 AM)

Update 01/05/2026: We noticed in the file for the Flock match on 5/13/2024 that this purchase is marked as part of "Action Plan 5" so we retargeted our script for the "Action Plan Implementation and Oversight Committee" meetings and repeated the workflow. We got 0 hits on that committee's files for Flock related terms.

Update 01/07/2026: We followed up with the City Attorney's office and the Finance Department at 7:00 AM. We decided it might be pertinent to reach out to the marketing and communications office to assist with our inquiry and did so at 11:00 AM.

Update 01/09/2026: Direct inquiry to communications director made over the phone. It seems he was only allowed to direct this issue to the Attorney's office (who has declined to make any response so far) or the City Clerk. We left a voicemail with the attorney's office. The City appears to be in full "CYA" mode and we do not expect any response.

Update 01/20/2026: After repeated offers for an in-person meeting were declined, the city manager says they do not want to answer any of these questions over email. They only want to have a discussion in person.

Sources