CFPB Consumer Complaints - US Financial avatar

CFPB Consumer Complaints - US Financial

Pricing

$0.10 / 1,000 cfpb consumer complaint records

Go to Apify Store
CFPB Consumer Complaints - US Financial

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

Wenhao Yang

Maintained by Community

Actor 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

ModeReturns
rows (default)complaint records matching your filters, newest received first
aggregateone 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 reports 12,173,409; Credit reporting, credit repair services, or other personal consumer reports 2,163,770; Debt collection 1,190,725; Mortgage 459,987; Checking or savings account 394,828; Credit card 342,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 reporting 14,269,943. 235,275 complaints (1.3%) carry no sub-product at all.
  • Issue - 178 values. Incorrect information on your report 7,998,907; Improper use of your report 3,390,266; Problem with a company's investigation into an existing problem 2,304,573.
  • State - 63 values including territories and military codes. TX 2,441,767; FL 2,428,692; CA 1,758,940; GA 1,307,037; NY 1,026,335.
  • Company response - 8 values. Closed with explanation 10,867,098; Closed with non-monetary relief 5,946,287; In progress 623,834; Closed with monetary relief 218,246. Note Closed (17,611) is a value of its own, not a truncation of the longer ones.
  • Timely - Yes 17,621,023, No 108,699.
  • Submitted via - Web 17,093,819; Referral 278,604; Phone 220,732; Postal mail 110,500; Fax 25,644; Email 423.
  • Tags - the Bureau's special-population markers: Servicemember 511,999; Older American 234,545; both 58,798.

The three big credit bureaus

company matches the Bureau's own normalized company name exactly:

CompanyComplaints
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 frm offset - reject it and you get frm 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 company aggregation is truncated - it hands back 6,500 buckets and quietly accounts for another 1,830 companies under "other". company is 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_issue and consumer_disputed are accepted and ignored - each returns the full 17.7-million-row register. (field is 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. subProduct survives as an output field and as a group-by dimension, flattened out of the nested source aggregation.
  • timely=No is 108,699 complaints, not zero. The timely field 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.

  • 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.