CFPB consumer complaints - search API, normalised
Pricing
from $5.00 / 1,000 records
CFPB consumer complaints - search API, normalised
Search the CFPB Consumer Complaint Database (public API, no key) and get one normalised row per complaint: product, issue, company, state, ZIP, company response, timeliness, tags, narrative and link. Filter by term, company, product, state, date range and narrative. Default: last 30 days.
Pricing
from $5.00 / 1,000 records
Rating
0.0
(0)
Developer
RetrainMap Team
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
CFPB consumer complaints — search API, normalised
One row per complaint from the Consumer Financial Protection Bureau's Consumer Complaint
Database (17.5 million complaints on 2026-09-04), read live through the CFPB's public search
API — no key, no scraping. Filter by search term, company, product / sub-product, state, date
received and whether a consumer narrative was published; get the complaint id, dates, product,
issue, company, state, ZIP, company response, timeliness, channel, tags, the narrative (trimmed
to 5,000 characters) and the link to the complaint's page — normalised, with the free-text
product, sub_product and company inputs resolved against the database's own published
names so you do not have to know the exact spelling.
Complaints are unverified. The CFPB publishes complaints as consumers submitted them after the company responds or after 15 days; neither the CFPB nor this Actor verifies the facts alleged.
Data source and status
| Publisher | Consumer Financial Protection Bureau (CFPB), Consumer Complaint Database |
| Site | https://www.consumerfinance.gov/data-research/consumer-complaints/ |
| API read by this Actor | https://www.consumerfinance.gov/data-research/consumer-complaints/search/api/v1/ — plain GET requests; docs at https://cfpb.github.io/api/ccdb/ |
| How it reads | One request resolves product / company names from the API's aggregations, then pages of up to 500 complaints, newest first, keyset-paged with search_after (the API's offset paging stops at 10,000; this does not) |
| Refresh cadence | The CFPB refreshes the database daily (the API's _meta.last_updated, also stored in the run summary). The Actor reads live on every run; fetched_at is the fetch time |
| Copyright | Works of the United States Government are not subject to copyright in the U.S. (17 U.S.C. §105); the API additionally labels the data CC0. Please cite the CFPB as the source |
| Known caveats | Complaint narratives appear only when the consumer consented and after CFPB scrubbing of personal information; consumer_consent_provided and consumer_disputed are not returned by the search API and are therefore not in the rows (they are in the CFPB's CSV download). Company names must be the published ones — the Actor resolves your text against them and lists the names it used in the run summary |
Identification: every request carries the User-Agent
RetrainMap data actor info@steelyardclinical.comFrom: header. The
CFPB publishes no rate limit; the Actor makes at most one request per 500 ms by default.
Input
| Field | Type | Meaning |
|---|---|---|
search_term | string | Optional full-text search over all fields (phrases in double quotes) |
company | string | Optional. Word-matched, case-insensitive, against published company names; every match is filtered on exactly |
product | string | Optional. A published product name equal to, or starting with, your text. Credit reporting selects the current Credit reporting or other personal consumer reports plus the two older credit-reporting products |
sub_product | string | Optional. Same matching, within the matched products (or all products) |
state | string | Optional two-letter consumer state, e.g. NC |
date_received_from / date_received_to | YYYY-MM-DD | Optional. Both empty = the last 30 days |
has_narrative | boolean | On = only complaints with a published narrative |
max_records | integer | Default 500. Stop after this many rows |
request_interval_ms | integer | Default 500 (floor 250) |
contact_email | string | Sent in the From: header |
Example — Equifax complaints mentioning identity theft, with narratives, since June 2026:
{ "company": "Equifax", "search_term": "identity theft", "has_narrative": true,"date_received_from": "2026-06-01", "max_records": 500 }
An unknown product or company fails the run with a message that lists the published names.
Output (dataset row)
complaint_id, date_received, product, sub_product, issue, sub_issue, company,
state, zip (as published — the CFPB masks ZIPs to XXXXX / first three digits in some
cases), company_response, company_public_response, timely, submitted_via,
date_sent_to_company, tags (e.g. Older American, Servicemember), has_narrative,
complaint_narrative (first 5,000 characters, null when none was published),
narrative_truncated, cfpb_url, fetched_at.
Dates are YYYY-MM-DD as published. A run summary (the API's match count, the resolved
product / company filters, the database's last_updated, request count) is stored as
RUN_SUMMARY in the run's key-value store.
Pricing (pay per event)
| Event | Price |
|---|---|
run-start — once per run | $0.10 |
record — per row written | $0.005 |
A 500-row pull costs $2.60. Rows stop when your run's maximum charge is reached; the run summary says so.
Operator
Steelyard Ventures LLC (RetrainMap) — info@steelyardclinical.com. The Actor writes only to its own dataset and key-value store; it stores no credentials and sends nothing else.