# Reclame Aqui Scraper - Complaints, Replies & RA Score (`scrapewise/reclame-aqui-scraper`) Actor

Scrape Reclame Aqui (reclameaqui.com.br), Brazil's consumer complaint site: company reputation score, RA1000 status and rates, complaints with full text, company reply and final evaluation, keyword search, segment rankings and only-new mode. No login. US$ 16 per 1,000 complaints.

- **URL**: https://apify.com/scrapewise/reclame-aqui-scraper.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $13.60 / 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

## Reclame Aqui Scraper

Reclame Aqui Scraper turns **Reclame Aqui (reclameaqui.com.br)**, the consumer complaint site every Brazilian checks before buying, into clean JSON, CSV or Excel, **without login or cookies**. Built for brand and reputation monitoring in Brazil, competitor benchmarking, customer experience teams and due diligence. You can use it five ways:

- **Company reputation profile:** final score, RA1000 status, response rate, resolution rate, "would do business again" rate, average response time and complaint counts for 5 periods, plus the company's position in its segment ranking and its top problems.
- **Complaints of a company:** full text, status, city and state, category, product and problem, and the whole conversation: company reply, consumer reply and final evaluation with the consumer's score.
- **Keyword search:** complaints that mention a word, across the whole site or inside one company.
- **Segment rankings:** the best and worst companies of a segment (banks, airlines, marketplaces, telecom), in ranking order.
- **Only new:** on a schedule, get and pay for only the complaints that were not delivered in earlier runs.

**US$ 16.00 per 1,000 complaints, conversation included. US$ 0.03 per company profile. No monthly fee, no start fee. Error rows are free.**

### At a glance

- **Price per 1,000 complaints:** US$ 16.00 (US$ 13.60 on Gold plans and above), no run start fee
- **Conversation:** Company reply, consumer reply and final evaluation in every complaint that has them, same price
- **Reputation profile:** Score, RA1000, 4 rates and response time for the last 6 months, 12 months, last year, the year before and overall
- **Filters:** Status (not answered, answered, evaluated, solved, not solved), date range, keyword, category, product and problem
- **Depth:** Past the site's own limit of 500 complaints per list (see Limitations)
- **Only-new mode:** Yes, per company and per search
- **Personal data:** No consumer name; CPF numbers, e-mails and phones in the free text are masked
- **Login or cookies:** None
- **Error rows:** Free, with an `errorCode`

### Real rows

Run on 2026-10-03 in the Apify cloud.

**Company profile** for `nubank` (shortened; `reputationByPeriod` also brings the last 12 months, last year, the year before and overall):

```json
{
  "type": "company",
  "companyName": "Nubank",
  "companySlug": "nubank",
  "companyUrl": "https://www.reclameaqui.com.br/empresa/nubank/",
  "website": "http://www.nubank.com.br",
  "cnpj": "18236120000158",
  "isVerified": true,
  "mainSegment": "Bancos e Financeiras",
  "reputationStatus": "RA1000",
  "isRA1000": true,
  "finalScore": 8.7,
  "consumerScore": 7.72,
  "responseRate": 99.3,
  "resolutionRate": 92.4,
  "wouldDoBusinessAgainRate": 80.8,
  "avgResponseTimeHours": 93.8,
  "complaintsLast30Days": 9357,
  "complaintsLast6Months": 56676,
  "complaintsLast12Months": 115193,
  "totalComplaints": 551306,
  "segmentRankingPosition": 4,
  "segmentRankingName": "Bancos Tradicionais e Digitais",
  "topProblems": [
    { "id": "0000000000000075", "name": "Cobrança indevida", "complaints": 88343 },
    { "id": "0000000000000091", "name": "Limite", "complaints": 53016 }
  ],
  "reputationByPeriod": {
    "last6Months": { "reputationStatus": "RA1000", "finalScore": 8.7, "responseRate": 99.3, "resolutionRate": 92.4, "complaints": 56676, "answered": 56257, "notAnswered": 406, "evaluated": 24104, "periodStart": "2026-04-01", "periodEnd": "2026-09-30" }
  }
}
```

**One complaint with its conversation** (texts shortened):

```json
{
  "type": "complaint",
  "id": "B9l-Djnklol2IhJi",
  "url": "https://www.reclameaqui.com.br/nubank/minha-conta-foi-bloqueada-e-meu-nome-marcado-como-editado-pelo-reclame-aqui-sem-aviso_B9l-Djnklol2IhJi/",
  "title": "Minha conta foi bloqueada e meu nome marcado como [Editado pelo Reclame Aqui] sem aviso",
  "text": "Minha conta foi bloqueada e depois cancelada e meu nome foi marcado no bacen como risco ou [Editado pelo Reclame Aqui], não teve aviso nem pedido de devolução de pix...",
  "createdAt": "2026-10-02T14:04:27-03:00",
  "status": "not_solved",
  "hasCompanyReply": true,
  "evaluated": true,
  "solved": false,
  "wouldDoBusinessAgain": false,
  "consumerScore": 0,
  "city": "Ananindeua",
  "state": "PA",
  "category": "Bancos",
  "product": "Conta",
  "problem": "marcação de risco ou fraude",
  "companyReply": "Olá, [name].\n\nRecebemos sua mensagem pela plataforma do Reclame Aqui e estamos prontos para te responder...",
  "companyReplyAt": "2026-10-02T15:17:56-03:00",
  "firstReplyHours": 1.2,
  "consumerReply": "A reclama é sobre a denúncia de [Editado pelo Reclame Aqui] e não sobre o encerramento da conta",
  "finalEvaluation": "Nada foi resolvido",
  "interactionCount": 3,
  "companyName": "Nubank",
  "companySlug": "nubank"
}
```

**Segment ranking** for digital banks, same day: 67 rows for best and worst together, each with position, score, reputation status, resolution rate and complaint count. **Keyword search** for `voo cancelado` (cancelled flight) returned complaints against Azul, LATAM Airlines, Decolar and GOL, newest first.

### What you can do with it

- **Brand monitoring in Brazil:** schedule your brand with `onlyNew` every hour and send each new complaint to Slack, a ticket system or a sheet before it goes unanswered.
- **Competitor benchmarking:** put your company and your competitors in `companies` with `maxComplaintsPerCompany: 0` and compare score, resolution rate and response time, or read the whole segment ranking.
- **Customer experience and product research:** read the not solved complaints of the last 30 days, grouped by problem and product, with what the company answered.
- **Due diligence and supplier risk:** reputation status, complaint volume and resolution trend of a Brazilian company across 5 periods.
- **Datasets for AI and sentiment analysis:** Brazilian Portuguese complaint text with problem labels, outcome and consumer score.

### Input

| Field | What it does |
|---|---|
| `companies` | Slugs as in `reclameaqui.com.br/empresa/<slug>/` (`nubank`, `mercado-livre`, `amazon`, `ifood`), company page links or plain names (`LATAM Airlines`). A complaint page link returns that one complaint |
| `searchQueries` | Keywords searched across every company |
| `companySearch` | Names; returns every matching company with slug, score and status, good for finding sub-brands |
| `rankingSegments` | Segment links from `reclameaqui.com.br/segmentos/`, with `rankingType` (`best`, `worst`, `both`) and `maxCompaniesPerRanking` |
| `maxComplaintsPerCompany` | Limit per company and per search; `0` returns only the profile |
| `statusFilter` | `all`, `not_answered`, `answered`, `evaluated`, `solved`, `not_solved` |
| `dateFrom`, `dateTo` | `YYYY-MM-DD`; `dateFrom` also takes a number of days |
| `keyword`, `category`, `product`, `problem` | Filters inside the given companies; names as on the site's own filter |
| `includeCompanyProfile`, `includeInteractions` | Turn the profile row or the conversation off |
| `onlyNew` | Return and charge only complaints not delivered in earlier runs |

Profiles of 6 large brands, no complaints:

```json
{ "companies": ["nubank", "itau", "mercado-livre", "amazon", "claro", "LATAM Airlines"], "maxComplaintsPerCompany": 0 }
```

Not solved complaints of the last 30 days about one problem:

```json
{ "companies": ["ifood"], "statusFilter": "not_solved", "dateFrom": "30", "problem": "Estorno do valor pago", "maxComplaintsPerCompany": 300 }
```

Hourly monitoring of two brands, only what is new:

```json
{ "companies": ["nubank", "mercado-livre"], "onlyNew": true, "includeCompanyProfile": false, "maxComplaintsPerCompany": 200 }
```

### Output fields

- **Complaint rows (`type: "complaint"`):** `id`, `legacyId`, `url`, `title`, `text`, `createdAt`, `updatedAt`, `status`, `hasCompanyReply`, `evaluated`, `solved`, `wouldDoBusinessAgain`, `consumerScore`, `city`, `state`, `category`, `product`, `problem` (and their ids), `companyReply`, `companyReplyAt`, `firstReplyHours`, `consumerReply`, `finalEvaluation`, `interactions` (every message with `type`, `text`, `createdAt`), `interactionCount`, `isNew`, `companyId`, `companyName`, `companySlug`, `companyUrl`, `source`.
- **Company rows (`type: "company"`):** `companyId`, `companyName`, `companySlug`, `companyUrl`, `website`, `logo`, `cnpj`, `isVerified`, `memberSince`, `description`, `mainSegment`, `segments`, `city`, `state`, `customerServicePhones`, `socialProfiles`, `reputationStatus`, `reputationLabel`, `isRA1000`, `hasStamp`, `finalScore`, `consumerScore`, `responseRate`, `resolutionRate`, `wouldDoBusinessAgainRate`, `avgResponseTimeHours`, `complaintsLast30Days`, `complaintsLast6Months`, `complaintsLast12Months`, `totalComplaints`, `reputationByPeriod`, `segmentRankingPosition`, `segmentRankingName`, `topProblems`, `topProducts`, `topCategories`.
- **Ranking and company search rows (`type: "ranking"` or `"company_search"`):** `position`, `rankingType`, `segment`, `companyName`, `companySlug`, `companyUrl`, `reputationStatus`, `finalScore`, `resolutionRate`, `responseRate`, `complaints`, `solvedComplaints`, `unsolvedComplaints`, `isVerified`.

`status` is `not_answered`, `answered`, `solved` or `not_solved`. `reputationStatus` is the site's own: `RA1000`, `GREAT`, `GOOD`, `REGULAR`, `BAD`, `NOT_RECOMMENDED` or `NO_INDEX`. Dates are Brasília time. Text is in Portuguese, as published.

#### Privacy

Reclame Aqui already hides who wrote each complaint. This Actor delivers no consumer name or account id, only the city and state shown on the page. In titles, complaint text and conversation messages it masks CPF numbers (`[cpf]`), e-mail addresses (`[email]`), phone numbers (`[phone]`) and the name after a greeting such as "Olá, \[name]". The phones and CNPJ in the company profile are the company's public customer service data.

#### Error codes (never charged)

| errorCode | Meaning |
|---|---|
| `COMPANY_NOT_FOUND` | No company with this name, slug or link; try `companySearch` |
| `COMPLAINT_NOT_FOUND` | The complaint link does not exist or was removed |
| `SEGMENT_NOT_FOUND` | No ranking for this segment link |
| `NO_RESULTS` | No complaint for this source and filters |
| `NOTHING_NEW` | `onlyNew` is on and nothing was published since the last run |
| `INVALID_FILTER` | The category, product or problem name is not one of the company's; the row lists the names available |
| `INVALID_INPUT` | A value the Actor does not understand |
| `BLOCKED` | Reclame Aqui 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 | Price |
|---|---|
| Complaint delivered, conversation included | US$ 16.00 per 1,000 |
| Company profile delivered | US$ 0.03 each |
| Ranking or company search row delivered | US$ 10.00 per 1,000 |

300 complaints of one company with its profile cost US$ 4.83. Watching 10 brands every hour with `onlyNew` costs only what is new: a brand that receives 40 complaints a day costs about US$ 0.64 a day. Duplicates, filtered rows and error rows are free, and the residential proxy and compute are already inside the price: there is no Apify usage bill on top.

### Use it from the API, on a schedule or in a workflow

- **API:** call `run-sync-get-dataset-items` with your Apify token and one of the inputs above.
- **Schedule:** run every hour or every day with `onlyNew`; each run returns only fresh complaints.
- **Integrations:** n8n, Make, Zapier, Slack and webhooks through the Apify integrations; the Actor also works as a tool for AI agents through the Apify MCP server.

### FAQ

**Do I need a proxy?** The default is a Brazilian residential IP from Apify Proxy, because the site refuses most datacenter addresses. Its cost is inside the price.

**How many complaints can I get per company?** The site itself pages 500 complaints per list. When you ask for more, the Actor reads the same list sliced by problem, product and category and removes duplicates, so large companies return several thousand. Use `statusFilter` and the date range to aim at what you need.

**How does only-new mode know what is new?** It keeps the ids delivered for each company or search, per status and filter, in a named key-value store of your account (`reclame-aqui-scraper-only-new`). Delete the store to start over.

**Is the company reply always there?** Every complaint that has a reply brings the conversation. If one conversation page fails after retries, the row comes with `conversationFetched: false` and the full complaint text.

**Can I get reputation numbers only?** Yes: `maxComplaintsPerCompany: 0`.

### Limitations

- The newest complaints are mostly not answered yet; for conversations use `statusFilter` `answered`, `evaluated`, `solved` or `not_solved`.
- Past 500 per list the order is by slice, not strictly by date.
- A consumer who writes their own name in the middle of the text is not detected by the masking.
- Attachments and the number of people "following" a complaint are not collected.
- This Actor reads public pages only and respects the site's terms. If something breaks, open an issue on the Actor page; issues are answered within hours.

### Changelog

- **2026-10-03, 0.1:** first release. Reputation profile with 5 periods, complaints with conversation, status, date, keyword, category, product and problem filters, sitewide keyword search, segment rankings, company search, only-new mode, masking of personal data, free error rows.

# Actor input Schema

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

Companies to read, one per line: the slug from reclameaqui.com.br/empresa/<slug>/ (for example nubank, mercado-livre, amazon, ifood), a company page link or a plain name (the best match is used). Each company returns its reputation profile row and its complaints, newest first. A complaint page link returns that single complaint. Leave every list empty to run the example 'nubank'. Also accepts 'startUrls', 'companyUrls' or 'company'.

## `searchQueries` (type: `array`):

Keywords searched across every company on Reclame Aqui, one per line (for example pix, chargeback or delayed flight). Returns the matching complaints from all companies, newest first, up to 'Max complaints per company or search'. Also accepts 'searchQuery'.

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

Company names or brands to look up, one per line (for example itau or magazine luiza). Returns every matching company with slug, score, reputation status and complaint count, charged as a ranking or search row. Use it to find the exact slug before scraping complaints, or to list the sub-brands of a group. Also accepts 'searchCompanies'.

## `rankingSegments` (type: `array`):

Segment pages from reclameaqui.com.br/segmentos/, one per line, as a link or 'main-segment/segment' (for example bancos-e-financeiras/bancos-digitais). Returns the best or worst companies of the segment in ranking order, with score and rates. Choose the ranking type in the Rankings section. Also accepts 'rankings'.

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

Upper limit of complaints for each company and each keyword search (default 50 when empty). 0 returns only the company profile, with no complaints. You pay per complaint delivered, so this is the main cost control. Also accepts 'maxComplaints' or 'maxItems'.

## `statusFilter` (type: `string`):

Which complaint list of the company to read: All (default), Not answered, Answered, Evaluated, Solved or Not solved, the same tabs as on the company's Reclame Aqui page. Use Not answered to monitor open issues. Also accepts 'status'.

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

Only complaints published on or after this date: YYYY-MM-DD (for example 2026-01-01) or a number of days back (7 = the last 7 days). Complaints come newest first, so the run stops as soon as older ones appear, which also saves time. Leave empty for no start date. Also accepts 'publishedAfter'.

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

Only complaints published on or before this date, in YYYY-MM-DD format (for example 2026-06-30). Newer complaints are skipped and not charged. Leave empty for no end date.

## `keyword` (type: `string`):

Only complaints of the given companies that match this keyword in the title or text (for example fraud, refund or pix). One word or phrase. Different from 'Search complaints by keyword', which searches the whole site.

## `category` (type: `string`):

Category name exactly as shown in the filter of the company's complaint page, or its numeric id. If the name is not found, the run returns a free row listing the names available for that company, so you can copy the right one. Leave empty for every category.

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

Product type name as shown in the filter of the company's complaint page, or its numeric id (for example a card, an account or a loan type). If the name is not found, a free row lists the available names. Leave empty for every product.

## `problem` (type: `string`):

Problem type name as shown in the filter of the company's complaint page, or its numeric id (for example a billing or delivery problem). If the name is not found, a free row lists the available names. Leave empty for every problem.

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

On by default: one row per company with score, RA1000 status, response, resolution and would-do-business-again rates, average response time, totals for 5 periods, segment ranking position and top problems. Charged as one 'Company profile delivered' event per company. Turn off to receive only complaints.

## `includeInteractions` (type: `boolean`):

On by default: reads the conversation of every complaint that has a reply, adding the company reply, the consumer's reply and the final evaluation. Turn off for faster runs with only the complaint text and status. Same price either way.

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

For daily or hourly schedules. Remembers what was delivered for each company or search, per status and filter, in a key-value store in your account, and delivers and charges only complaints not delivered before. The first run delivers up to the limit. Also accepts 'incrementalMode'.

## `rankingType` (type: `string`):

Which segment ranking to read for 'Segment rankings': Best (default), Worst or Both. Each company row says which ranking it came from and its position.

## `maxCompaniesPerRanking` (type: `integer`):

Upper limit of companies per segment and ranking type (default 50). Each company row is charged as one ranking row, so with Both and 50 a segment returns up to 100 rows.

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

A Brazilian residential proxy is the default because Reclame Aqui refuses most datacenter IPs. Its cost is already inside the price per result. If you pick another proxy and it is refused, the Actor switches by itself to a Brazilian residential IP. Keep the default.

## Actor input object example

```json
{
  "companies": [
    "nubank"
  ],
  "maxComplaintsPerCompany": 30,
  "statusFilter": "all",
  "includeCompanyProfile": true,
  "includeInteractions": true,
  "onlyNew": false,
  "rankingType": "best",
  "maxCompaniesPerRanking": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BR"
  }
}
```

# 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": [
        "nubank"
    ],
    "maxComplaintsPerCompany": 30,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "BR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/reclame-aqui-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"],
    "maxComplaintsPerCompany": 30,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "BR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/reclame-aqui-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"
  ],
  "maxComplaintsPerCompany": 30,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BR"
  }
}' |
apify call scrapewise/reclame-aqui-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/reclame-aqui-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/ZKILE702zAPfHsKVh/builds/WpoDJ1ZcxYPbCK6Hb/openapi.json
