HMDA Fair Lending Disparity Analysis — Denial & Pricing avatar

HMDA Fair Lending Disparity Analysis — Denial & Pricing

Pricing

from $4.40 / 1,000 results

Go to Apify Store
HMDA Fair Lending Disparity Analysis — Denial & Pricing

HMDA Fair Lending Disparity Analysis — Denial & Pricing

Fair-lending exam analytics on CFPB HMDA data: denial-rate disparity index with two-proportion z-tests, denial reasons, higher-priced lending, LMI tract redlining screen, and lender-vs-market benchmarks by LEI, state, MSA, county or tract.

Pricing

from $4.40 / 1,000 results

Rating

0.0

(0)

Developer

Kyle Maloney

Kyle Maloney

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Share

HMDA Fair Lending Disparity Analysis — Denial, Pricing & Redlining Screening by Lender, MSA & Tract

Fair-lending exam analytics on official CFPB/FFIEC HMDA data. Not a raw-loan dump — this actor returns the analysis those loans are for: a denial-rate disparity index with a two-proportion z-test, denial-reason mix, higher-priced lending (rate-spread) disparity, LMI and majority-minority tract context, and lender-vs-market peer benchmarks — for any lender (LEI), state, MSA, county or census tract, 2018 through 2025. Keyless.

The screen that survives review

A disparity ratio alone is not a finding. Colorado's Baca County, HMDA 2023:

ApplicationsDenial rateRatiozpVerdict
American Indian / Alaska Native366.67%1.6930.920.359not significant
White (reference)3339.39%1.000reference

A ratio-only screen reports that county as a 1.69x fair-lending disparity. It is three applications. This actor runs a pooled two-proportion z-test and a minimum-sample gate on every row, so that cell comes back INSUFFICIENT_N, not a finding.

Swept across all 63 Colorado counties (HMDA 2023, by race): 123 raw ">=1.5x" flags collapse to 22 statistically significant ones — an 82.1% false-positive reduction. At census-tract level in Denver County the gate screens out 80 of 88. Every number here is reproducible from this actor's own output.

Lender vs market — the question a compliance officer actually asks

leis: ["549300AG64NHILB7ZP05"], states: ["CO"], years: ["2023"]

Black or African AmericanWhiteIndexp
loanDepot (CO)13.92%13.98%0.9960.989 — not significant
CO market, all 1,198 filers32.27%21.24%1.519< 1e-6 — significant

The lender is at parity inside a market running a significant 1.52x disparity. Without the market row that institution looks unexamined; with it, it is exonerated in one line. Every lender row carries market_denial_rate_pct, market_disparity_index, lender_vs_market_index, market_rank_by_volume (21 of 1,198 here) and an optional national baseline.

Denial-reason mix — the first table in an exam workpaper

HMDA reports up to four denial reasons per denied application. Colorado 2023, share of each group's denials by primary reason:

GroupDenialsDebt-to-incomeCredit historyCollateralIncompleteCredit-history index
White (reference)26,72837.4%22.9%14.3%10.8%1.000
Black or African American1,67235.1%29.8%12.7%9.9%1.298
American Indian / Alaska Native63533.4%30.0%12.1%10.4%1.310
Asian1,44844.3%18.7%12.3%8.4%0.817

Higher-priced lending — the pricing half of the exam

Share of originations at or above the 1.5 rate-spread threshold, Colorado 2023 (rate-spread coverage 90.2% of originations; NA/Exempt are excluded, never counted as zero):

GroupHigher-priced >=1.5Index vs White
American Indian / Alaska Native24.48%1.425
Native Hawaiian / Pacific Islander20.54%1.195
Black or African American17.69%1.030
White (reference)17.18%1.000
Asian10.78%0.628

CRA / LMI tract context — the redlining screen

Colorado 2023, 1,419 census tracts with activity. Denial rate by CRA tract income level: Low 39.01%, Moderate 26.07%, Middle 22.58%, Upper 19.42%.

GroupOriginations in LMI tractsIn majority-minority tracts
Black or African American37.42%43.35%
American Indian / Alaska Native33.23%30.51%
White20.77%14.25%

REDLINING_SCREEN_POSITIVE fires only when a statistically significant denial disparity coincides with LMI or minority-tract underservice.

Ethnicity is a separate protected class

Hispanic or Latino origin is protected independently of race under ECOA and the Fair Housing Act, and HMDA reports it separately. In Colorado 2023 it is the larger signal:

Hispanic or Latino 34.56% vs Not Hispanic or Latino 20.23% — index 1.708, z 47.88. Set groupBy: "ethnicity".

Who it's for

  • Bank fair-lending & CRA compliance officers — screen your own LEI against your markets before an exam does, with a defensible statistical test attached to every finding.
  • Fair-lending consultants — denial-reason and pricing workpapers across a client portfolio in one run.
  • Community-reinvestment analysts — CRA assessment-area analysis by MSA, county and tract with LMI and minority-tract penetration indexes.
  • Bank M&A due-diligence teams — screen a target institution's national and per-market disparity profile before signing.
  • Researchers & journalists — a reproducible redlining signal with the exact CFPB source URL on every row.

Modes

ModeInputWhat you get
State / MSA / countystates, msamds or countiesDenial rate, disparity index, z-test per group
Lenderleis (+ one geography)The above, plus market and national baselines, rank and peer count
Denial reasonsincludeDenialReasons: trueNine primary-reason counts, top reason, credit-history index
PricingincludeRateSpread: trueHigher-priced 1.5/2.5 shares, median rate spread, HOEPA, index
CRA / LMIincludeTractContext: trueLMI and minority-tract origination shares, denial rates, penetration indexes
Tract-leveltractLevel: trueOne row per (census tract, group), each with its own z-test

Example input

{
"leis": ["549300AG64NHILB7ZP05"],
"states": ["CO"],
"years": ["2023"],
"groupBy": "race",
"referenceGroup": "White",
"includeDenialReasons": true,
"includeRateSpread": true,
"includeTractContext": true,
"minSampleN": 30
}

Running with no input performs a bounded default analysis (Colorado, 2023, by race, vs White).

Methodology (read this before citing numbers)

  • Disparity index = group denial rate / reference-group denial rate. 1.0 is parity. It is a screening signal, not proof of discrimination: HMDA public data has no credit score, and LTV/DTI only in bands. An index is never reported as a finding unless it also clears the z-test and the minimum-sample gate.
  • Significance = two-sided pooled two-proportion z-test vs the reference group, default alpha 0.05, plus minSampleN (default 30). Rows also carry a 95% Wilson confidence interval, which stays inside [0,100] at small n where the normal approximation does not.
  • Denominator. Default narrow = denied / (originated + denied) — the cleanest approve-deny decision rate, and the v1 behaviour. ffiec = denied / actions 1-5, adding approved-not-accepted, withdrawn and closed-for-incompleteness. The narrow basis runs hotter: Colorado 2023 Black-vs-White is 1.519 narrow but 1.457 on the FFIEC basis. Both are always emitted.
  • Withdrawal rate (HMDA action 4) is emitted as a separate discouragement signal.
  • Race, ethnicity and sex are HMDA derived fields. "Race Not Available" is itself a group (often large) and is included.
  • Null discipline. The LAR tokens NA, Exempt, 1111 and 8888 are treated as missing, never as zero. Pricing figures ship with rate_spread_coverage_pct so you can see the base. The census_tract "NA" token (1,097 of 175,185 Colorado 2023 rows) is dropped rather than collapsed into a fake tract.
  • Zero-activity groups are never emitted and never billed. The CFPB API returns explicit count: 0 rows for every enumerated group — 6 of 9 in county 08111. A 63-county Colorado sweep suppresses 187 of 567 possible rows.
  • The CFPB aggregation API allows at most 2 filters per call and its geography classes are mutually exclusive (states + counties silently returns statewide data with HTTP 200). This actor refuses to build such a request rather than report the wrong number.

Output

80 fields per row. Headline: denial_rate_pct, disparity_index, z_score, p_value, is_significant_95, min_n_met, finding_strength, flags. Plus peer (market_*, lender_vs_market_*), denial reasons (denied_*, credit_history_share_index), pricing (higher_priced_*, median_rate_spread, hoepa_*), CRA (lmi_*, majority_minority_tract_*, tract_income_level), and source_url for audit on every row.

Which columns populate in which mode

Every column is nullable and many are deliberately mode-dependent. Nothing below is a defect — this table is the contract. The default (prefill) run fills 66 of 80.

Column blockPopulates whenNull otherwise because
Core counts, denial rate, disparity index, z/p, finding_strength, flagsalways, every mode
FFIEC denominator block (denial_rate_ffiec_pct, disparity_index_ffiec, applications_withdrawn, applications_approved_not_accepted, applications_closed_incomplete, withdrawal_rate_*)always — every query fetches HMDA actions 1-5
yoy_denial_rate_change_pptwo or more consecutive years requestedone-year run has no prior year to difference against
lei, institution_name, market_*, lender_vs_market_*, peer_lender_count, market_rank_by_volumelender mode (leis supplied)a whole state/MSA/county is its own market — there is no distinct benchmark to compare it against, so a self-referential 1.000 would be noise
national_*includeNational: truecosts one extra call per year; off by default
denied_*, denial_reason_*, credit_history_share_index, secondary_reason_rate_pctincludeDenialReasons: trueneeds the loan-level engine; the aggregate API cannot express denial reasons at any price
higher_priced_*, median_rate_spread, rate_spread_coverage_pct, originations_with_rate_spread, hoepa_*includeRateSpread: trueas above
lmi_*, majority_minority_tract_*, tracts_with_activityincludeTractContext: trueas above
census_tract, tract_income_level, tract_median_family_income_pcttractLevel: truethese describe a single tract; they are meaningless on an aggregated row

finding_strength is never null. It reads REFERENCE, STRONG, MODERATE, NOT_SIGNIFICANT, INSUFFICIENT_N, or NO_REFERENCE_GROUP (loan-purpose grouping, where no protected-class baseline exists and therefore no test is run) — so you can always read why there is or is not a finding.

Flags. Findings: SIGNIFICANT_DISPARITY_1_5X, SIGNIFICANT_DISPARITY_2X, HIGHER_PRICED_DISPARITY, LMI_UNDERSERVED, MINORITY_TRACT_UNDERSERVED, REDLINING_SCREEN_POSITIVE. Screened out: NOT_STATISTICALLY_SIGNIFICANT, INSUFFICIENT_N. Legacy ungated flags (DISPARITY_ABOVE_1_5X, DISPARITY_ABOVE_2X, IS_REFERENCE_GROUP, LOW_SAMPLE, DENIAL_RATE_RISING) are preserved unchanged for existing consumers.

Dataset views: Fair-lending findings, Denial-reason mix, Higher-priced lending, Lender vs market, CRA / LMI tract context.

Use as an MCP tool

Add this actor via mcp.apify.com — AI agents (Claude, Cursor) can call it with an LEI or a state list and get back a compact, fully-described fair-lending table, ideal for chaining into compliance-report or diligence workflows.

FAQ

Which years are available? 2018 through 2025, all verified live. Request consecutive years for year-over-year trend columns.

Does it cover counties, MSAs, tracts or individual lenders? All of them. Use states, msamds, counties or leis; add tractLevel for per-census-tract rows.

Do I need an API key? No. The source is the official public CFPB/FFIEC HMDA data-browser API.

How is this different from other HMDA actors? They export raw loan-level rows and leave you to build the analysis. This one returns the fair-lending analysis itself — disparity index, significance test, denial reasons, pricing disparity, CRA tract context, peer benchmark — with the exact source call attached to every row.

Is a disparity index above 1.5 illegal? No. It is a screening threshold used to prioritise review, and on its own it is not even a finding — see the methodology note.

Is this loan-level data? The exam analytics are computed from the CFPB's loan-level LAR export, streamed and aggregated in-process. You get the analysis, not a multi-GB file. Aggregate-only mode (engine: "aggregate") skips the download when you only need denial rates.

Pricing

Pay per result row. A one-state, one-year race analysis returns 9 rows; a lender screened across one market returns up to 9; a 50-state two-year sweep returns ~900. Zero-activity groups are never billed, and the run logs its expected row count before fetching anything.