Obscura

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.

Category Regulatory Columns 80 Refresh Weekly Point-in-time available_date

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.

ColumnTypeDescription
row_keytext · not nullDeterministic 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_yearinteger · not nullThe 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_codetext · not nullTwo-letter USPS state code of the property/application (also the gap-window/partition key).
leitext20-character Legal Entity Identifier (ISO 17442) of the reporting institution; nullable when the institution had none on file.
county_codetext5-digit FIPS state+county code of the property location; nullable/blank where CFPB suppresses it for low-count privacy protection.
census_tracttext11-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_mdtextCFPB-derived Metropolitan Statistical Area / Metropolitan Division code for the property; null when the property is outside MSA/MD coverage.
derived_racetextCFPB-derived single-value summary of applicant/co-applicant race.
derived_sextextCFPB-derived single-value summary of applicant/co-applicant sex.
derived_ethnicitytextCFPB-derived single-value summary of applicant/co-applicant ethnicity.
derived_loan_product_typetextCFPB-derived loan product label combining loan_type, lien_status, and reverse-mortgage/open-end-credit flags (e.g. "Conventional:First Lien").
action_takenintegerHMDA 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_typeintegerHMDA loan-type code: 1 conventional, 2 FHA, 3 VA, 4 USDA RHS/FSA.
loan_purposeintegerHMDA loan-purpose code: 1 purchase, 2 home improvement, 31/32 refinance, 4 other, 5 not applicable.
lien_statusintegerHMDA lien-status code: 1 first lien, 2 subordinate lien.
occupancy_typeintegerHMDA occupancy-type code: 1 principal residence, 2 second residence, 3 investment property.
loan_amountdouble precisionLoan amount in whole dollars; CFPB rounds/midpoint-buckets above certain thresholds for public-release privacy.
loan_to_value_ratiodouble precisionLoan-to-value ratio as percent; None when "Exempt"/"NA".
interest_ratedouble precisionNote (contract) interest rate as percent; None when "Exempt"/"NA".
rate_spreaddouble precisionRate spread over APOR in percentage points, used to flag higher-priced/HOEPA loans; None when "Exempt"/"NA".
total_loan_costsdouble precisionTotal loan costs disclosed under TRID/Reg Z, in whole dollars; None when "Exempt"/"NA".
loan_termbigintLoan term in months (e.g. 360 for a 30-year mortgage); None when "Exempt"/"NA".
property_valuedouble precisionProperty value in whole dollars; CFPB may bucket/round for public-release privacy. None when "Exempt"/"NA".
incomedouble precisionGross 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_agetextCFPB 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_1integerPrincipal 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_ratiotextRaw `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_typeintegerRaw `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_statusintegerRaw `hoepa_status`: HOEPA high-cost-mortgage flag (1 high-cost, 2 not, 3 NA); predatory-/high-cost-lending risk indicator.
total_points_and_feesdouble precisionRaw `total_points_and_fees`: itemized TRID points-and-fees total in whole dollars; None when "Exempt"/"NA". Distinct from total_loan_costs.
origination_chargesdouble precisionRaw `origination_charges`: itemized TRID origination charges in whole dollars; None when "Exempt"/"NA".
discount_pointsdouble precisionRaw `discount_points`: itemized TRID discount points paid in whole dollars; None when "Exempt"/"NA".
lender_creditsdouble precisionRaw `lender_credits`: itemized TRID lender credits in whole dollars; None when "Exempt"/"NA".
conforming_loan_limittextRaw `conforming_loan_limit`: C/NC flag for whether the loan exceeds the FHFA conforming limit (jumbo indicator); U undetermined, NA not applicable.
total_unitstextRaw `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_purposeintegerRaw `business_or_commercial_purpose`: 1 primarily business/commercial, 2 not, 1111 exempt.
prepayment_penalty_termintegerRaw `prepayment_penalty_term`: prepayment-penalty term in months; None when "Exempt"/"NA".
intro_rate_periodintegerRaw `intro_rate_period`: months until the first interest-rate reset on an ARM; None when "Exempt"/"NA".
negative_amortizationintegerRaw `negative_amortization`: 1 negative amortization, 2 no, 1111 exempt.
interest_only_paymentintegerRaw `interest_only_payment`: 1 interest-only payments, 2 no, 1111 exempt.
balloon_paymentintegerRaw `balloon_payment`: 1 balloon payment, 2 no, 1111 exempt.
other_nonamortizing_featuresintegerRaw `other_nonamortizing_features`: 1 other non-amortizing features, 2 no, 1111 exempt.
aus_1integerRaw `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_2integerRaw `denial_reason-2`: secondary denial reason (same code set as denial_reason_1).
denial_reason_3integerRaw `denial_reason-3`: tertiary denial reason (same code set as denial_reason_1).
denial_reason_4integerRaw `denial_reason-4`: quaternary denial reason (same code set as denial_reason_1).
co_applicant_agetextRaw `co-applicant_age`: CFPB age-bracket string for the co-applicant (e.g. "25-34", "9999" = no co-applicant).
co_applicant_sexintegerRaw `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_1integerRaw `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_2integerRaw `applicant_race-2`: second-reported applicant race code (same code set as applicant_race_1).
applicant_race_3integerRaw `applicant_race-3`: third-reported applicant race code (same code set as applicant_race_1).
applicant_race_4integerRaw `applicant_race-4`: fourth-reported applicant race code (same code set as applicant_race_1).
applicant_race_5integerRaw `applicant_race-5`: fifth-reported applicant race code (same code set as applicant_race_1).
co_applicant_race_1integerRaw `co-applicant_race-1`: first-reported co-applicant race code (same code set as applicant_race_1; 8 no co-applicant).
co_applicant_race_2integerRaw `co-applicant_race-2`: second-reported co-applicant race code.
co_applicant_race_3integerRaw `co-applicant_race-3`: third-reported co-applicant race code.
co_applicant_race_4integerRaw `co-applicant_race-4`: fourth-reported co-applicant race code.
co_applicant_race_5integerRaw `co-applicant_race-5`: fifth-reported co-applicant race code.
applicant_ethnicity_1integerRaw `applicant_ethnicity-1`: first-reported applicant ethnicity code (1 Hispanic/Latino, 11-14 subcategories, 2 not Hispanic, 3 not provided, 4 NA).
applicant_ethnicity_2integerRaw `applicant_ethnicity-2`: second-reported applicant ethnicity code.
applicant_ethnicity_3integerRaw `applicant_ethnicity-3`: third-reported applicant ethnicity code.
applicant_ethnicity_4integerRaw `applicant_ethnicity-4`: fourth-reported applicant ethnicity code.
applicant_ethnicity_5integerRaw `applicant_ethnicity-5`: fifth-reported applicant ethnicity code.
co_applicant_ethnicity_1integerRaw `co-applicant_ethnicity-1`: first-reported co-applicant ethnicity code (same code set as applicant_ethnicity_1; 5 no co-applicant).
co_applicant_ethnicity_2integerRaw `co-applicant_ethnicity-2`: second-reported co-applicant ethnicity code.
co_applicant_ethnicity_3integerRaw `co-applicant_ethnicity-3`: third-reported co-applicant ethnicity code.
co_applicant_ethnicity_4integerRaw `co-applicant_ethnicity-4`: fourth-reported co-applicant ethnicity code.
co_applicant_ethnicity_5integerRaw `co-applicant_ethnicity-5`: fifth-reported co-applicant ethnicity code.
derived_dwelling_categorytextRaw `derived_dwelling_category`: CFPB-derived dwelling type (e.g. "Single Family (1-4 Units):Site-Built").
construction_methodintegerRaw `construction_method`: 1 site-built, 2 manufactured home.
preapprovalintegerRaw `preapproval`: 1 preapproval requested, 2 not requested.
tract_minority_population_percentdouble precisionRaw `tract_minority_population_percent`: FFIEC-appended minority population share of the census tract (percent).
ffiec_msa_md_median_family_incomebigintRaw `ffiec_msa_md_median_family_income`: FFIEC-appended MSA/MD median family income in whole dollars.
tract_to_msa_income_percentagedouble precisionRaw `tract_to_msa_income_percentage`: tract median family income as a percent of the MSA/MD median family income.
tract_populationbigintRaw `tract_population`: FFIEC-appended total population of the census tract.
tract_owner_occupied_unitsbigintRaw `tract_owner_occupied_units`: FFIEC-appended count of owner-occupied dwelling units in the tract.
tract_one_to_four_family_homesbigintRaw `tract_one_to_four_family_homes`: FFIEC-appended count of 1-to-4-family dwelling units in the tract.
tract_median_age_of_housing_unitsintegerRaw `tract_median_age_of_housing_units`: FFIEC-appended median age (years) of housing units in the tract.
period_enddatePeriod-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_datedatePUBLIC-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.

Related datasets

CFTC Commitments of TradersThe CFTC's weekly Commitments of Traders report: how commercial, non-commercial and small traders are positioned in each… ECHO Enforcement CasesEnvironmental enforcement actions and penalties from the EPA's ECHO database. ECHO FacilitiesEPA-regulated facilities and their compliance history, from ECHO. EDGAR 13F FilingsMetadata for every 13F report, the quarterly filing where large institutional managers list their U.S. equity holdings. EDGAR 13F HoldingsThe line-item positions inside each 13F: which manager held which security, and how much, each quarter. EDGAR 8-K ItemsThe item numbers reported on each 8-K (5.02 officer changes, 2.01 acquisitions, 1.01 material agreements, and so on), so… EDGAR Dilution MetricsShare-issuance headroom and overhang metrics built from companies' XBRL filings: authorized versus outstanding shares, a… EDGAR Filing TextSignals mined from the text of filings, such as mentions of distress, litigation, going-concern doubt and restructuring.