Data codebook

Custody stays

API table: custody_stays

Stays in state prisons and Baltimore City detention facilities found by weekly searches of the DPSCS Incarcerated Individual Locator, on each criminal case whose defendant the listed person possibly matches.

Case Harvester searches the DPSCS Incarcerated Individual Locator about once a week, starting August 28, 2026. The locator lists people held in state prisons and in Baltimore City's booking and detention facilities, not in county detention centers, and it keeps no history, so earlier custody cannot be recovered. Every date is the date a search started or ended, so each end of a stay is known only to within about a week, or longer when a search ran slowly. A person is matched to a case only through the birth date on the court record, so cases without one never show a stay, and every match is possible rather than confirmed. Not being listed is not evidence that someone was out of custody. A stay on a case shows when the person was held, not that the case caused it. Gone means the locator stopped listing the person, and release, transfer out of state custody and death look the same. Central Home Detention Unit appears as a facility, although the people it lists are on home detention. A few people at Central Booking appear to be listed twice, once without a state ID, so a case can show two overlapping stays for what is likely one person. See Coverage and known gaps.

Definitions have been recorded for some columns and not others. A column with no definition below has not been documented yet.

A field with a fixed, closed set of values lists that set below. A field with documented codes lists its known values, and shows a meaning for the ones that have been described. Other value lists are not published here. Licensed clients can read them through GET /metadata.

Case Number

API field: case_number

The criminal case whose defendant the listed person possibly matches.

Served type
String
Nullability
Always present on a served row
Query capabilities
  • selectable
  • filter: equals
  • filter: set

Populated on 100% of served rows (300,725 of 300,725) and on 100% of records collected since 2026 (78,583 of 78,583), measured October 15, 2026 at 02:48 UTC

Possible Match Custody Period

API field: period_number

Each number belongs to one possible match. Rows with the same number are that person's consecutive stays, joined by moves between facilities. A new number starts when a search confirms the person was no longer listed, and for every other person who possibly matches the case, so period 2 can be a different person rather than the first one returning. Numbers run in the order the periods were first listed.

Served type
Integer
Nullability
Always present on a served row
Query capabilities
  • selectable

Populated on 100% of served rows (300,725 of 300,725) and on 100% of records collected since 2026 (78,583 of 78,583), measured October 15, 2026 at 02:48 UTC

Facility

API field: facility_name

The facility as the locator names it.

Served type
String
Nullability
May be null
Query capabilities
  • selectable
  • filter: equals
  • filter: set
  • aggregate group

Populated on <100% of served rows (300,720 of 300,725) and on 100% of records collected since 2026 (78,583 of 78,583), measured October 15, 2026 at 02:48 UTC

Stay Start

API field: start_state

Already listed when searches began: the first search, on August 28, 2026, listed the person here, so the stay may have begun long before. Entered: an earlier search for their name did not list them. Moved here: an earlier search listed them at another facility. Not confirmed: first listed later, but no earlier search confirms they were not listed.

Served type
String
Nullability
Always present on a served row
Query capabilities
  • selectable
  • filter: equals
  • filter: set
  • aggregate group

Populated on 100% of served rows (300,725 of 300,725) and on 100% of records collected since 2026 (78,583 of 78,583), measured October 15, 2026 at 02:48 UTC

Closed value set

  • already_listed (Already listed when searches began)
  • entered (Entered)
  • moved (Moved here)
  • not_confirmed (Not confirmed)

Not Listed After

API field: not_listed_after

Start date of the latest earlier search that searched for the person's name and did not list them. After a move, the start date of the last search that listed them at the previous facility. Blank when no search confirms it, which includes everyone already listed in the first search on August 28, 2026.

Served type
Date
Nullability
May be null
Query capabilities
  • selectable
  • sortable
  • filter: equals
  • filter: set
  • filter: greaterThan
  • filter: greaterThanOrEqual
  • filter: lessThan
  • filter: lessThanOrEqual
  • filter: inRange
  • date bucket

Populated on 11.5% of served rows (34,530 of 300,725) and on 12.7% of records collected since 2026 (9,960 of 78,583), measured October 15, 2026 at 02:48 UTC

Listed By

API field: listed_by

End date of the first search that listed the person at this facility.

Served type
Date
Nullability
Always present on a served row
Query capabilities
  • selectable
  • sortable
  • filter: equals
  • filter: set
  • filter: greaterThan
  • filter: greaterThanOrEqual
  • filter: lessThan
  • filter: lessThanOrEqual
  • filter: inRange
  • date bucket

Populated on 100% of served rows (300,725 of 300,725) and on 100% of records collected since 2026 (78,583 of 78,583), measured October 15, 2026 at 02:48 UTC

Listed Until At Least

API field: listed_until

Start date of the last search that listed the person at this facility. For a stay only one search listed, it falls before Listed By, because that search ran between the two dates.

Served type
Date
Nullability
Always present on a served row
Query capabilities
  • selectable
  • sortable
  • filter: equals
  • filter: set
  • filter: greaterThan
  • filter: greaterThanOrEqual
  • filter: lessThan
  • filter: lessThanOrEqual
  • filter: inRange
  • date bucket

Populated on 100% of served rows (300,725 of 300,725) and on 100% of records collected since 2026 (78,583 of 78,583), measured October 15, 2026 at 02:48 UTC

Gone By

API field: gone_by

End date of the first later search that searched for the person's name and did not list them. After a move, the end date of the first search that listed them at the next facility. Blank when no search has confirmed it.

Served type
Date
Nullability
May be null
Query capabilities
  • selectable
  • sortable
  • filter: equals
  • filter: set
  • filter: greaterThan
  • filter: greaterThanOrEqual
  • filter: lessThan
  • filter: lessThanOrEqual
  • filter: inRange
  • date bucket

Populated on 17% of served rows (51,148 of 300,725) and on 18.1% of records collected since 2026 (14,245 of 78,583), measured October 15, 2026 at 02:48 UTC

Stay End

API field: end_state

Still listed: the latest search listed the person here. Moved: a later search listed them at another facility. Gone: a later search for their name no longer listed them, which looks the same for release, transfer out of state custody and death. Not confirmed: no later search has listed them or confirmed they were gone.

Served type
String
Nullability
Always present on a served row
Query capabilities
  • selectable
  • filter: equals
  • filter: set
  • aggregate group

Populated on 100% of served rows (300,725 of 300,725) and on 100% of records collected since 2026 (78,583 of 78,583), measured October 15, 2026 at 02:48 UTC

Closed value set

  • still_listed (Still listed)
  • moved (Moved)
  • gone (Gone)
  • not_confirmed (Not confirmed)

Match

API field: match_strength

How the listed person compares with the defendant on this case. Every stay is a possible match, not a confirmed identity, because the locator publishes no identifier that the court record also carries. The birth month and year match, and so does the name. An initial can stand in for a given or middle name. A middle name that only one record has is ignored. A name split by a space, apostrophe or hyphen into parts of two or more letters matches the same name written as one word, such as DE'ANDRE and DEANDRE. A single letter joined to the rest of the name by an apostrophe or hyphen counts as part of the name, not an initial, so D'ANDRE matches DANDRE but not DANIEL. Gender agrees when both records give one and they match, and is not compared when either gives none. A gender that differs is never a match.

Served type
String
Nullability
Always present on a served row
Query capabilities
  • selectable
  • filter: equals
  • filter: set
  • aggregate group

Populated on 100% of served rows (300,725 of 300,725) and on 100% of records collected since 2026 (78,583 of 78,583), measured October 15, 2026 at 02:48 UTC

Closed value set

  • name_dob_gender (Gender agrees: possible match on name and birth month and year)
  • name_dob (Gender not compared: possible match on name and birth month and year)

Matches Other Defendants

API field: matches_other_defendants

Yes when the listed person also possibly matches defendants whose court records disagree on birth date, name or gender, so they cannot all be one person.

Served type
Boolean
Nullability
Always present on a served row
Query capabilities
  • selectable
  • filter: equals
  • filter: set
  • aggregate group

Populated on 100% of served rows (300,725 of 300,725) and on 100% of records collected since 2026 (78,583 of 78,583), measured October 15, 2026 at 02:48 UTC

Other Possible Matches

API field: other_people

How many other people on the locator also possibly match a defendant on this case. Someone at Central Booking listed without a state ID may be a second listing of the same person.

Served type
Integer
Nullability
Always present on a served row
Query capabilities
  • selectable
  • filter: equals
  • filter: set
  • filter: greaterThan
  • filter: greaterThanOrEqual
  • filter: lessThan
  • filter: lessThanOrEqual
  • filter: inRange

Populated on 100% of served rows (300,725 of 300,725) and on 100% of records collected since 2026 (78,583 of 78,583), measured October 15, 2026 at 02:48 UTC

Facility Code

API field: facility_code

The locator's code for the facility.

Served type
String
Nullability
May be null
Query capabilities
  • selectable
  • filter: equals
  • filter: set
  • aggregate group

Populated on <100% of served rows (300,720 of 300,725) and on 100% of records collected since 2026 (78,583 of 78,583), measured October 15, 2026 at 02:48 UTC

Stay Row ID

API field: id

Internal row identifier. It changes each time the stays are rebuilt, so it does not identify a stay over time.

Served type
BigInteger
Nullability
Always present on a served row
Query capabilities
  • selectable
  • filter: equals
  • filter: set
  • filter: greaterThan
  • filter: greaterThanOrEqual
  • filter: lessThan
  • filter: lessThanOrEqual
  • filter: inRange

Populated on 100% of served rows (300,725 of 300,725) and on 100% of records collected since 2026 (78,583 of 78,583), measured October 15, 2026 at 02:48 UTC

Generated from the current served catalog.