Navigating the Broward County Arrest Data Mess
The Broward Sheriff's Office publishes arrest data through their public portal, but pulling meaningful information out of it requires understanding the system's quirks before you get started. I spent about six months building scripts to query and normalize this data for a local research project, and here's what actually works. Start by going to the Broward County Sheriff's Office public records page. You'll find the Law Enforcement Agency (LEA) lookup and the inmate search tools. The inmate search lets you look up current and recently released inmates by name or booking number. It does not have an open API. You're working with a web form, which means you can't just pipe data into a database without some automation or manual work. Here's what most people don't figure out quickly enough: the arrest data in Broward is split across at least three separate systems. The SOGIS (Secure Online Guard Information System) handles jail bookings. The court records live through the Florida Courts e-Filing portal and the county clerk's separate case search. And the original arrest reports themselves are requested through a separate public records process. These systems do not link to each other by default. If you want to trace an arrest to a court disposition, you need to match case numbers and names manually or build a matching algorithm.
I ran into a specific problem when trying to track whether certain arrest charges were dropping over time. The Sheriff's website categorizes charges inconsistently. A single incident might list a felony and a misdemeanor under slightly different naming conventions depending on which deputy wrote the report. I built a workaround using fuzzy matching on charge codes — specifically leveraging the Florida Statute cross-reference rather than the text descriptions, which vary too much to reliably compare. That cut my false merge rate from about 30% down to under 5%. Here's the practical process I ended up using: First, query the inmate search by date range in two-week chunks. The system throttles you if you pull too many records at once. Start with a broad date range and narrow down. Second, export whatever you get — the interface lets you copy tables directly. Third, run your deduplication pass. The same person can appear multiple times across different bookings, sometimes with slight name variations like "Robert" versus "Bob" or missing middle initials. I used a combination of date of birth matching and address normalization to clean that up.
When you look at the actual patterns in the data, a few things stand out. Geographic clustering is real — certain patrol zones consistently show higher arrest volumes, which correlates with deployment patterns more than crime rates in some cases. Temporal patterns show the expected spikes around weekends and holidays. But the more useful pattern is in charge categories over time. Drug-related arrests shifted noticeably after the state expanded its prescription drug monitoring program, and violent crime arrest rates showed a gradual decline starting around 2018 that flattens out more recently. The concerns people raise about this data are mostly about completeness and context. Arrest records tell you someone was taken into custody. They don't tell you whether that person was ultimately charged, acquitted, convicted, or diverted. I've seen multiple instances where high-profile arrest statistics looked alarming because the data was pulled before disposition records caught up. An arrest is not a conviction. The court system processes these cases on their own timeline, and many disappear into pre-trial diversion or nolle prosequi entries that the arrest database doesn't reflect. Another issue is the treatment of juvenile records. They're largely filtered out of the public-facing search tools, but juveniles are booked through the same jail system. If you're doing demographic analysis, your data skews older because you can't see the younger half of the population that enters the system.
Get the Full Details

There's a specific edge case that catches everyone: out-of-jurisdiction arrests. People arrested in Broward but booked from other counties, or Broward residents arrested elsewhere who then show up in the system later, create ghost entries that look like local arrests but aren't. My workaround was to cross-reference the arresting agency code in each record. Cases where the arresting agency doesn't match the booking facility location usually need flagging or exclusion depending on what you're measuring. The reform efforts I've tracked center on two main fronts. One is data transparency — advocates pushing for real-time publication of arrest and release data rather than the current lagged system. The other is diversion program expansion, which the Sheriff's office has partially implemented for certain non-violent offenses. The tricky part is that diversion programs mean some arrests don't lead to traditional prosecution, but the arrest still appears in the public record. So improved reform outcomes might actually make the raw arrest data look worse in the short term before the long-term numbers improve. If you're building something with this data, I'd recommend starting with a clearly defined question before you pull anything. The dataset is large enough to answer almost any question, which means it's also large enough to spin into nonsense if you're not careful. Define your variables, understand what each data field actually represents in the source system, and build in validation steps that catch obvious errors before you spend days analyzing bad data.
The biggest time sink is the manual reconciliation between the Sheriff's booking data and the court docket system. I've seen people spend weeks on this alone. If you can access the data through a university partnership or a journalist credential, you may get better export capabilities than the public portal offers. Otherwise, you're working with copy-paste and scripted browser automation, and you need to budget for broken selectors when the site updates its frontend.