CFPB Consumer Complaints - US Financial
Pricing
$0.10 / 1,000 cfpb consumer complaint records
CFPB Consumer Complaints - US Financial
The US CFPB consumer complaint database (public open data, no key, 17.7M complaints): what consumers complained about and how the company answered - product, issue, company, narrative, company response, whether it was timely, and the state. Filter or aggregate.
Pricing
$0.10 / 1,000 cfpb consumer complaint records
Rating
0.0
(0)
Developer
Wenhao Yang
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
CFPB Consumer Complaints - US Complaint Database
Every complaint the US Consumer Financial Protection Bureau has received about a financial product or service since 2011 - 17,729,722 complaints, each keyed by the Bureau's own complaint id.
This is the register of what consumers actually complained about, to whom, and what the company said back: the product and issue classification, the company the complaint was routed to, the company's response and whether it was timely, the consumer's state, the channel it arrived through, and - for the complaints where the consumer consented - the consumer's own narrative in full.
Low cost
From $0.0001 per record. Pay-per-event: you are charged per record delivered, and nothing for the query.
What you get
| Mode | Returns |
|---|---|
rows (default) | complaint records matching your filters, newest received first |
aggregate | one count row per group for the dimension you pick |
One record is one complaint. complaint_id is unique - verified distinct across a 10,000-record sample - so the 17,729,722 rows are 17,729,722 complaints, not a filing or line count.
The narrative
consumerNarrative is free text, published only after the company responds and the consumer consents - so it lags by months and covers 3,851,416 complaints (22%). Where it is present it is the whole complaint in the consumer's words: measured across 200 narrative records, 50 to 19,650 characters, 1,615 on average.
Because narratives lag, the newest complaints never carry one: 0 of the 200 most recently received complaints have a narrative. Ask for hasNarrative=true when you want depth, and leave it off when you want volume - the difference is roughly 680 bytes per record against several KB. Narrowing to the last 30 days and asking for narratives together returns nothing at all, so when you ask for narratives without naming a window the actor widens to all time and says so in the run log.
Coverage in the register
- Product - 21 values.
Credit reporting or other personal consumer reports12,173,409;Credit reporting, credit repair services, or other personal consumer reports2,163,770;Debt collection1,190,725;Mortgage459,987;Checking or savings account394,828;Credit card342,402; and 15 more historical and current categories. - Sub-product - 86 distinct values once the per-product buckets are flattened together (the source nests them, and the same sub-product name recurs under several products), headed by
Credit reporting14,269,943. 235,275 complaints (1.3%) carry no sub-product at all. - Issue - 178 values.
Incorrect information on your report7,998,907;Improper use of your report3,390,266;Problem with a company's investigation into an existing problem2,304,573. - State - 63 values including territories and military codes.
TX2,441,767;FL2,428,692;CA1,758,940;GA1,307,037;NY1,026,335. - Company response - 8 values.
Closed with explanation10,867,098;Closed with non-monetary relief5,946,287;In progress623,834;Closed with monetary relief218,246. NoteClosed(17,611) is a value of its own, not a truncation of the longer ones. - Timely -
Yes17,621,023,No108,699. - Submitted via -
Web17,093,819;Referral278,604;Phone220,732;Postal mail110,500;Fax25,644;Email423. - Tags - the Bureau's special-population markers:
Servicemember511,999;Older American234,545; both 58,798.
The three big credit bureaus
company matches the Bureau's own normalized company name exactly:
| Company | Complaints |
|---|---|
TRANSUNION INTERMEDIATE HOLDINGS, INC. | 4,887,642 |
EQUIFAX, INC. | 4,693,894 |
Experian Information Solutions Inc. | 4,273,228 |
A partial or lowercase name matches nothing - equifax returns zero, because the field is not tokenized the way the free-text index is. Use searchTerm for anything partial, or take the exact name from an aggregate run and feed it back.
Examples
Everything about one company last month - company=EQUIFAX, INC., dateFrom=2026-08-01, dateTo=2026-08-31.
Free text across the whole register - searchTerm=foreclosure matches 31,902 complaints wherever the term occurs in the record, not just the narrative.
Where complaints come from - mode=aggregate, groupBy=state, recentDays=0 returns all 63 values, largest first. (The default 30-day window applies to aggregate mode too - leave recentDays alone and you get the 60 states with a complaint in the last month. Set it to 0 for the whole register.)
What companies do about them - mode=aggregate, groupBy=companyResponse, product=Debt collection.
Just the stories - hasNarrative=true, maxResults=500, filtered to one issue.
Modes and filters
mode=rows accepts searchTerm, company, product, issue, state, tags, companyResponse, timely, submittedVia, hasNarrative, dateFrom / dateTo, and recentDays.
mode=aggregate counts by product, subProduct, issue, state, companyResponse, submittedVia, timely, tags or hasNarrative - and honours every filter above, so "issue counts for Texas servicemembers last quarter" is one run.
recentDays applies only to a bare rows run (30 days, ~558k complaints); dateFrom overrides it and recentDays=0 spans the whole register since 2011.
Source notes
The Bureau's complaint search runs on Elasticsearch, and the edges of that are where the work is:
- The register is behind an edge that refuses browser User-Agent strings. A browser UA - and an empty one - get a raw HTML 403 from the CDN, not from the API. A plain bot-style UA with a contact token is served normally. Worked out and pinned, so the actor does not fall over on an "obvious" header.
- Offset paging does not work, and fails silently. The endpoint validates a
frmoffset - reject it and you getfrm is not zero or a multiple of size- but accepts any valid one and returns the same first page. Probing offsets 0, 3, 30, 300 and 3,000 for one page size returns ten identical records, and page 1 against page 2 overlaps 1,000 of 1,000. A naive loop "pages" forever over the same hundred complaints and bills for every duplicate. This actor fetches one page and is bounded by the source's 10,000-record window instead. - The source's own
companyaggregation is truncated - it hands back 6,500 buckets and quietly accounts for another 1,830 companies under "other".companyis therefore offered as an exact filter but deliberately withheld as a group-by dimension: a "top companies" chart from it would be missing a tail of thousands. - Some fields look filterable and are not.
sub_product,sub_issueandconsumer_disputedare accepted and ignored - each returns the full 17.7-million-row register. (fieldis rejected outright by the source for most values, so it is unusable too.) Accepting them would hand back unfiltered records at per-record prices, so they are not offered; supplying one is logged as ignored rather than silently dropped.subProductsurvives as an output field and as a group-by dimension, flattened out of the nested source aggregation. timely=Nois 108,699 complaints, not zero. Thetimelyfield is only meaningful once a company has responded, so a naive read of it undercounts.
Freshness is guarded on every run: the Bureau stamps the index (last_updated, rebuilt daily) and flags its own staleness, and a broken refresh fails the run rather than serving a frozen register.
Source
Counts are a live snapshot - the Bureau appends complaints continuously, so exact figures drift daily. The proportions are stable.
US Consumer Financial Protection Bureau, Consumer Complaint Database - public open data, released under CC0, no login and no API key. The register starts in 2011 (2,536 complaints that first year against 17.7M today) and is rebuilt daily.
Output
Every record carries the same key set in every mode - the complaint fields, plus mode, groupBy, groupKey and groupCount, which are "" outside aggregate mode. Missing values are '' rather than absent; tags is flattened from the source's array to a comma-joined string, and hasNarrative is a "true" / "false" string.
Related actors
- SAM.gov Contracts (
sam-gov-contracts) - federal contract opportunities and awards. - FMCSA Carrier Safety (
fmcsa-carrier-safety) - the federal motor-carrier register. - WA AG Complaints (
wa-ag-complaints) - state-level consumer complaints for Washington.