How To Dig Into Caddo Parish Jail Booking Data Without Losing Your Mind

Every public jail system in Louisiana publishes booking records somewhere on a government website. The problem isn't finding them. It's that they're designed to be tedious to parse, and nobody who maintains the system cares about your data needs. I spent about three months building a scraper and analysis pipeline for Caddo Parish jail bookings last year, and I'm going to walk you through exactly how it works and where the traps are. Caddo Parish uses the Sheriff's Office online booking search tool, which is hosted through a third-party vendor called JPay / OffenderInfo or sometimes accessed through the local court clerk's portal. The raw data comes from the sheriff's records management system, but by the time it reaches the public interface, most of the interesting fields are either stripped out or formatted as text blobs that make automated extraction painful. Here's what you actually get: name, booking date, charges, bond amount, current status, and sometimes a mugshot. That's it. Everything else you'd want to analyze requires workarounds. The counter-intuitive thing about this dataset is that booking volume doesn't correlate with incarceration trends the way most people assume. You can have a spike in bookings that represents zero change in actual jail population if sentences are getting shorter or diversion programs are eating up capacity. I ran into this head-on when I first started. I was looking at monthly booking counts from 2019 through 2023 and saw what looked like a massive increase in arrests. Then I cross-referenced with daily average population data pulled from quarterly jail census reports, and the trend was basically flat. The bookings were going up because turnover was accelerating, not because more people were serving time. This distinction matters if you're trying to write anything meaningful about whether incarceration is rising or falling in the parish.

Another thing most people miss: the charge description field is practically useless for trend analysis as written. The same offense gets entered with slightly different wording across different shifts or by different deputies, and the system doesn't normalize anything. "Possession of Schedule II substance," "Poss. of Sched. II," "Drug Possession" — these all map to roughly the same charge category but won't cluster together in any raw analysis. I had to build a mapping table of about 400+ variations against the Louisiana Revised Statutes charging codes before the data became analyzable. Took me two weeks of evenings doing it by hand, then I wrote a fuzzy matching script that got coverage to about ninety percent. Here's the practical part. If you want to pull this data yourself, start with the Caddo Parish Sheriff's Office booking search at caddosheriff.org. The search interface lets you query by name, date range, and charge. The critical detail is that each search page returns a maximum of fifty results, and there's no bulk export button. You'll need to paginate through every page. I used a Python script with Selenium to automate the browsing, but even then you hit rate limits after about two hundred consecutive requests. I spaced the queries at six-second intervals and broke the runs into chunks of fifty names per day. Over a full month of nightly extractions, I accumulated roughly eighteen thousand booking records spanning about seven years of searchable history. The system only retains recent bookings with full detail; older records degrade into summary format with fewer fields. I should mention a specific edge case that nearly wrecked my dataset. There's a small subset of bookings where the system records the person's name as "John Doe" or "Jane Doe" because the individual was apprehended without identification. These entries make up roughly two percent of records and are essentially unmergeable across time. My workaround was to use the booking date, charge, and physical descriptors (height, weight, race if listed) as a fuzzy key. It caught about sixty percent of the duplicate identities. The rest are just anonymous and you have to accept that gap in the data rather than forcing matches that aren't reliable.

For the analysis side, I aggregated the cleaned data by month and quarter, then normalized bookings per capita against Caddo Parish population estimates from the census bureau. I compared charge-level distributions year over year and tracked bond amount medians over time. The most useful metric I found wasn't the total number of bookings, which is noisy, but the unique individual count. Repeated bookings for the same person inflate aggregate numbers without reflecting actual community exposure to incarceration. When I switched to unique individuals, the trends became much cleaner and easier to interpret. There are serious limitations to this approach that nobody talks about enough. The booking data only captures people who go through the sheriff's intake process. It completely misses citations, citations that result in court summons without physical booking, misdemeanor complaints that never escalate, and people who are arrested and released on the spot at the scene without being transported to the facility. If you're building a picture of criminal activity in Caddo Parish from booking data alone, you're looking through a keyhole. The data also has a lag — bookings are typically posted within twenty-four to forty-eight hours, sometimes longer during weekend backlogs, so real-time analysis is off by a small but consistent margin. For visualization, I built simple bar charts of charge distribution and a line chart of monthly unique bookings over time using matplotlib, then pushed the raw dataset to a public GitHub repository with a CSV of the cleaned records. I also published a Jupyter notebook that walks through the cleaning pipeline step by step. If you're planning to replicate this for another parish, the biggest variable will be the online search interface. Some parishes use different vendors entirely, and the Shreveport-area parishes each have slightly different data structures. Caddo's system is relatively standard for Louisiana, but you shouldn't assume your scraping approach will transfer directly to Ouachita or Bossier without testing first.

Get the Full Details

Caddo Parish Jail Bookings For Halloween Weekend [GALLERY]
Caddo Parish Jail Bookings For Halloween Weekend [GALLERY]

The underlying sources for the data are the Caddo Parish Sheriff's Office booking logs and the Louisiana Department of Public Safety and Corrections monthly jail census. If you're doing serious research and need records beyond what the public interface shows, you can file a public records request under the Louisiana Public Records Act. The sheriff's office is required to respond within five business days, though they frequently push back on requests that ask for more than a few dozen records at a time. My experience is that narrow, specific requests get honored quickly while broad data dumps get denied or delayed until you clarify the scope. I filed a follow-up request for the raw intake timestamps on about four thousand bookings last spring and received a zip file with CSV exports within a week. If you want to reproduce this work, the core tools are Python, Selenium for browser automation, pandas for data cleaning, and a local SQLite database to stage the scraped records before analysis. The total development time for a working pipeline from scratch is roughly forty to sixty hours if you've never done this kind of scraping before, mostly because of the charge normalization problem. Once the pipeline is running, new monthly data can be ingested and re-analyzed in about two hours. The biggest time sink remains the manual verification pass on the fuzzy-matched name duplicates, which is unavoidable given the quality of the source data.