# CFPB Consumer Complaints — Vendor Risk & Due Diligence (`devone-studio/cfpb-consumer-complaints-api`) Actor

US Consumer Financial Protection Bureau Consumer Complaint Database — 18M+ complaints since 2011. Search by company, product, state, date. Public domain.

- **URL**: https://apify.com/devone-studio/cfpb-consumer-complaints-api.md
- **Developed by:** [Ti Gg](https://apify.com/devone-studio) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 per results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## CFPB Consumer Complaints API — Vendor Risk and Due Diligence

Search the US Consumer Financial Protection Bureau Consumer Complaint
Database — **18M+ complaints since 2011**. Filter by company, product,
state, date, or submitted-via. Returns denormalised records
(complaint ID, narrative, amount, response, resolution). Built for
**vendor risk teams**, **consumer rights organisations**, and **AI
agents** that need evidence of bank/customer behaviour.

### Free trial

A free Apify account gives you about **5 USD of monthly credits**, enough
to pull thousands of complaints and inspect the JSON schema before
paying.

### Use cases

1. **Vendor due diligence** — given a company name (e.g. `"WELLS FARGO
   & COMPANY"`), pull last 12 months of complaints and compute
   `is_timely` and `is_resolved` rates.
2. **Geographic risk** — pull complaints in state `TX`, group by
   `product` and `sub_product`, and chart complaint share by issuer.
3. **Real-time compliance feed** — daily cron filtered to
   `is_recent_30_days=true` and a watch list of issuers; Slack-alert on
   any `company_response` containing `"monetary relief"`.

### Input

```json
{
  "company_name_contains": "WELLS FARGO",
  "state": "TX",
  "product": "Checking or savings account",
  "date_received_from": "2024-01-01",
  "date_received_to": "2026-12-31",
  "max_results": 50
}
```

| Field | Type | Default | Description |
|---|---|---|---|
| `company_name_contains` | string | `""` | Partial company name match (case-sensitive, uppercase). |
| `state` | string | `""` | 2-letter US state code (e.g. `TX`, `CA`). |
| `product` | string | `""` | `Checking or savings account`, `Mortgage`, `Debt collection`, … |
| `sub_product` | string | `""` | Narrow by sub-product (e.g. `Checking account`). |
| `issue` | string | `""` | Filter by issue category. |
| `date_received_from` | string | `""` | Earliest `date_received` (`YYYY-MM-DD`). |
| `date_received_to` | string | `""` | Latest `date_received`. |
| `has_public_response` | boolean | `false` | Keep only records with a public company response. |
| `consumer_disputed` | boolean | `false` | Keep only records disputed by the consumer. |
| `max_results` | integer | `50` | Cap on returned records (1–200). |

### Output (real run)

```json
[
  {
    "complaint_id": "28954970",
    "product": "Checking or savings account",
    "sub_product": "Checking account",
    "issue": "Managing an account",
    "sub_issue": "Deposits and withdrawals",
    "company": "WELLS FARGO & COMPANY",
    "state": "TX",
    "zip_code": "75114",
    "tags": "",
    "timely": "Yes",
    "company_response": "Closed with explanation",
    "company_public_response": "Company has responded to the consumer and the CFPB and chooses not to provide a public response",
    "consumer_disputed": "No",
    "date_received": "2026-09-12",
    "date_received_year": 2026,
    "date_received_month": "2026-09",
    "date_sent_to_company": "2026-09-12",
    "submitted_via": "Web",
    "response_time_days": 12,
    "response_time_hours": 288,
    "is_timely": true,
    "is_resolved": true,
    "is_no_response": false,
    "is_explanation": true,
    "is_recent_30_days": true,
    "is_recent_7_days": false,
    "has_public_response": false
  }
]
```

| Field | Type | Description |
|---|---|---|
| `complaint_id` | string | CFPB complaint identifier. |
| `product` / `sub_product` | string | Product taxonomy (highest level, then sub). |
| `issue` / `sub_issue` | string | Specific issue reported. |
| `company` | string | Issuer name as filed. |
| `state` / `zip_code` | string | Consumer location. |
| `tags` | string | Optional tags (`Servicemember`, `Older American`, …). |
| `timely` | string | Whether the company responded in time. |
| `company_response` | string | `Closed with explanation`, `Monetary relief`, … |
| `company_public_response` | string | Public statement on the company website (or null). |
| `consumer_disputed` | string | Whether the consumer disputed the resolution. |
| `date_received` | string | Date the CFPB received the complaint. |
| `date_received_year` / `date_received_month` | integer / string | Helper dates. |
| `date_sent_to_company` | string | When CFPB forwarded to the company. |
| `submitted_via` | string | `Web`, `Phone`, `Referral`, … |
| `response_time_days` / `response_time_hours` | integer | Time to first company response. |
| `is_timely` / `is_resolved` / `is_no_response` / `is_explanation` | boolean | Boolean helpers. |
| `is_recent_30_days` / `is_recent_7_days` | boolean | Recency flags. |
| `has_public_response` | boolean | True when `company_public_response` is present. |

### Pricing (pay-per-event)

- **No subscription.** Free monthly credits apply first.
- **1 result = $0.001 USD** (about $1 per 1 000 results).
- Charged per item returned in the dataset; failed runs are not charged.

### Source, licence, limits

- Source: CFPB Consumer Complaint Database at
  <https://www.consumerfinance.gov/data-research/consumer-complaints/>.
- Licence: US Government work, public domain (17 U.S.C. § 105).
- Update frequency: complaints are added daily by the CFPB; this Actor
  reflects the upstream dataset at the moment of the run.
- Limits: the CFPB caps each page at 10 000 complaints; we paginate up
  to `max_results`. Old complaints (pre-2015) may have sparser fields.

### FAQ

**Why does `state` sometimes look lowercase?**
Some legacy records had inconsistent casing; treat as case-insensitive
when filtering.

**Why does `consumer_disputed` come back as "No"?**
CFPB stores disputed as a string flag; the helper `consumer_disputed`
mirrors that. Use the string for direct comparison.

**Can I get the consumer's narrative?**
The full complaint narrative is downloadable from the CFPB; this Actor
distributes denormalised structured fields. Combine with their API
endpoint for narrative retrieval.

**Why is the company name uppercase?**
CFPB stores issuer names as uppercase. Convert with `.title()` for
display.

**How do I count "monetary relief" responses?**
Filter where `company_response == "Closed with monetary relief"`.
Group by `company` to rank.

**Is there a "disputed" rate I can compute per company?**
Yes — group by `company` and compute `consumer_disputed == "Yes"` /
total complaints per company.

### Other Actors from DevOne-Studio

- **[ted-tenders-api](https://apify.com/devone-studio/ted-tenders-api)** — TED (Tenders Electronic Daily) EU public procurement search.
- **[pdf-to-text-api](https://apify.com/devone-studio/pdf-to-text-api)** — PDF to text + tables extraction via pdfplumber, no external calls.
- **[pubmed-articles-api](https://apify.com/devone-studio/pubmed-articles-api)** — NCBI PubMed biomedical literature with MeSH/DOI/year filters.
- **[federal-register-api](https://apify.com/devone-studio/federal-register-api)** — US federal agency rules, proposed rules, notices, presidential docs.
- **[sec-company-tickers](https://apify.com/devone-studio/sec-company-tickers)** — Resolve SEC CIK from ticker or company name (10,400+ issuers).
- **[sec-edgar-fulltext-search-api](https://apify.com/devone-studio/sec-edgar-fulltext-search-api)** — Full-text search across 35M+ SEC EDGAR filings and exhibits.
- **[sec-edgar-xbrl-frames-api](https://apify.com/devone-studio/sec-edgar-xbrl-frames-api)** — XBRL frames (Revenues, Assets, NetIncomeLoss) for ~6000 US issuers.
- **[nhtsa-safety-ratings-api](https://apify.com/devone-studio/nhtsa-safety-ratings-api)** — NHTSA NCAP 5-star vehicle safety ratings.
- **[openfda-udi-api](https://apify.com/devone-studio/openfda-udi-api)** — FDA Unique Device Identifier database by device/manufacturer.
- **[eia-state-electricity-api](https://apify.com/devone-studio/eia-state-electricity-api)** — US state-level electricity generation and consumption, 1990-2025.

### Changelog

- **2026-10-12** — SEO metadata (seoTitle, seoDescription); README rewritten with real output sample, FAQ, cross-links.
- **2026-10-07** — Pricing switched to Apify pay-per-event (`$0.001` per dataset item).
- **2026-09-30** — Initial public release on the Apify Store.

# Actor input Schema

## `search_term` (type: `string`):

Free-text search term (matches across multiple fields). Empty = no filter.

## `state` (type: `string`):

Filter by US state (2-letter code).

## `zip_code` (type: `string`):

Filter by 5-digit ZIP code.

## `product` (type: `string`):

Filter by product category.

## `sub_product` (type: `string`):

Filter by sub-product.

## `issue` (type: `string`):

Filter by issue.

## `company` (type: `string`):

Filter by company (exact match, uppercase).

## `timely` (type: `string`):

Filter by timely flag: 'Yes' or 'No'.

## `company_response` (type: `string`):

Filter by company response (e.g. 'Closed with explanation').

## `submitted_via` (type: `string`):

Filter by submission channel: 'Web', 'Phone', 'Referral', etc.

## `tag` (type: `string`):

Filter by demographic tag.

## `date_received_min` (type: `string`):

Filter complaints received on or after this date.

## `date_received_max` (type: `string`):

Filter complaints received on or before this date.

## `sort_by` (type: `string`):

date_received_desc, date_received_asc, complaint_id_desc.

## `max_results` (type: `integer`):

Cap on returned rows (1-200).

## `include_derived` (type: `boolean`):

Add per-row derived fields.

## `include_metadata` (type: `boolean`):

Prepend a `_meta: true` row with run metadata.

## Actor input object example

```json
{
  "search_term": "",
  "state": "",
  "zip_code": "",
  "product": "",
  "sub_product": "",
  "issue": "",
  "company": "",
  "timely": "",
  "company_response": "",
  "submitted_via": "",
  "tag": "",
  "date_received_min": "",
  "date_received_max": "",
  "sort_by": "date_received_desc",
  "max_results": 50,
  "include_derived": true,
  "include_metadata": true
}
```

# Actor output Schema

## `results` (type: `string`):

All results of the run, as JSON from the default dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("devone-studio/cfpb-consumer-complaints-api").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("devone-studio/cfpb-consumer-complaints-api").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call devone-studio/cfpb-consumer-complaints-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,devone-studio/cfpb-consumer-complaints-api"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/1tY3xW4Z1hdynvejg/builds/8mqaujg0g8se6WZ0j/openapi.json
