EOIR Immigration Court Database
A clean, queryable DuckDB database built from the EOIR FOIA data dump -- the most comprehensive public dataset on U.S. immigration court proceedings.
169,184,982 rows across 97 tables covering every immigration court case since the 1970s.
Built with eoir-database.
Quick Start
DuckDB CLI
INSTALL httpfs;
LOAD httpfs;
ATTACH 'https://huggingface.co/datasets/Nason/eoir-database/resolve/main/eoir.duckdb' AS eoir (READ_ONLY);
-- Query immediately
SELECT court_name, COUNT(*) as cases
FROM eoir.v_proceedings_full
WHERE CASE_TYPE = 'RMV'
GROUP BY court_name
ORDER BY cases DESC
LIMIT 10;
Python
import duckdb
con = duckdb.connect()
con.sql("INSTALL httpfs; LOAD httpfs;")
con.sql("""
ATTACH 'https://huggingface.co/datasets/Nason/eoir-database/resolve/main/eoir.duckdb'
AS eoir (READ_ONLY)
""")
con.sql("SELECT * FROM eoir._metadata").show()
DuckDB uses HTTP range requests, so only the pages needed for your query are downloaded.
Tables
| Table | Description | Rows |
|---|---|---|
schedule | Hearing schedule entries with calendar type and adjournments | 46,631,388 |
representatives | Attorney representation records | 26,268,999 |
charges | Individual charges per proceeding | 18,867,750 |
proceedings | Proceedings: hearings, decisions, judges, charges | 16,549,948 |
applications | Applications for relief (asylum, cancellation, etc.) | 16,104,798 |
cases | Case-level demographics, custody, dates, attorney info | 12,662,540 |
custody_history | Custody status change records | 10,024,044 |
motions | Motions filed in proceedings | 8,573,390 |
juvenile_history | Juvenile designation records | 2,998,644 |
lead_rider | Lead/rider case relationships | 2,627,442 |
case_identifiers | Case ID cross-references | 2,569,051 |
bonds | Bond hearing records and amounts | 1,616,941 |
appeals | Appeals to Board of Immigration Appeals | 1,518,161 |
appeal2 | Loaded from tblAppeal2.csv | 1,237,190 |
attorneys | Attorney registry | 407,493 |
appeal_fed_courts | Loaded from tblAppealFedCourts.csv | 181,484 |
case_priority_history | Priority code changes | 148,995 |
three_mbr_referrals | Loaded from tblThreeMbrReferrals.csv | 84,118 |
pro_bono | Pro bono screening records | 66,986 |
lu_judge_base_city | Loaded from tblLookupJudgeBaseCity.csv | 11,946 |
lu_insta | Loaded from tblLookupINSTA.csv | 9,385 |
lu_inmate | Loaded from tblLookupInmate.csv | 4,848 |
lu_inmate_housing | Loaded from tblInmateHousing.csv | 4,752 |
lu_responsible_party | Loaded from tblResponsibleParty.csv | 3,381 |
lu_judge | Immigration judge codes | 1,676 |
lu_hearing_location | Hearing location codes | 1,351 |
lu_insloc | Loaded from tblLookupINSLOC.csv | 1,020 |
lu_bia | Loaded from tblLookupBIA.csv | 877 |
lu_insaddress | Loaded from tblLookUpINSAddress.csv | 754 |
lu_language | Language codes | 742 |
lu_holidays | Loaded from tblLookupHolidays.csv | 613 |
lu_notice | Loaded from tblLookupNOTICE.csv | 598 |
lu_district_location | Loaded from tblLookupDistrictLocation.csv | 288 |
lu_office_location | Loaded from tblLookupOfficeLocation.csv | 264 |
lu_alien_nat | Loaded from tblLookupAlienNat.csv | 256 |
lu_country | Loaded from tblLookupCountry.csv | 254 |
lu_charges | Charge codes and descriptions | 252 |
lu_nationality | Nationality/country codes | 251 |
lu_appeal_issues | Loaded from tblLookupAppealIssues.csv | 247 |
lu_biacluster | Loaded from tblLookup_BIACluster.csv | 243 |
lu_court_decision | Court decision codes (by case type) | 217 |
lu_bar_code_type | Loaded from tblBarCodeType.csv | 141 |
lu_adjournment | Adjournment reason codes | 124 |
lu_case_identifier | Loaded from tblLookUpCaseIdentifier.csv | 111 |
lu_base_city | Immigration court locations | 97 |
lu_in_tr_pr | Loaded from tblLookupInTrPr.csv | 94 |
lu_motion_type | Motion type codes | 72 |
lu_insoffice | Loaded from tblINSoffice.csv | 72 |
lu_state | U.S. state codes | 59 |
lu_bia_decision | BIA decision codes | 54 |
lu_special_issue | Loaded from tblLookupSpecialIssue.csv | 43 |
lu_application | Application type codes | 40 |
lu_teams | Loaded from tblTeams.csv | 37 |
lu_hold_reason | Loaded from tblLookupHoldReason.csv | 37 |
lu_schedule_type | Schedule type codes | 36 |
lu_callup_reasons | Loaded from tblLookupCallup_Reasons.csv | 30 |
lu_cal_type | Calendar type codes | 29 |
lu_dddecision_types | Loaded from tblLookUpDDDecisionTypes.csv | 23 |
lu_panels | Loaded from tblPanels.csv | 20 |
lu_appeal_type | Loaded from tbllookupAppealType.csv | 19 |
lu_priority | Loaded from tblLookupPriority.csv | 16 |
lu_board_motions | Loaded from tblLookupBoardMotions.csv | 16 |
lu_br_deduct_codes | Loaded from tbl_br_DeductCodes.csv | 15 |
lu_app_decision | Application decision codes | 14 |
lu_intr_pr_lang | Loaded from tblLookupIntrPrLang.csv | 14 |
lu_transcribers | Loaded from tblLookupTranscribers.csv | 14 |
lu_case_type | Case type codes | 13 |
lu_dec_code | Loaded from tblDecCode.csv | 12 |
lu_filing_method_party | Loaded from tblLookupFiling_Method_Party.csv | 10 |
lu_filed_by | Loaded from tblLookupFiledBy.csv | 9 |
lu_comment_type_board | Loaded from tblLookupCommentTypeBoard.csv | 9 |
lu_contact_change | Loaded from tblLookupContactChange.csv | 9 |
lu_torture_conv_id | Loaded from tblTortureConvID.csv | 8 |
lu_ins_clock_entry_status | Loaded from tblLookup_INS_Clock_Entry_Status.csv | 8 |
lu_3_mbr_referred_reason | Loaded from tblLookup3MbrReferredReason.csv | 7 |
lu_category | Loaded from tbllookup_Category.csv | 7 |
lu_vote | Loaded from tblLookupVote.csv | 7 |
lu_juvenile | Loaded from tblLookup_Juvenile.csv | 6 |
lu_service_method | Loaded from tblLookupService_Method.csv | 6 |
lu_case_priority | Loaded from tblLookup_CasePriority.csv | 6 |
lu_fee_status | Loaded from tblLookupFeeStatus.csv | 5 |
lu_consulted_with | Loaded from tblLookupConsultedWith.csv | 5 |
lu_biadecision_type | Loaded from tblLookupBIADecisionType.csv | 5 |
lu_in_tr_pr_agenda | Loaded from tblLookupInTrPrAgenda.csv | 5 |
lu_fed_court_decision | Loaded from tblLookupFedCourtDecision.csv | 4 |
lu_oaresponse | Loaded from tblLookupOAResponse.csv | 4 |
lu_components | Loaded from tblLookupComponents.csv | 4 |
lu_filing_method | Loaded from tblLookupFiling_Method.csv | 4 |
lu_final_disposition | Loaded from tblLookupFinalDisposition.csv | 4 |
lu_claimed_issue | Loaded from tblLookupClaimedIssue.csv | 4 |
lu_custody_status | Custody status codes | 3 |
lu_fee_type | Loaded from tblLookupFeeType.csv | 3 |
lu_allegation_stmt | Loaded from tblLookUpAllegationStmt.csv | 3 |
lu_region | Loaded from tblLookupRegion.csv | 2 |
lu_sex | Loaded from tblLookupSex.csv | 2 |
lu_in_tr_pr_lang_group | Loaded from tblLookupInTrPrLangGroup.csv | 2 |
lu_fed_court_remand_to | Loaded from tblLookupFedCourtRemandTo.csv | 2 |
Data Source
EOIR FOIA Library -- updated monthly by the Executive Office for Immigration Review (U.S. Department of Justice). This is public domain U.S. government data.
License
Database build code: MIT. Underlying data: public domain (U.S. government work).
GitHub
Full source code, build instructions, and example analyses: github.com/ian-nason/eoir-database
Changelog
2026-07-06 — Full refresh + data-quality audit
Rebuilt from the latest DOJ EOIR FOIA release (proceedings through 2026) and repaired after an independent SQL-verified audit.
Data changes
- 169,184,982 rows across 97 tables (data through 2026; 248k proceedings filed in 2026).
- All VARCHAR values normalized: trailing-space padding trimmed, literal NUL bytes stripped, blank strings converted to NULL (214 columns affected).
Fixes
- Charge-code lookup joins went from 76.97% to 100.00% coverage — the gap was whitespace padding in the source export, not missing lookup codes as previously documented.
- Language lookups no longer silently drop 1.7M trailing-space
'SP '(Spanish) rows. - README quickstart query corrected (filing dates live on
proceedings, notcases).
Known caveats (see README for the full list)
cases.C_BIRTHDATEis 100% NULL (redacted at source) — no age analyses.- ~45% of proceedings have no usable decision code once blanks are counted.
- Proceedings (16.5M) vs cases (12.7M): counting proceedings overcounts people ~1.3x. Cap dates to 1950-2035 before computing durations.