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.