# Reclame Aqui Scraper — Complaints & Company Reputation (`crawloop/reclameaqui-scraper`) Actor

Scrape public Reclame Aqui complaints and company reputation for Brazilian brands. Each row includes the reputation score, RA status, response and resolution rates, CNPJ, complaint text, status, and city.

- **URL**: https://apify.com/crawloop/reclameaqui-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** Lead generation, E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $25.00 / 1,000 complaints

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## Reclame Aqui Scraper — Complaints & Company Reputation

> **Disclaimer:** Unofficial tool — not affiliated with, sponsored by, or endorsed by Reclame Aqui or its affiliates. Data is read from publicly accessible company reputation profiles and complaint listings only. No login. You are responsible for complying with applicable law (including GDPR and LGPD where personal data appears) and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.

Scrape **Reclame Aqui complaints and company reputation** into a JSON dataset: reputation score, RA status, response rate, resolution rate, CNPJ, complaint title, text, status, date, city, and state. Use it as a **Reclame Aqui API alternative** from Python, Node.js, or cURL for brand monitoring, supplier checks, and customer-experience research in Brazil.

**Best for:** reputation scorecards, public complaint exports, and scheduled monitors that save only new complaint ids.

### Reputation suite

| Actor | What it collects |
| :--- | :--- |
| Reclame Aqui Scraper ◄── you are here | Brazilian company score, response rate, and public complaints |
| [Trustpilot Scraper](https://apify.com/crawloop/trustpilot-scraper) | TrustScore, star ratings, and review text |

### When to use this Actor

- A **Reclame Aqui scraper** run for one brand or a list of slugs
- Supplier or marketplace checks that need the public score, RA status, and recent complaint text
- A scheduled **complaint monitor** that skips ids already saved
- JSON or CSV for a BI tool or an AI assistant via Apify MCP

### When not to use this Actor

- The logged-in company inbox, Hugme, or any reply action
- Private consumer contact details — emails and IPs on the payload are not saved
- Review sites outside this reputation pair (use Trustpilot for that brand’s international reviews)

### Key features

- Company slug, company name, or `/empresa/` URL
- One reputation row: score, RA status, solved percent, answered percent, deal-again percent, CNPJ, segment
- Complaint rows: title, description, status, date, city, state, problem type, and reply text when the list includes it
- Optional date window and status filter
- Monitor mode stores seen complaint ids in a named key-value store and writes zero rows on a quiet tick
- HTTP only, 256 MB. A direct request is tried first. If the platform IP is challenged, the run retries through residential proxy.

### Input

| Field | Default | What it does |
| :--- | :--- | :--- |
| `companies` | `nubank` | Slug, name, or `/empresa/` URL |
| `startUrls` | empty | Extra company URLs |
| `maxComplaintsPerCompany` | 20 | Complaint cap per company. `0` keeps the reputation row only |
| `maxItems` | 50 | Cap across company and complaint rows |
| `includeCompanyProfile` | true | Save the reputation row. Off while monitor mode is on |
| `scrapeComplaints` | true | Save complaint rows |
| `status` | `LATEST` | `ANSWERED`, `NOT_ANSWERED`, or `EVALUATED` to filter the list |
| `dateFrom` / `dateTo` | empty | `YYYY-MM-DD` window on the complaint created date |
| `monitorMode` | false | Save only new complaint ids |
| `monitorStateStore` | `reclameaqui-monitor` | Named store for ids already seen |
| `proxyConfiguration` | off | Optional Apify proxy. Leave off unless you want to force a proxy. |

```json
{
  "companies": ["nubank"],
  "maxComplaintsPerCompany": 20,
  "maxItems": 50,
  "includeCompanyProfile": true,
  "scrapeComplaints": true,
  "status": "LATEST",
  "monitorMode": false
}
```

### Output

Each dataset item is either a `company` row or a `complaint` row.

| Field | Company | Complaint |
| :--- | :--- | :--- |
| `recordType` | `company` | `complaint` |
| `companyName`, `shortname`, `url` | yes | yes |
| `finalScore`, `raStatus`, `solvedPercent`, `answeredPercent` | yes | |
| `cnpj`, `segment`, `complainCount` | yes | |
| `complaintId`, `title`, `description`, `status`, `created` | | yes |
| `userCity`, `userState`, `problemType` | | yes |
| `interactions` | | reply text when the list includes it |

```json
{
  "recordType": "company",
  "companyName": "Nubank",
  "shortname": "nubank",
  "finalScore": 8.7,
  "raStatus": "RA1000",
  "solvedPercent": 92.3,
  "answeredPercent": 99.7,
  "cnpj": "18236120000158",
  "url": "https://www.reclameaqui.com.br/empresa/nubank/"
}
```

```json
{
  "recordType": "complaint",
  "complaintId": "M5CNw4kipwPTxkOc",
  "title": "Cobranca nao reconhecida",
  "status": "ANSWERED",
  "created": "2026-09-20T10:00:00",
  "userCity": "Sao Paulo",
  "userState": "SP",
  "companyName": "Nubank",
  "url": "https://www.reclameaqui.com.br/nubank/cobranca-nao-reconhecida_M5CNw4kipwPTxkOc/"
}
```

### Use cases

- Weekly reputation check for a marketplace seller list: score, response rate, and the newest complaints
- Supplier onboarding: CNPJ plus the public RA status before a contract
- Customer-experience export of complaint text for a single brand, filtered to answered or evaluated items
- A scheduler tick that stores seen ids and stays empty until a new complaint appears

### Integration examples

Replace `APIFY_TOKEN` with your Apify token. The actor id is `crawloop/reclameaqui-scraper`.

#### Node.js

```javascript
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("crawloop/reclameaqui-scraper").call({
  companies: ["nubank"],
  maxComplaintsPerCompany: 20,
  includeCompanyProfile: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("crawloop/reclameaqui-scraper").call(run_input={
    "companies": ["nubank"],
    "maxComplaintsPerCompany": 20,
    "includeCompanyProfile": True,
})
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
print(len(items))
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~reclameaqui-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"companies\":[\"nubank\"],\"maxComplaintsPerCompany\":20}"
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp).
Connect your Apify account, then call this Actor by its name `crawloop/reclameaqui-scraper`.

Example prompts:

- "Run Reclame Aqui Scraper for nubank and return the reputation score plus the 20 newest complaints as JSON"
- "Scrape Reclame Aqui complaints for magazine-luiza-loja-online created this month and summarize the problem types"
- "Chain Reclame Aqui Scraper for the Brazilian score, then Trustpilot Scraper for the same brand’s international reviews"

### Suite next step

After the Brazilian score and complaint text, run [Trustpilot Scraper](https://apify.com/crawloop/trustpilot-scraper) for the same brand’s TrustScore and review text outside Brazil.

### FAQ

**Does this log into Reclame Aqui?**
No. It reads public company profiles and public complaint listings.

**What if I only need the score?**
Set `maxComplaintsPerCompany` to `0` and leave `includeCompanyProfile` on. You get one reputation row per company.

**What does monitor mode save?**
Only complaint ids that were not stored for that company in `monitorStateStore`. A quiet tick writes zero rows.

**Is this a Reclame Aqui API alternative?**
It reads the public scorecard and public complaint list and returns JSON. It does not log in, reply, or replace the company’s own Hugme inbox.

**Are consumer emails included?**
No. Email addresses, IP addresses, and phone numbers from the complaint payload are dropped before the row is saved.

# Actor input Schema

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

Company slug (nubank), company name, or a public /empresa/ URL. One company per line.

## `startUrls` (type: `array`):

Public company URLs. The slug after /empresa/ is used. Combined with Companies.

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

Complaint rows saved for each company. 0 saves the reputation row only.

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

Hard cap across company rows and complaint rows.

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

Save one reputation row per company (score, RA status, response and resolution rates, CNPJ). Turned off while monitor mode is on.

## `scrapeComplaints` (type: `boolean`):

Save public complaint rows: title, text, status, date, city, and state.

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

Latest reads the public list with no status filter. Other values ask the list for that status only.

## `dateFrom` (type: `string`):

Keep complaints created on or after this day (YYYY-MM-DD).

## `dateTo` (type: `string`):

Keep complaints created on or before this day (YYYY-MM-DD).

## `monitorMode` (type: `boolean`):

Save only complaint ids that were not saved for this company on a previous run. A quiet tick writes zero rows and skips the reputation row.

## `monitorStateStore` (type: `string`):

Named key-value store for complaint ids already seen. Used only when monitor mode is on.

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

Optional. Leave off to try a direct request, then residential if the platform IP is challenged. A proxy you set here is used as-is.

## Actor input object example

```json
{
  "companies": [
    "nubank"
  ],
  "maxComplaintsPerCompany": 20,
  "maxItems": 50,
  "includeCompanyProfile": true,
  "scrapeComplaints": true,
  "status": "LATEST",
  "monitorMode": false,
  "monitorStateStore": "reclameaqui-monitor",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Default dataset items — one company or complaint per row.

# 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": [
        "nubank"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/reclameaqui-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": ["nubank"] }

# Run the Actor and wait for it to finish
run = client.actor("crawloop/reclameaqui-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": [
    "nubank"
  ]
}' |
apify call crawloop/reclameaqui-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawloop/reclameaqui-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/Jv3ga5jfNNarKHB1T/builds/ci1hTQbHXzVyW16dl/openapi.json
