HMDA Fair Lending Disparity Analysis — Denial & Pricing
Pricing
from $4.40 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
an hour ago
Last modified
Categories
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:
| Applications | Denial rate | Ratio | z | p | Verdict | |
|---|---|---|---|---|---|---|
| American Indian / Alaska Native | 3 | 66.67% | 1.693 | 0.92 | 0.359 | not significant |
| White (reference) | 33 | 39.39% | 1.000 | — | — | reference |
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 American | White | Index | p | |
|---|---|---|---|---|
| loanDepot (CO) | 13.92% | 13.98% | 0.996 | 0.989 — not significant |
| CO market, all 1,198 filers | 32.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:
| Group | Denials | Debt-to-income | Credit history | Collateral | Incomplete | Credit-history index |
|---|---|---|---|---|---|---|
| White (reference) | 26,728 | 37.4% | 22.9% | 14.3% | 10.8% | 1.000 |
| Black or African American | 1,672 | 35.1% | 29.8% | 12.7% | 9.9% | 1.298 |
| American Indian / Alaska Native | 635 | 33.4% | 30.0% | 12.1% | 10.4% | 1.310 |
| Asian | 1,448 | 44.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):
| Group | Higher-priced >=1.5 | Index vs White |
|---|---|---|
| American Indian / Alaska Native | 24.48% | 1.425 |
| Native Hawaiian / Pacific Islander | 20.54% | 1.195 |
| Black or African American | 17.69% | 1.030 |
| White (reference) | 17.18% | 1.000 |
| Asian | 10.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%.
| Group | Originations in LMI tracts | In majority-minority tracts |
|---|---|---|
| Black or African American | 37.42% | 43.35% |
| American Indian / Alaska Native | 33.23% | 30.51% |
| White | 20.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
| Mode | Input | What you get |
|---|---|---|
| State / MSA / county | states, msamds or counties | Denial rate, disparity index, z-test per group |
| Lender | leis (+ one geography) | The above, plus market and national baselines, rank and peer count |
| Denial reasons | includeDenialReasons: true | Nine primary-reason counts, top reason, credit-history index |
| Pricing | includeRateSpread: true | Higher-priced 1.5/2.5 shares, median rate spread, HOEPA, index |
| CRA / LMI | includeTractContext: true | LMI and minority-tract origination shares, denial rates, penetration indexes |
| Tract-level | tractLevel: true | One 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,1111and8888are treated as missing, never as zero. Pricing figures ship withrate_spread_coverage_pctso you can see the base. Thecensus_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: 0rows 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+countiessilently 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 block | Populates when | Null otherwise because |
|---|---|---|
Core counts, denial rate, disparity index, z/p, finding_strength, flags | always, 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_pp | two or more consecutive years requested | one-year run has no prior year to difference against |
lei, institution_name, market_*, lender_vs_market_*, peer_lender_count, market_rank_by_volume | lender 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: true | costs one extra call per year; off by default |
denied_*, denial_reason_*, credit_history_share_index, secondary_reason_rate_pct | includeDenialReasons: true | needs 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: true | as above |
lmi_*, majority_minority_tract_*, tracts_with_activity | includeTractContext: true | as above |
census_tract, tract_income_level, tract_median_family_income_pct | tractLevel: true | these 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.