footnote4a

Mass surveillance, government contracts, and other bedtime reading.

Data update: Ardmore OK PD (Jun 2025 – Jun 2026)

7,794 org audit records and 71,327 network audit records from Ardmore OK PD covering June 2025 through June 10, 2026.

by HaveIBeenFlocked Team
16 min read
logs
oklahoma

Ardmore is a city of about 25,000 people and the county seat of Carter County, Oklahoma. This post covers two sets of Flock audit logs from the Ardmore Police Department. The org audit lists 7,794 searches by Ardmore Flock users from June 1, 2025 through June 10, 2026. The network audit lists 71,327 searches by 80 agencies that included Ardmore’s cameras. It has gaps in four months. Thanks to the Ardmore Leader for obtaining and sharing these records.

All dates below use Central time.

#Org audit

  • Type: Organization audit
  • Timespan: Jun 1, 2025 – Jun 10, 2026 (about 12 months)
  • Records: 7,794
  • Search types: search (2,487), lookup (2,281), search - Mobile (1,556), lookup - Mobile (1,412), visual (48), convoy (7), searchSummary - Mobile (2), multiGeo (1)
  • License plate attached: 4,166 (53.5%)
  • Case # present: 942 (12.1%)

Every lookup in the org audit has a plate. Most searches do not, so the plate field is blank on 3,628 records.

#Search types

TypeCount%
search2,48731.9%
lookup2,28129.3%
search - Mobile1,55620.0%
lookup - Mobile1,41218.1%
visual480.6%
convoy70.1%
searchSummary - Mobile2<0.1%
multiGeo1<0.1%

In the org audit, 5,382 records searched two networks or fewer. The other 2,412 searched more, up to 454 networks.

#Top operators

45 Flock users ran searches. No single operator ran more than 10.1% of them.

NameCount%
Kelsi Collins79110.1%
Matthew Dunn7419.5%
Cory Reeves5967.6%
Jordan Reavis5747.4%
Jared Johnson5376.9%
NaTonya Puente5236.7%
Landon Gary4385.6%
Lynsie Cantwell4265.5%
Colby Copeland3935.0%
Jonathan Miracle2713.5%
Kevin Landers2483.2%
Jazper Long2282.9%
Kelsey Farve1772.3%
John Cheairs1742.2%
Michael Geren1732.2%
Other (30 operators)1,50419.3%

#Reasons

The org audit contains 554 distinct reason values. “Training” is the most common, with 337 records. Reasons that contain “training” appear on 381 records from 12 operators. Lynsie Cantwell (130) and Michael Geren (128) entered most of the 337 “Training” records.

Jared Johnson entered all 522 records whose reason contains “INTEL,” from June 2025 through May 2026. That total includes “Drugs/Narcotics - INTEL” (267) and “INTEL” (225).

ReasonCount%
Training3374.3%
Drugs/Narcotics - INTEL2673.4%
Investigation2453.1%
INTEL2252.9%
Stolen Property Offenses -2162.8%
Suspicious2162.8%
investigation1972.5%
Welfare Check -1441.8%
Theft1351.7%
Search1321.7%
Motor Vehicle Theft/Stolen -1291.7%
admin1271.6%
Stolen1201.5%
Hit and Run/Car Accident -1121.4%
Burglary/Breaking & Entering -1111.4%
Other (539 values)5,08165.2%

#Network audit

  • Type: Network audit
  • Timespan: Jun 30, 2025 – Jun 10, 2026, with gaps (see below)
  • Records: 71,327
  • Organizations (network): 80
  • Search types: search (50,453), lookup (10,259), search - Mobile (7,539), lookup - Mobile (2,180), convoy (785), visual (54), searchSummary - Mobile (29), freeform (19), multiGeo (9)
  • Operator name: redacted on all 71,327 records
  • License plate: redacted on 14,124 records; blank on the rest
  • Case #: redacted on 22,850 records; blank on the rest

The network audit has no records for June 1–29, 2025, July 2025, September 2025, or March 2026.

Ardmore’s own searches account for 3,182 network audit records (4.5%). The same records appear in the org audit. The other 68,145 came from 79 outside agencies. Agencies in Oklahoma, Texas, and Kansas ran nearly all of them.

#Search types

TypeCount%
search50,45370.7%
lookup10,25914.4%
search - Mobile7,53910.6%
lookup - Mobile2,1803.1%
convoy7851.1%
visual540.1%
searchSummary - Mobile29<0.1%
freeform19<0.1%
multiGeo9<0.1%

Oklahoma City OK PD ran 15 of the 19 freeform searches. Tulsa OK PD ran three and Mustang OK PD ran one. The prompts describe vehicles, such as “blue Ford Sport Trac pickup with right rear damage.”

#Top organizations

OrganizationCount%
Oklahoma City OK PD13,93519.5%
Fort Worth TX PD11,93716.7%
Tulsa OK PD11,33015.9%
Wichita KS PD7,71210.8%
Ardmore OK PD3,1824.5%
Tulsa County OK SO2,4523.4%
OK - 4772,1053.0%
Euless TX PD2,0362.9%
Chickasaw Nation Lighthorse OK PD1,4372.0%
Texas Financial Crimes Intelligence Center1,3781.9%
Bethany OK PD8931.3%
Moore OK PD8241.2%
Burleson TX PD7071.0%
Lawton OK PD6710.9%
Collin County TX SO6520.9%
Other (65 organizations)10,07614.1%

Four agencies ran 63.0% of the network audit searches: Oklahoma City OK PD, Fort Worth TX PD, Tulsa OK PD, and Wichita KS PD.

#Reasons

The network audit contains 6,137 distinct reason values. Eight records have no reason. No single value covers more than 1.9% of records.

ReasonCount%
Larceny/Theft Offenses -1,3351.9%
sus veh1,2421.7%
sus1,0751.5%
Motor Vehicle Theft/Stolen -1,0571.5%
Weapons Offense (Guns/Shots Fired) -1,0551.5%
Investigation9551.3%
inv9141.3%
theft8631.2%
Wanted Person (Arrest Warrant/Fugitive) -8561.2%
suspect8371.2%
Burglary/Breaking & Entering -8351.2%
investigation8241.2%
Hit and Run/Car Accident -8071.1%
Traffic Infraction -7951.1%
Stolen Property Offenses -6310.9%
Other (6,122 values)57,23880.2%

#Report highlights

#Immigration

37 network audit records have reasons that mention immigration, HSI, or ICE. Tulsa OK PD entered 23 of them, including “PER HSI” (14) and “PER HSI/OHP” (6). Collinsville OK PD entered six with the reason "Immigration (criminal) - ". Oklahoma City OK PD entered five with an HSI request reference and one with “ICE SUSP.” Tulsa County OK SO entered two with “HSI.” The org audit has no immigration-related reasons.

#First Amendment

Tulsa OK PD ran 16 searches on August 18, 2025, with the reason “08/16/25 41st and Yale Protest.” The searches ran across 359 networks, including Ardmore’s.

#Low-level offenses

In the org audit, 261 records have reasons that contain “Disorderly Conduct” (107), “Traffic Infraction” (99), “Trespass” (54), or “Illegal Dumping” (1). In the network audit, 2,967 records contain those terms or “Curfew/Loitering.” The largest groups are “Traffic Infraction” (1,583) and “Illegal Dumping” (1,017).

#How we processed the files

This section lets anyone with the released files rebuild our staged CSVs byte for byte. We used Python 3.12.15 and its standard library. Sizes and SHA-256 hashes below are for the CSV files as released, without any compression.

#Released files

The release holds 24 CSV files. Each audit series has its own file for most months, so several names appear twice.

Released nameSeriesBytesSHA-256
Location of Devices.csvcamera list6,34109a1c451f61c75f6902c972fd01913777d1f17a4ad4db4cc917379425ec036b3
June 2025.csvorg audit221,06197123c178cad8d39afe6fed6da8c507ce38f13c38c85221aeb4a153d961db64e
July.csvorg audit100,795395c5d905ed378ef28cd817fc18b2792d6964cd86959f64ab50e5b26c158cbd6
August.csvorg audit155,429161cd29d9811d53d786139b5bf742e7e6c8c18bc16ec4491de44d1695a4fba14
September.csvorg audit152,508f8683b996b2ef179a5f0567e4345733bdee669a5ae30bd5814757cf4fc647e00
October.csvorg audit184,9168f058971c1faad2d929f4bce777a71f6cd6de250fcc37ca668cf394a2df96af3
November.csvorg audit100,3998c5ba3e32b60f1f5313c59a9036c687cbaea18325cdb0c33417e4d9e9d15fcb0
December.csvorg audit140,509089d26cc49428f07af6a879edec9f36a67d3ddfa0ef6b62fb1143fa27b16cd39
January.csvorg audit177,362782f4d32f0c2fcc47ea33f6c6634bf30f2e3df79fa3dcc60e25b9ab0e65c3dcc
February.csvorg audit100,2077222bde0b0091d60ee6e5820f8c878e46b2021b5aeb53c359d2ffcea70a45f0f
March.csvorg audit131,744296fb8927b5cb44551af93fbb41292af55cbabc0222755ac283207c7215549ab
April.csvorg audit101,425d680334eef2ee22f5a387e5984dd0b74acc73dac0eead42f60c191bcf5065ffb
May.csvorg audit148,003682bbe5138c92def6b1ab05c58792512bdd25133ecf0b7dcfb59eaf6fb0404dd
June 1st to end 2026.csvorg audit136,667216eebcba90d5c1904238f50072ce8266b54fc54d57b11659b3fd226ca9eb587
June 2025.csvnetwork audit330,236a9e7757c893b5c90c498bfc3deffc181b0bdcc2e938870732e88a132b0d2eac6
August.csvnetwork audit3,140,3114401d3acddfae6966caefae358566f1831dba6adf254b041ce68a8b8b5162516
October.csvnetwork audit1,512,066d57310386030427adf3cca8322cbf35ab4767604527ae152d5f9819014c4a448
November.csvnetwork audit1,318,756ff7d17ddc3a25a00f00b75ec357af9c81db7e7dbb3101ab271a693ac5ae9a4e0
December.csvnetwork audit1,477,7579ef6c84e708e8bf560cc052aed70fb58f4889a00de37cd6ba8f9aa639707303a
January.csvnetwork audit1,533,678e74672d77a4f851603f5918401743b8da61dd99a2b667a42ec2fc1a665fca3a5
February.csvnetwork audit1,641,484613f2c289a3c60ec8682948a4ce81f92cff6620e3e3e6130c163fab4a06b64cb
April.csvnetwork audit1,483,3464af52fec824466f987cffcd3c6c0037247e5badfac44304514cb64a2907a623a
May.csvnetwork audit1,872,048cfbe268ce426f4692091e496f026f832472502d8e3e81b0c29357c60905a2c81
June to end.csvnetwork audit619,0730e18f55254a487d5dc889a56e58535af5bbbedffd1972116c32ed81a7e129f79

#Sorting and renaming

The 23 audit files share one 13-column header. It has a space after each comma: ID, Name, Org Name, Total Networks Searched, Time Frame, License Plate, Reason, Case #, Filters, Search Time, Search Type, Text Prompt, Moderation. The files have no byte-order mark and end each line with LF. Fields are quoted only where needed, and the Time Frame field holds a line break inside its quotes.

The Org Name column sorts the files into two series. In 13 files, every row reads “Ardmore OK PD.” These form the org audit. The other 10 files list between 38 and 69 organizations each. These form the network audit. “Location of Devices.csv” is a list of 72 cameras with five columns: Name, Network Name, Device Type, Lat, and Lng. It is not an audit log. We copied it unchanged to unprocessed/Location-of-Devices.csv.

The released names give a month but rarely a year. We named each file by the month its rows fall in. The rule: parse Search Time (format %m/%d/%Y, %I:%M:%S %p UTC) as UTC, convert it to America/Chicago, and take the year and month. Every row in 22 of the 23 audit files falls in a single Central month. The rule needs Central time. Under UTC, the last hours of each month spill into the next month in 15 files. The network “June 2025.csv” holds June 30, 2025 only, so we named it 2025-06-30-network-audit.csv. The network “June to end.csv” holds June 1–10, 2026, so we named it 2026-06-01-to-10-network-audit.csv. The org “June 1st to end 2026.csv” spans two months and needed the first change below.

#Changes

We made two changes. Every other staged file is a byte copy of its released file.

  1. Org audit, “June 1st to end 2026.csv.” The file holds 592 rows from May 11 through June 10, 2026. Its 513 May rows also appear in the org “May.csv,” with the same ID and identical content in every field. “May.csv” has 513 rows from May 11 onward, and all of them appear in “June 1st to end 2026.csv.” We kept the rows whose Search Time falls on or after June 1, 2026, 00:00 Central. That keeps 79 rows and drops 513. A rule that drops every row whose ID appears in “May.csv” keeps the same 79 rows in the same order. A June 1 cutoff in UTC keeps 91 rows, so the cutoff must use Central time. The output is 2026-06-01-to-10-org-audit.csv.
  2. Network audit, “April.csv.” The file holds 6,658 rows. Two rows appear twice, identical in every field. The pairs sit at data rows 3,286–3,287 and 3,289–3,290 (counting from 1). Their IDs are 84b8f5fa-f19a-40f3-aaa8-04c5fa85080b and 19cc7ab4-38ac-4db9-936c-86835398d72b. We kept the first copy of each and dropped the second, leaving 6,656 rows. The output is 2026-04-network-audit.csv.

Both rewritten files keep the released header line byte for byte, including its LF. Python’s csv module writes the data rows with every field quoted, LF line endings, and no byte-order mark. Row order matches the released file. This script rebuilds both files:

import csv
from datetime import datetime
from zoneinfo import ZoneInfo

CT = ZoneInfo("America/Chicago")
UTC = ZoneInfo("UTC")

def search_time_ct(row):
    t = datetime.strptime(row[9], "%m/%d/%Y, %I:%M:%S %p UTC")
    return t.replace(tzinfo=UTC).astimezone(CT)

def read(path):
    with open(path, newline="") as f:
        header = f.readline()
        return header, list(csv.reader(f))

def write(path, header, rows):
    with open(path, "w", newline="") as f:
        f.write(header)
        csv.writer(f, quoting=csv.QUOTE_ALL, lineterminator="\n").writerows(rows)

# Org audit "June 1st to end 2026.csv": keep June 1, 2026 onward (Central)
header, rows = read("org/June 1st to end 2026.csv")
cutoff = datetime(2026, 6, 1, tzinfo=CT)
write("2026-06-01-to-10-org-audit.csv", header,
      [r for r in rows if search_time_ct(r) >= cutoff])

# Network audit "April.csv": drop exact duplicate rows, keep first copy
header, rows = read("network/April.csv")
seen, kept = set(), []
for r in rows:
    if tuple(r) not in seen:
        seen.add(tuple(r))
        kept.append(r)
write("2026-04-network-audit.csv", header, kept)

#Staged files

Staged CSVReleased fileRowsSHA-256Method
2025-06-org-audit.csvorg June 2025.csv1,03597123c178cad8d39afe6fed6da8c507ce38f13c38c85221aeb4a153d961db64ebyte copy
2025-07-org-audit.csvorg July.csv472395c5d905ed378ef28cd817fc18b2792d6964cd86959f64ab50e5b26c158cbd6byte copy
2025-08-org-audit.csvorg August.csv726161cd29d9811d53d786139b5bf742e7e6c8c18bc16ec4491de44d1695a4fba14byte copy
2025-09-org-audit.csvorg September.csv718f8683b996b2ef179a5f0567e4345733bdee669a5ae30bd5814757cf4fc647e00byte copy
2025-10-org-audit.csvorg October.csv8528f058971c1faad2d929f4bce777a71f6cd6de250fcc37ca668cf394a2df96af3byte copy
2025-11-org-audit.csvorg November.csv4698c5ba3e32b60f1f5313c59a9036c687cbaea18325cdb0c33417e4d9e9d15fcb0byte copy
2025-12-org-audit.csvorg December.csv650089d26cc49428f07af6a879edec9f36a67d3ddfa0ef6b62fb1143fa27b16cd39byte copy
2026-01-org-audit.csvorg January.csv750782f4d32f0c2fcc47ea33f6c6634bf30f2e3df79fa3dcc60e25b9ab0e65c3dccbyte copy
2026-02-org-audit.csvorg February.csv4157222bde0b0091d60ee6e5820f8c878e46b2021b5aeb53c359d2ffcea70a45f0fbyte copy
2026-03-org-audit.csvorg March.csv561296fb8927b5cb44551af93fbb41292af55cbabc0222755ac283207c7215549abbyte copy
2026-04-org-audit.csvorg April.csv425d680334eef2ee22f5a387e5984dd0b74acc73dac0eead42f60c191bcf5065ffbbyte copy
2026-05-org-audit.csvorg May.csv642682bbe5138c92def6b1ab05c58792512bdd25133ecf0b7dcfb59eaf6fb0404ddbyte copy
2026-06-01-to-10-org-audit.csvorg June 1st to end 2026.csv79b8900ec52a066b4cec22ac1f923f31f1407a61d870bc7be44eb445b90f709e7drewritten
2025-06-30-network-audit.csvnetwork June 2025.csv1,667a9e7757c893b5c90c498bfc3deffc181b0bdcc2e938870732e88a132b0d2eac6byte copy
2025-08-network-audit.csvnetwork August.csv15,9404401d3acddfae6966caefae358566f1831dba6adf254b041ce68a8b8b5162516byte copy
2025-10-network-audit.csvnetwork October.csv7,677d57310386030427adf3cca8322cbf35ab4767604527ae152d5f9819014c4a448byte copy
2025-11-network-audit.csvnetwork November.csv6,683ff7d17ddc3a25a00f00b75ec357af9c81db7e7dbb3101ab271a693ac5ae9a4e0byte copy
2025-12-network-audit.csvnetwork December.csv7,4059ef6c84e708e8bf560cc052aed70fb58f4889a00de37cd6ba8f9aa639707303abyte copy
2026-01-network-audit.csvnetwork January.csv6,885e74672d77a4f851603f5918401743b8da61dd99a2b667a42ec2fc1a665fca3a5byte copy
2026-02-network-audit.csvnetwork February.csv7,331613f2c289a3c60ec8682948a4ce81f92cff6620e3e3e6130c163fab4a06b64cbbyte copy
2026-04-network-audit.csvnetwork April.csv6,656b8fcfde99c72745b5772fd07c1e075dc0419fb4a8519db032708e56d07f053aarewritten
2026-05-network-audit.csvnetwork May.csv8,342cfbe268ce426f4692091e496f026f832472502d8e3e81b0c29357c60905a2c81byte copy
2026-06-01-to-10-network-audit.csvnetwork June to end.csv2,7410e18f55254a487d5dc889a56e58535af5bbbedffd1972116c32ed81a7e129f79byte copy
unprocessed/Location-of-Devices.csvLocation of Devices.csv7209a1c451f61c75f6902c972fd01913777d1f17a4ad4db4cc917379425ec036b3byte copy

Row counts exclude the header. The org audit totals 7,794 rows and the network audit totals 71,327.

#Checks that changed nothing

  • No other audit file has a repeated ID or a repeated row.
  • No ID appears in more than one org audit file, apart from the 513 rows described above.
  • No ID appears in more than one network audit file.
  • 3,182 network audit rows carry the Org Name “Ardmore OK PD.” Each of their IDs also appears in the org audit. We kept these rows in both series, because each series is a separate log.
  • After conversion to Central time, the network audit has no rows from June 1–29, 2025, July 2025, September 2025, or March 2026. The release contains no network file for those dates, so we staged none.
  • Search Time values are in UTC in every file. We left them as released.

#Anomalies

#Missing network audit months

The network audit files cover these dates:

  • June 30, 2025 only. The file labeled “June 2025” holds a single day.
  • August 2025
  • October 2025 through February 2026
  • April and May 2026
  • June 1–10, 2026

The files contain no network audit records for June 1–29, 2025, July 2025, September 2025, or March 2026. The org audit covers every month from June 2025 through June 10, 2026.

#Network volume in early August 2025

The network audit lists 9,375 searches from August 1–7, 2025. It lists 6,565 for the rest of August. The daily count fell from 1,553 on August 7 to 269 on August 8. Ten Oklahoma agencies appear in the first week of August and nowhere later in the network audit.

#Test records

The org audit has 11 records with the reason “test.” Jacob Welch entered 10 and Tavin Richards entered one, between August 29 and November 2, 2025.

The network audit has 286 records with “test” or “testing” in the reason, from 23 agencies. The most common values are “test” (95), “Jugging test” (38), and “Test” (27).