# Black Cat Complaints Scraper - China Consumer Complaints (`scrapewise/black-cat-complaints-scraper`) Actor

Scrape Black Cat (黑猫投诉, tousu.sina.com.cn), China's largest consumer complaint platform, without login: every complaint of a company with title, summary, demands, issues, amount, status and date, plus company totals. English brand names, word filters, only-new mode.

- **URL**: https://apify.com/scrapewise/black-cat-complaints-scraper.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.75 / 1,000 complaint delivereds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Black Cat Complaints Scraper

Black Cat Complaints Scraper turns **Black Cat (黑猫投诉, tousu.sina.com.cn)**, China's largest consumer complaint platform run by Sina, into clean JSON, CSV or Excel, **without login or cookies**. You can use it three ways:

- **Complaints of a company:** give a company name, id or link and get each complaint with its title, summary, the consumer's demands, the issues tagged, the amount in CNY, the status and the date.
- **Company search:** find every company that matches a keyword, with its complaint, reply and resolution totals, all time and in the last 30 days.
- **Latest feed:** the newest complaints across all companies.

**US$ 15.00 per 1,000 complaints or company rows. No monthly fee, no start fee. Error rows are free.**

### What it fixes

- **English brand names work.** Black Cat's own company search only knows Chinese names, so `Xiaomi`, `Tesla` or
  `Meituan` find nothing there. Here about 80 common brands are translated for you (Xiaomi to 小米, Tesla to 特斯拉,
  Meituan to 美团...), and an unknown English name gives a free row telling you to use the Chinese name, id or link.
- **Filter complaints by words without a login.** Black Cat's text search needs an account; `includeKeywords` and
  `excludeKeywords` filter each company's complaints by title, summary, issues and demands, and what is left out is
  not charged.
- **Daily monitoring without paying twice.** `onlyNew` remembers what each company already returned and delivers only
  new complaints; a quiet day costs nothing.
- **A real date window.** `publishedAfter` and `publishedBefore` (or a number of days), and reading stops at the first
  complaint older than the window.
- **Every complaint when you need it** (`maxComplaintsPerCompany: 0`), and a cap for the whole run (`maxItems`) that
  doubles as a spend cap.

### At a glance

- **Price per 1,000 complaints:** US$ 15.00, no run start fee
- **Company totals:** Complaints, replied and resolved, all time and last 30 days
- **Filters:** Status (all, replied by the company, resolved), date window, words in the complaint
- **English brand names:** Yes, about 80 common brands
- **Only new complaints since the last run (`onlyNew`):** Yes
- **Depth:** Every complaint a company received, newest first (Pinduoduo alone has more than 1.8 million)
- **Login or cookies:** None
- **Error rows:** Free, with an `errorCode`

### Real rows

Run on 2026-09-30 in the Apify cloud.

**Company row** for `拼多多` (Pinduoduo):

```json
{ "companyName": "拼多多", "companyTotalComplaints": 1885159, "companyTotalReplied": 778852, "companyTotalResolved": 547961, "companyComplaints30d": 20825, "companyResolved30d": 2303 }
```

**One of its complaints** (summary shortened):

```json
{
  "type": "complaint",
  "id": "17401966378",
  "url": "https://tousu.sina.com.cn/complaint/view/17401966378/",
  "title": "拼多多购买二类呼吸机，商家维修超期，平台偏袒商家拒不退款",
  "summary": "一、事件事实经过 本人于7月31日在拼多多平台购买二类医疗器械：可孚C11呼吸机，收货当场即发现储水盒卡合不严的产品瑕疵...",
  "createdAt": "2026-09-30T15:54:35Z",
  "appeal": ["退货退款"],
  "issues": ["退货不退款", "商品破损", "客服态度差", "响应时间长"],
  "status": "company replied",
  "companyId": "1003609",
  "companyName": "拼多多客户服务",
  "companyTotalComplaints": 1885159
}
```

**Company search** for `航空` (airlines), in the same run: 20 companies came back. The most complained about in the last 30 days were 春秋航空 (Spring Airlines, 309 complaints, 22 resolved), 南方航空 (China Southern, 243, 23 resolved) and 东方航空 (China Eastern, 210, 21 resolved).

### What you can do with it

- **Brand and reputation monitoring in China:** run daily with `publishedAfter: 1` on your brand and your competitors.
- **Compare a whole sector:** search `银行` (banks), `保险` (insurance), `外卖` (food delivery) or `航空` (airlines) and rank companies by complaints and resolution rate.
- **Product and service research:** what Chinese consumers complain about, what they ask for (refund, apology, compensation) and how much money is involved.
- **Due diligence and investment research:** complaint volume and resolution trends of a Chinese company before a deal.
- **Datasets for AI and sentiment analysis:** clean Chinese text with issue tags and status.

### Input

| Field | What it does |
|---|---|
| `companies` | Company names as on Black Cat (`小米`, `拼多多`, `京东`, `美团`), company ids (`couid`) or company page links |
| `companySearch` | Keywords; returns matching companies with their totals |
| `latestFeed` | The newest complaints across all companies |
| `status` | `latest` (all, newest first), `replied` or `completed` (resolved) |
| `publishedAfter`, `publishedBefore` | `YYYY-MM-DD`, or a number of days for `publishedAfter` |
| `includeKeywords`, `excludeKeywords` | Keep or drop complaints that mention these words (`退款`, `质量`, `客服`) |
| `onlyNew` | Only complaints not delivered in your earlier runs |
| `maxComplaintsPerCompany`, `maxCompaniesPerSearch` | Limits per input (`0` = every complaint) |
| `maxItems` | Cap for the whole run, complaints and company rows together |
| `includeCompanyProfile` | One company row for each company given by name (default on) |

```json
{ "companies": ["Pinduoduo", "京东"], "companySearch": ["外卖"], "status": "latest", "publishedAfter": "30", "maxComplaintsPerCompany": 500 }
```

### Switching from another complaints or brand monitoring actor? Your existing input works

Paste the input you already use. These names and values are read as they are:

| You may already send | Read as |
|---|---|
| `companies`, `startUrls` (company links), `blackCatCompanyIds`, `complaintCompanyIds` | companies |
| `brandKeyword`, `competitorBrands`, `searchAliases` | companies (each one is looked up) |
| `statusFilter`: `LATEST`, `ANSWERED`, `SOLVED`, `EVALUATED` | `status`: all, replied, resolved |
| `solvedOnly`, `withReplyOnly` | `status`: resolved, replied |
| `dateFrom`, `dateTo`, `lookbackDays` | `publishedAfter`, `publishedBefore` |
| `maxMentionsPerPlatform` | `maxComplaintsPerCompany` |
| `maxComplaintsPerCompany: 0` | every complaint |
| `maxItems` | cap for the whole run |
| `includeKeywords`, `excludeKeywords` | the same |
| `incrementalMode`, `deltaMode` | `onlyNew` |

Options for other sites or other outputs (`platforms`, `sentimentAnalysis`, `compact`, `descriptionFormat`,
`includeInteractions`, notification webhooks...) are ignored with a note in the log. A single complaint's page needs
a Black Cat login, so a complaint link gives a free `INVALID_INPUT` row; give its company instead.

### Output fields

- **Complaint rows (`type: "complaint"`):** `id`, `url`, `title`, `summary`, `createdAt`, `appeal` (what the consumer asks for), `issues` (tags), `status`, `statusCode`, `amountCny`, `upvotes`, `comments`, `shares`, `companyId`, `companyName`, `companyUrl`, `companyTotalComplaints`, `companyTotalResolved`, `source`.
- **Company rows (`type: "company"`):** `companyId`, `companyName`, `companyUrl`, `companyTotalComplaints`, `companyTotalReplied`, `companyTotalResolved`, `companyComplaints30d`, `companyReplied30d`, `companyResolved30d`.

The consumer's nickname (generated by the site) and the comment threads are not collected.

#### Error codes (never charged)

| errorCode | Meaning |
|---|---|
| `COMPANY_NOT_FOUND` | No company with this name or keyword on Black Cat |
| `NO_RESULTS` | No complaint for this company, status and date filter |
| `INVALID_INPUT` | A value the Actor does not understand |
| `BLOCKED` | Black Cat did not answer after retries; run again |
| `NOT_REACHED`, `UNEXPECTED` | The run timeout arrived, or something unforeseen broke; only that input is lost |

### Pricing

| Event | Per 1,000 |
|---|---|
| Complaint delivered | US$ 15.00 |
| Company row delivered | US$ 15.00 |

500 complaints of a company cost US$ 7.50. Duplicates, error rows, complaints left out by the word filters and complaints already delivered (`onlyNew`) are free, and there is no Apify compute bill on top.

### Limitations

- Black Cat's keyword search over complaint text and the full complaint page need a logged-in account, so complaints are read by company (or from the latest feed), the summary is the one Black Cat shows in its lists, and the word filters run on that text.
- Text is in Chinese, as published.
- This Actor reads public pages only and respects the site's terms.

### FAQ

**Do I need a Black Cat (Sina) account or cookies?**
No. Complaints are read from public company pages and the latest feed, without login or cookies. A single complaint's page needs a login, so a complaint link gives a free `INVALID_INPUT` row; give its company instead.

**What does a run cost?**
US$ 15.00 per 1,000 complaints or company rows, with no run start fee. 500 complaints of a company cost US$ 7.50. Duplicates, error rows, complaints left out by the word filters and complaints already delivered with `onlyNew` are free, and there is no Apify compute bill on top.

**Can I use English brand names?**
Yes, for about 80 common brands (`Xiaomi`, `Tesla`, `Meituan`...), which are translated to their Chinese names. An unknown English name gives a free row telling you to use the Chinese name, company id or company page link in `companies`.

**How do I monitor a company every day and get only new complaints?**
Schedule the Actor and turn on `onlyNew`. It remembers which complaints each company already returned, in a named key-value store in your account (`black-cat-complaints-state`), and delivers only complaints not seen before, so a quiet day costs nothing. You can also use `publishedAfter` with a number of days, for example `1`.

**How do I filter complaints by words or limit spending?**
Use `includeKeywords` and `excludeKeywords` (matched on title, summary, issues and demands), `status` for replied or resolved complaints, and `publishedAfter` / `publishedBefore` for a date window. `maxComplaintsPerCompany` limits each company (`0` = every complaint) and `maxItems` caps the whole run, which also works as a spend cap.

**Is the full complaint text included?**
The summary is the one Black Cat shows in its lists, in Chinese as published, because the full complaint page needs a logged-in account. The consumer's nickname and the comment threads are not collected.

### Changelog

- **2026-10-17:** FAQ in this page.
- **2026-10-08:** English brand names, word filters, date window with `publishedBefore`, `onlyNew` for daily monitoring, `maxItems` for the whole run, `0` = every complaint, and the input names of other complaints and brand monitoring actors.
- **2026-09-30, 0.1:** first release. Complaints by company with status and date filters, company search with totals, latest feed, free error rows.

# Actor input Schema

## `companies` (type: `array`):

Company names as on Black Cat (小米, 拼多多, 京东, 美团), company ids (couid) or company page links. Returns the complaints the company received, newest first.

## `companySearch` (type: `array`):

Keywords (银行, 保险, 外卖, 航空). Returns the matching companies with their complaint, reply and resolution totals, all time and last 30 days: good for comparing brands.

## `latestFeed` (type: `boolean`):

The newest complaints across all companies.

## `status` (type: `string`):

Which list of the company to read.

## `publishedAfter` (type: `string`):

Only complaints published on or after this date: YYYY-MM-DD, or a number of days (30 = last 30 days).

## `publishedBefore` (type: `string`):

Only complaints published on or before this date (YYYY-MM-DD). With publishedAfter it makes a date window.

## `includeKeywords` (type: `array`):

Keep only complaints whose title, summary, issues or demands contain at least one of these words (for example 退款, 质量, 客服). Black Cat's own text search needs a login, so this filter runs here; skipped complaints are not charged.

## `excludeKeywords` (type: `array`):

Drop complaints that contain any of these words (not charged).

## `onlyNew` (type: `boolean`):

For scheduled runs. Remembers which complaints each company already returned, in a named key-value store in your account ('black-cat-complaints-state'), and delivers only complaints not seen before. Already delivered complaints are not charged. Delete the store to start over.

## `maxComplaintsPerCompany` (type: `integer`):

Upper limit per company (and for the latest feed). 0 = every complaint the company has (big brands have hundreds of thousands).

## `maxCompaniesPerSearch` (type: `integer`):

Upper limit per company search keyword.

## `maxItems` (type: `integer`):

Optional cap for the whole run, complaints and company rows together. Also works as a spend cap. Empty or 0 = no cap.

## `includeCompanyProfile` (type: `boolean`):

One row with the company's totals when a company is given by name.

## `proxyConfiguration` (type: `object`):

Apify Proxy is recommended.

## Actor input object example

```json
{
  "companies": [
    "小米"
  ],
  "latestFeed": false,
  "status": "latest",
  "onlyNew": false,
  "maxComplaintsPerCompany": 100,
  "maxCompaniesPerSearch": 20,
  "includeCompanyProfile": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (type: `string`):

No description

# 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 = {
    "companies": [
        "小米"
    ],
    "maxComplaintsPerCompany": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/black-cat-complaints-scraper").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 = {
    "companies": ["小米"],
    "maxComplaintsPerCompany": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/black-cat-complaints-scraper").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 '{
  "companies": [
    "小米"
  ],
  "maxComplaintsPerCompany": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/black-cat-complaints-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/black-cat-complaints-scraper"
        }
    }
}
```

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/MxyKqwgAkjFILW6LA/builds/ec02l3hGDejiZ3u7n/openapi.json
