HMDA LAR
Loan-level mortgage applications and originations disclosed under HMDA, including rate, amount, and borrower and property attributes.
hmda_lar — the dataset name to pass to the Obscura API.
What one row means
One application or loan-action record from the CFPB/FFIEC HMDA National Loan-Level Dataset (LAR) for a given activity year and U.S. state/territory — the applicant/borrower, property, loan terms, pricing, and the action taken on a single mortgage application or origination.
One row per (activity_year, state_code, row_index).
Point-in-time availability
Every Obscura dataset carries available_date: the calendar day the publisher made the row
available, day-of, with no session rounding. It is the one column a backtest filters on, and it means the
same thing on every dataset in the catalog.
For hmda_lar: published: available_date = period_end (Dec 31 of activity_year) + 210 days, matching CFPB/FFIEC's real annual LAR release lag (~May-June of activity_year+1).
Refresh cadence
Obscura refreshes hmda_lar weekly — the most frequent scheduled job that re-collects or re-exports it. This is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when a row became public is recorded per row in available_date.
Schema — 80 columns
The full public column list for hmda_lar, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/hmda_lar.
| Column | Type | Description |
|---|---|---|
| row_key | text · not null | Deterministic surrogate primary key "{activity_year}|{state_code}|{row_index}" assigned by the collector; HMDA LAR public records carry no natural id, so row_index (0-based position within that (year,state) partition's streamed CSV) discriminates rows. |
| activity_year | integer · not null | The HMDA reporting year the application/loan action occurred in. Sole date-bearing field in the raw LAR schema and the source expression for the generated period_end/available_date columns; also the partition key used to enumerate backfill work. |
| state_code | text · not null | Two-letter USPS state code of the property/application (also the gap-window/partition key). |
| lei | text | 20-character Legal Entity Identifier (ISO 17442) of the reporting institution; nullable when the institution had none on file. |
| county_code | text | 5-digit FIPS state+county code of the property location; nullable/blank where CFPB suppresses it for low-count privacy protection. |
| census_tract | text | 11-digit FIPS census tract code of the property location; nullable/blank, CFPB-suppressed when the tract has too few loans to preserve applicant privacy. |
| derived_msa_md | text | CFPB-derived Metropolitan Statistical Area / Metropolitan Division code for the property; null when the property is outside MSA/MD coverage. |
| derived_race | text | CFPB-derived single-value summary of applicant/co-applicant race. |
| derived_sex | text | CFPB-derived single-value summary of applicant/co-applicant sex. |
| derived_ethnicity | text | CFPB-derived single-value summary of applicant/co-applicant ethnicity. |
| derived_loan_product_type | text | CFPB-derived loan product label combining loan_type, lien_status, and reverse-mortgage/open-end-credit flags (e.g. "Conventional:First Lien"). |
| action_taken | integer | HMDA action-taken code: 1 originated, 2 approved not accepted, 3 denied, 4 withdrawn, 5 closed incomplete, 6 purchased loan, 7 preapproval denied, 8 preapproval approved not accepted. |
| loan_type | integer | HMDA loan-type code: 1 conventional, 2 FHA, 3 VA, 4 USDA RHS/FSA. |
| loan_purpose | integer | HMDA loan-purpose code: 1 purchase, 2 home improvement, 31/32 refinance, 4 other, 5 not applicable. |
| lien_status | integer | HMDA lien-status code: 1 first lien, 2 subordinate lien. |
| occupancy_type | integer | HMDA occupancy-type code: 1 principal residence, 2 second residence, 3 investment property. |
| loan_amount | double precision | Loan amount in whole dollars; CFPB rounds/midpoint-buckets above certain thresholds for public-release privacy. |
| loan_to_value_ratio | double precision | Loan-to-value ratio as percent; None when "Exempt"/"NA". |
| interest_rate | double precision | Note (contract) interest rate as percent; None when "Exempt"/"NA". |
| rate_spread | double precision | Rate spread over APOR in percentage points, used to flag higher-priced/HOEPA loans; None when "Exempt"/"NA". |
| total_loan_costs | double precision | Total loan costs disclosed under TRID/Reg Z, in whole dollars; None when "Exempt"/"NA". |
| loan_term | bigint | Loan term in months (e.g. 360 for a 30-year mortgage); None when "Exempt"/"NA". |
| property_value | double precision | Property value in whole dollars; CFPB may bucket/round for public-release privacy. None when "Exempt"/"NA". |
| income | double precision | Gross annual income relied on in the credit decision, in thousands of USD per HMDA convention (e.g. 85.0 = $85,000); None when "NA". |
| applicant_age | text | CFPB age-bracket string for the primary applicant (e.g. "25-34", ">74", "8888" = NA) — never a raw birthdate, which HMDA does not collect. |
| denial_reason_1 | integer | Principal reason for denial, meaningful only when action_taken = 3: 1 debt-to-income, 2 employment history, 3 credit history, 4 collateral, 5 insufficient cash, 6 unverifiable info, 7 incomplete application, 8 mortgage insurance denied, 9 other, 10 not applicable. Null for non-denial actions. |
| debt_to_income_ratio | text | Raw `debt_to_income_ratio`: bucketed borrower DTI ("<20%", "41", ">60%", "Exempt") — a core underwriting/credit-risk measure that accounts for all debts, not derivable from income+loan_amount. |
| purchaser_type | integer | Raw `purchaser_type`: who bought the loan on the secondary market (0 not sold, 1 Fannie Mae, 2 Ginnie Mae, 3 Freddie Mac, 4 Farmer Mac, 5 private securitizer, 6-9 banks/affiliates/other); key for GSE/secondary-market flow analysis. |
| hoepa_status | integer | Raw `hoepa_status`: HOEPA high-cost-mortgage flag (1 high-cost, 2 not, 3 NA); predatory-/high-cost-lending risk indicator. |
| total_points_and_fees | double precision | Raw `total_points_and_fees`: itemized TRID points-and-fees total in whole dollars; None when "Exempt"/"NA". Distinct from total_loan_costs. |
| origination_charges | double precision | Raw `origination_charges`: itemized TRID origination charges in whole dollars; None when "Exempt"/"NA". |
| discount_points | double precision | Raw `discount_points`: itemized TRID discount points paid in whole dollars; None when "Exempt"/"NA". |
| lender_credits | double precision | Raw `lender_credits`: itemized TRID lender credits in whole dollars; None when "Exempt"/"NA". |
| conforming_loan_limit | text | Raw `conforming_loan_limit`: C/NC flag for whether the loan exceeds the FHFA conforming limit (jumbo indicator); U undetermined, NA not applicable. |
| total_units | text | Raw `total_units`: number of dwelling units in the property ("1","2","3","4","5-24","25-49","50-99","100-149",">149"); property-size measure. |
| business_or_commercial_purpose | integer | Raw `business_or_commercial_purpose`: 1 primarily business/commercial, 2 not, 1111 exempt. |
| prepayment_penalty_term | integer | Raw `prepayment_penalty_term`: prepayment-penalty term in months; None when "Exempt"/"NA". |
| intro_rate_period | integer | Raw `intro_rate_period`: months until the first interest-rate reset on an ARM; None when "Exempt"/"NA". |
| negative_amortization | integer | Raw `negative_amortization`: 1 negative amortization, 2 no, 1111 exempt. |
| interest_only_payment | integer | Raw `interest_only_payment`: 1 interest-only payments, 2 no, 1111 exempt. |
| balloon_payment | integer | Raw `balloon_payment`: 1 balloon payment, 2 no, 1111 exempt. |
| other_nonamortizing_features | integer | Raw `other_nonamortizing_features`: 1 other non-amortizing features, 2 no, 1111 exempt. |
| aus_1 | integer | Raw `aus-1`: primary automated underwriting system used (1 DU, 2 LP/LPA, 3 TOTAL Scorecard, 4 GUS, 5 other, 6 not applicable, 7 internal, 1111 exempt); underwriting-channel signal. |
| denial_reason_2 | integer | Raw `denial_reason-2`: secondary denial reason (same code set as denial_reason_1). |
| denial_reason_3 | integer | Raw `denial_reason-3`: tertiary denial reason (same code set as denial_reason_1). |
| denial_reason_4 | integer | Raw `denial_reason-4`: quaternary denial reason (same code set as denial_reason_1). |
| co_applicant_age | text | Raw `co-applicant_age`: CFPB age-bracket string for the co-applicant (e.g. "25-34", "9999" = no co-applicant). |
| co_applicant_sex | integer | Raw `co-applicant_sex`: co-applicant sex code (1 male, 2 female, 3 not provided, 4 NA, 5 no co-applicant, 6 both selected). |
| applicant_race_1 | integer | Raw `applicant_race-1`: first-reported applicant race code (multi-value up to 5; 1 American Indian, 2/21-27 Asian, 3 Black, 4/41-44 Native Hawaiian/PI, 5 White, 6 not provided, 7 NA). |
| applicant_race_2 | integer | Raw `applicant_race-2`: second-reported applicant race code (same code set as applicant_race_1). |
| applicant_race_3 | integer | Raw `applicant_race-3`: third-reported applicant race code (same code set as applicant_race_1). |
| applicant_race_4 | integer | Raw `applicant_race-4`: fourth-reported applicant race code (same code set as applicant_race_1). |
| applicant_race_5 | integer | Raw `applicant_race-5`: fifth-reported applicant race code (same code set as applicant_race_1). |
| co_applicant_race_1 | integer | Raw `co-applicant_race-1`: first-reported co-applicant race code (same code set as applicant_race_1; 8 no co-applicant). |
| co_applicant_race_2 | integer | Raw `co-applicant_race-2`: second-reported co-applicant race code. |
| co_applicant_race_3 | integer | Raw `co-applicant_race-3`: third-reported co-applicant race code. |
| co_applicant_race_4 | integer | Raw `co-applicant_race-4`: fourth-reported co-applicant race code. |
| co_applicant_race_5 | integer | Raw `co-applicant_race-5`: fifth-reported co-applicant race code. |
| applicant_ethnicity_1 | integer | Raw `applicant_ethnicity-1`: first-reported applicant ethnicity code (1 Hispanic/Latino, 11-14 subcategories, 2 not Hispanic, 3 not provided, 4 NA). |
| applicant_ethnicity_2 | integer | Raw `applicant_ethnicity-2`: second-reported applicant ethnicity code. |
| applicant_ethnicity_3 | integer | Raw `applicant_ethnicity-3`: third-reported applicant ethnicity code. |
| applicant_ethnicity_4 | integer | Raw `applicant_ethnicity-4`: fourth-reported applicant ethnicity code. |
| applicant_ethnicity_5 | integer | Raw `applicant_ethnicity-5`: fifth-reported applicant ethnicity code. |
| co_applicant_ethnicity_1 | integer | Raw `co-applicant_ethnicity-1`: first-reported co-applicant ethnicity code (same code set as applicant_ethnicity_1; 5 no co-applicant). |
| co_applicant_ethnicity_2 | integer | Raw `co-applicant_ethnicity-2`: second-reported co-applicant ethnicity code. |
| co_applicant_ethnicity_3 | integer | Raw `co-applicant_ethnicity-3`: third-reported co-applicant ethnicity code. |
| co_applicant_ethnicity_4 | integer | Raw `co-applicant_ethnicity-4`: fourth-reported co-applicant ethnicity code. |
| co_applicant_ethnicity_5 | integer | Raw `co-applicant_ethnicity-5`: fifth-reported co-applicant ethnicity code. |
| derived_dwelling_category | text | Raw `derived_dwelling_category`: CFPB-derived dwelling type (e.g. "Single Family (1-4 Units):Site-Built"). |
| construction_method | integer | Raw `construction_method`: 1 site-built, 2 manufactured home. |
| preapproval | integer | Raw `preapproval`: 1 preapproval requested, 2 not requested. |
| tract_minority_population_percent | double precision | Raw `tract_minority_population_percent`: FFIEC-appended minority population share of the census tract (percent). |
| ffiec_msa_md_median_family_income | bigint | Raw `ffiec_msa_md_median_family_income`: FFIEC-appended MSA/MD median family income in whole dollars. |
| tract_to_msa_income_percentage | double precision | Raw `tract_to_msa_income_percentage`: tract median family income as a percent of the MSA/MD median family income. |
| tract_population | bigint | Raw `tract_population`: FFIEC-appended total population of the census tract. |
| tract_owner_occupied_units | bigint | Raw `tract_owner_occupied_units`: FFIEC-appended count of owner-occupied dwelling units in the tract. |
| tract_one_to_four_family_homes | bigint | Raw `tract_one_to_four_family_homes`: FFIEC-appended count of 1-to-4-family dwelling units in the tract. |
| tract_median_age_of_housing_units | integer | Raw `tract_median_age_of_housing_units`: FFIEC-appended median age (years) of housing units in the tract. |
| period_end | date | Period-end date the reporting record covers: Dec 31 of activity_year (close of the reporting calendar year). STORED generated column = make_date(activity_year, 12, 31). |
| available_date | date | PUBLIC-availability date = period_end + 210 days, modeling CFPB/FFIEC's real ~5-7 month annual LAR publication lag. STORED generated, read-only; the point-in-time column to filter/join on — NEVER activity_year or period_end directly. |
Access hmda_lar
Two delivery paths, one identifier. Both require an Obscura account and an active subscription; the catalog entry and the schema above are public.
import obscura
client = obscura.Client("obs_live_…")
df = client.query(
dataset="hmda_lar",
start="2024-01-01",
)
Create a free account Browse all 95 datasets
Frequently asked questions
What is in the hmda_lar dataset?
Loan-level mortgage applications and originations disclosed under HMDA, including rate, amount, and borrower and property attributes. One application or loan-action record from the CFPB/FFIEC HMDA National Loan-Level Dataset (LAR) for a given activity year and U.S. state/territory — the applicant/borrower, property, loan terms, pricing, and the action taken on a single mortgage application or origination.
How do I avoid look-ahead bias with hmda_lar?
Filter on hmda_lar.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — published: available_date = period_end (Dec 31 of activity_year) + 210 days, matching CFPB/FFIEC's real annual LAR release lag (~May-June of activity_year+1). A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.
In what formats can I get hmda_lar?
As a Parquet bulk export (POST https://api.obscura.trade/v1/download) or as JSON from the typed query API (POST https://api.obscura.trade/v1/query), both with dataset="hmda_lar". The column schema is public at https://api.obscura.trade/v1/catalog/hmda_lar.
How often is hmda_lar updated?
Obscura refreshes hmda_lar on a weekly schedule — that is the most frequent scheduled job that re-collects or re-exports the table. It is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when the publisher makes a row available is described by the availability rule above, and is recorded per row in available_date.