BYTETOOLS

CFPB Consumer Complaints API

Free Consumer Financial Protection Bureau complaint database API with no key: millions of US consumer complaints by product, company, state and issue, with narratives.

No API key requiredHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the CFPB Consumer Complaints API?

The Consumer Financial Protection Bureau publishes its consumer complaint database as a free search API with no key. It exposes millions of complaints about US financial products, filterable by company, product, issue, state and date.

This is one of the largest public datasets about how financial products actually behave in the field: every complaint the CFPB forwards to a company, with the product, the issue, the company's response and — where the consumer consented — their narrative in their own words. Because the underlying store is Elasticsearch, the response arrives in raw ES shape, with `hits.hits[]._source` holding each record and `hits.total.value` the match count.

Two things to know before you build on it. The API rejects any request carrying an `Origin` header outright, so a browser fetch fails at the edge and you must proxy through your own backend. And the dataset describes complaints, not verified findings — a high complaint count reflects volume, customer base size and reporting propensity as much as anything else. Present counts with that context or you will mislead people.

Quick facts

Base URL
https://www.consumerfinance.gov/data-research/consumer-complaints/search/api/v1
Authentication
No key or registration. Requests carrying an Origin header are blocked at the CDN, so calls must be server-side.
Rate limit
No published limit, but large aggregations are slow. Use `no_aggs=true` when you only need records.
Pricing
Free. Published as US open government data.
CORS
Not enabled — call it from your server
Official docs
Read the docs

How to use the CFPB Consumer Complaints API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. Two most recent consumer complaints

GET https://www.consumerfinance.gov/data-research/consumer-complaints/search/api/v1/?size=2&no_aggs=true&field=complaint_what_happened

curl
curl 'https://www.consumerfinance.gov/data-research/consumer-complaints/search/api/v1/?size=2&no_aggs=true&field=complaint_what_happened'
JavaScript (fetch)
const res = await fetch("https://www.consumerfinance.gov/data-research/consumer-complaints/search/api/v1/?size=2&no_aggs=true&field=complaint_what_happened");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://www.consumerfinance.gov/data-research/consumer-complaints/search/api/v1/?size=2&no_aggs=true&field=complaint_what_happened", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "took": 1406,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 17212724,
      "relation": "eq"
    },
    "max_score": null,
    "hits": [
      {
        "_index": "complaint-public-v2",
        "_id": "9999997",
        "_score": 1.0,
        "_source": {
          "product": "Credit reporting or other personal consumer reports",
          "complaint_what_happened": "",
          "date_sent_to_company": "2024-09-03T22:42:56.000Z",
          "issue": "Improper use of your report",
          "sub_product": "Credit reporting",
          "zip_code": "33060",
          "tags": null,
          "has_narrative": false,
          "complaint_id": "9999997",
          "timely": "Yes",
          "company_response": "Closed with non-monetary relief",
          "submitted_via": "Web",
          "company": "TRANSUNION INTERMEDIATE HOLDINGS, INC.",
          "date_received": "2024-09-03T22:42:53.000Z",
          "state": "FL",
          "company_public_response": "Company has responded to the consumer and the CFPB and chooses not to provide a public response",
          "sub_issue": "Reporting company used your report improperly"
        },
        "sort": [
          1.0,
          "9999997"
        ]
      },
      {
        "_index": "complaint-public-v2",
        "_id": "9999996",
        "_score": 1.0,
        "_source": {
          "product": "Credit reporting or other personal consumer reports",
          "complaint_what_happened": "",
          "date_sent_to_company": "2

Parameters

ParameterTypeRequiredDescription
sizequeryOptionalNumber of records to return. 2
no_aggsqueryOptional`true` skips the aggregation buckets, which makes the request substantially faster. true
search_termqueryOptionalFree-text search, usually combined with `field` to choose where to search. overdraft
fieldqueryOptionalWhich field `search_term` applies to, such as `complaint_what_happened` or `all`. complaint_what_happened
company / product / statequeryOptionalExact-match filters. Repeat the parameter for multiple values. TRANSUNION INTERMEDIATE HOLDINGS, INC.
date_received_min / date_received_maxqueryOptionalDate window in `YYYY-MM-DD`. 2026-01-01
has_narrativequeryOptional`true` restricts to complaints where the consumer published a narrative. true

Response fields

hits.total.valueinteger
Number of complaints matching the query, across the whole database.
hits.hits[]._source.complaint_idstring
Stable identifier for the complaint.
hits.hits[]._source.product / sub_productstring
Product taxonomy, such as credit reporting or mortgages.
hits.hits[]._source.issuestring
The issue category the consumer selected.
hits.hits[]._source.companystring
Company the complaint was sent to, in the CFPB's normalised naming.
hits.hits[]._source.company_responsestring
How the company closed it — with explanation, with monetary relief, and so on.
hits.hits[]._source.complaint_what_happenedstring
The consumer's narrative, present only where they consented to publication. Often an empty string.
hits.hits[]._source.state / zip_codestring
Location, with the ZIP partially redacted for privacy.
hits.hits[]._source.date_received / date_sent_to_companystring
Timeline dates as ISO timestamps.
hits.hits[]._source.timelystring
Whether the company responded within the required window.

What you can build with the CFPB Consumer Complaints API

  • Search complaint narratives for a recurring product problem
  • Compare complaint volumes across companies within a product category
  • Track complaint trends in a state over time
  • Build a research dataset on consumer financial product issues

Common errors and how to fix them

403 Access Denied

The request carried an `Origin` header.

Fix: The CDN blocks cross-origin requests outright. Call it server-side; a browser fetch cannot work even with a proxy header.

Very slow response

Aggregations are being computed.

Fix: Add `no_aggs=true` when you only need records. Aggregations over millions of documents are expensive.

Empty narratives

Most complaints have no published narrative.

Fix: Only complaints where the consumer opted in carry text. Filter with `has_narrative=true` if you need it.

CFPB Consumer Complaints API — frequently asked questions

Is the CFPB complaint database free to use?

Yes. It is US open government data with no key or registration. Requests must be made server-side because the CDN blocks anything carrying an Origin header.

Are complaints verified before publication?

No. The CFPB publishes complaints it forwards to companies, along with the company's response. A complaint is an allegation, not a finding, and volume reflects customer base size as much as product quality.

Why is complaint_what_happened usually empty?

The narrative is published only when the consumer explicitly consents. Most do not, so the field is an empty string on the majority of records. Use `has_narrative=true` to filter.

Can I call this from browser JavaScript?

No. The endpoint returns 403 to any request carrying an Origin header, so a direct fetch from front-end code always fails. Proxy it through your own server.

Tools that pair with this API

CFPB Consumer Complaints is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.