# Reclame Aqui Scraper - Reputation, Complaints & Replies (`riseandcode/reclameaqui-scraper`) Actor

Scrapes company reputation profiles and consumer complaints from Reclame Aqui (Brazil): score, response/resolution rates, complaint text, status, and company reply threads.

- **URL**: https://apify.com/riseandcode/reclameaqui-scraper.md
- **Developed by:** [Rise and Code](https://apify.com/riseandcode) (community)
- **Categories:** Business, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $17.00 / 1,000 company records

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

### What does Reclame Aqui Scraper do?

This Actor extracts **company reputation profiles and consumer complaints** from [Reclame Aqui](https://www.reclameaqui.com.br) — Brazil's largest consumer-complaints platform, used by shoppers to check a company's track record before buying and by companies to monitor their own reputation. Give it one or more company slugs (or full Reclame Aqui URLs) and get back the company's reputation scorecard — score, % answered, % resolved, % would-buy-again, average response time, CNPJ, contact info — plus its most recent complaints, with the option to pull the full complaint text and the company's reply thread.

### Why scrape Reclame Aqui?

- 📊 **Reputation monitoring** — track your own brand's score, response rate, and resolution rate over time.
- 🔍 **Due diligence** — check a supplier, franchise, or acquisition target's consumer complaint history before signing.
- 🥊 **Competitive benchmarking** — compare reputation metrics across competitors in your sector.
- 🎯 **Customer-service QA** — audit response times and reply content for unanswered or unresolved complaints.
- 🤖 **Automation** — schedule runs and pipe results into spreadsheets, dashboards, or CRMs via Apify integrations.

### How to use Reclame Aqui Scraper

1. Visit the [Actor page](https://apify.com/riseandcode/reclameaqui-scraper) on Apify and click **Try for free** — no credit card required.
2. In the **Input** tab, add one or more companies (slug like `nubank`, or the full URL).
3. Leave **Max complaints per company** at 5 and **Include full complaint text** off to try the cheapest data first.
4. Click **Start** and wait a few seconds for the run to finish.
5. Open the **Output** tab or download the dataset as **JSON, CSV, Excel, or HTML**.

To trigger a run via the Apify API:

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/riseandcode~reclameaqui-scraper/runs?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "companies": ["nubank"],
    "maxComplaintsPerCompany": 5,
    "includeComplaintDetail": true
  }'
```

### Input

Configure the Actor in the **Input** tab or via JSON.

| Field                     | Type       | Default      | Description                                                                                                                                        |
| ------------------------- | ---------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `companies`               | `string[]` | `["nubank"]` | Company slugs or full Reclame Aqui URLs. Reputation profile + the 5 most recent complaints.                                                        |
| `searchQueries`           | `string[]` | `[]`         | Advanced. Free-text terms searched across the whole platform. Best-effort — billed as **Extra complaint** per result.                              |
| `maxComplaintsPerCompany` | `integer`  | `5`          | How many recent complaints to fetch per company. The 5 most recent are billed as **Complaint**; every one beyond 5 as **Extra complaint**.         |
| `includeComplaintDetail`  | `boolean`  | `false`      | Fetch full complaint text + the company's reply thread for every complaint returned. Billed as **Complaint detail** per complaint. Off by default. |

Example input:

```json
{
  "companies": ["nubank", "microsoft"],
  "maxComplaintsPerCompany": 5,
  "includeComplaintDetail": true
}
```

### Output

Every run returns the same data in **two formats** — use whichever fits your tool:

| Format                | Shape                                                                                                                                 | Best for                                                                                   | Where to get it                                                                                                   |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------- |
| **Dataset** (default) | One row per company (`"kind": "company"`) and one row per complaint (`"kind": "complaint"`), linked by `companyShortname`             | Spreadsheets, CSV/Excel, Google Sheets, Make/Zapier, the table views in the **Output** tab | **Output** tab → *Results*, or `GET https://api.apify.com/v2/datasets/<datasetId>/items` (JSON, CSV, Excel, HTML) |
| **Grouped JSON**      | One object per company with its complaints nested in `complaints: [...]`; keyword-search results in `searchResults`, grouped by query | Code and APIs that want a company and its complaints in one object                         | **Output** tab → *Grouped JSON*, or `GET https://api.apify.com/v2/key-value-stores/<storeId>/records/OUTPUT`      |

Both hold the same records and values (the grouped JSON just drops the `kind` row-type field); you're charged once per item, whichever format you read. The grouped JSON is saved when the run ends (also when it is aborted or stops at your maximum cost per run).

Grouped JSON shape (fields shortened — see the full example below):

```json
{
  "companies": [
    {
      "shortname": "nubank",
      "companyName": "Nubank",
      "score": 7.72,
      "complainCount": 56647,
      "complaints": [
        {
          "id": "NQfrzMqCgcwSPN05",
          "tier": "free",
          "title": "Comprei um bolo online e não recebi…",
          "status": "PENDING"
        }
      ]
    }
  ],
  "searchResults": [
    {
      "query": "entrega atrasada",
      "complaints": [{ "id": "…", "companyShortname": "ifood", "title": "…" }]
    }
  ]
}
```

#### Output example (dataset)

```json
[
  {
    "kind": "company",
    "companyId": "88850",
    "shortname": "nubank",
    "companyName": "Nubank",
    "fantasyName": "Nubank",
    "cnpj": "18236120000158",
    "score": 7.72,
    "answeredPercentual": 99.9,
    "solvedPercentual": 92.4,
    "dealAgainPercentual": 80.7,
    "averageAnswerTimeHours": 94.4,
    "complainCount": 56647,
    "companyPlan": "PREMIUM",
    "status": "ACTIVE",
    "city": "SAO PAULO",
    "state": "SP",
    "urlSite": "http://www.nubank.com.br",
    "urlInstagram": "https://www.instagram.com/nubank/",
    "urlLinkedin": "https://www.linkedin.com/company/nubank-brasil/",
    "scrapedAt": "2026-10-09T01:03:06.114Z"
  },
  {
    "kind": "complaint",
    "id": "NQfrzMqCgcwSPN05",
    "tier": "free",
    "searchQuery": null,
    "hasFullDetail": true,
    "companyShortname": "nubank",
    "companyId": "88850",
    "companyName": "Nubank",
    "title": "Comprei um bolo online e não recebi, Nubank não devolveu meu dinheiro",
    "description": "Entrei no Google procurando por uma página onde eu queria comprar…",
    "status": "PENDING",
    "solved": false,
    "evaluated": false,
    "createdAt": "2026-10-08T21:29:20.000Z",
    "userCity": "São Paulo",
    "userState": "SP",
    "category": "Marketplace",
    "problemType": "Produto não recebido",
    "productType": "Produtos",
    "interactions": [],
    "url": "https://www.reclameaqui.com.br/nubank/comprei-um-bolo-online-e-nao-recebi-nubank-nao-devolveu-meu-dinheiro_NQfrzMqCgcwSPN05/",
    "scrapedAt": "2026-10-09T01:03:06.759Z"
  }
]
```

### Data table

| Field (company)                                        | Type             | Description                                                        |
| ------------------------------------------------------ | ---------------- | ------------------------------------------------------------------ |
| `shortname` / `companyId`                              | `string`         | Reclame Aqui slug and ID of the company                            |
| `companyName` / `fantasyName` / `cnpj`                 | `string \| null` | Legal name, trade name and CNPJ                                    |
| `score`                                                | `number \| null` | Reclame Aqui reputation score (0–10)                               |
| `answeredPercentual` / `solvedPercentual`              | `number \| null` | % of complaints answered / solved                                  |
| `dealAgainPercentual`                                  | `number \| null` | % of consumers who would do business with the company again        |
| `averageAnswerTimeHours` / `complainCount`             | `number \| null` | Average time to answer (hours) and total complaints received       |
| `companyPlan` / `status`                               | `string \| null` | The company's Reclame Aqui plan and account status                 |
| `city` / `state` / `urlSite` / `urlInstagram` / `url…` | `string \| null` | Location, website and social profiles, when the company lists them |

| Field (complaint)                          | Type                | Description                                                                                          |
| ------------------------------------------ | ------------------- | ---------------------------------------------------------------------------------------------------- |
| `id`                                       | `string`            | Reclame Aqui complaint ID                                                                            |
| `tier`                                     | `"free" \| "extra"` | `free` = one of the 5 most recent complaints (billed as Complaint); `extra` = older or from a search |
| `searchQuery`                              | `string \| null`    | The `searchQueries` term that found this complaint; `null` for a company's own complaints            |
| `hasFullDetail`                            | `boolean`           | Whether `includeComplaintDetail` successfully fetched the full text/thread for this item             |
| `title` / `description`                    | `string`            | Complaint headline and body (full text with `includeComplaintDetail`, a short snippet otherwise)     |
| `status`                                   | `string \| null`    | Complaint status as Reclame Aqui reports it, e.g. `PENDING`, `ANSWERED`                              |
| `solved` / `evaluated`                     | `boolean \| null`   | Whether the consumer marked the complaint resolved / left a final evaluation                         |
| `category` / `problemType` / `productType` | `string \| null`    | Reclame Aqui's complaint taxonomy (only with `includeComplaintDetail`)                               |
| `interactions`                             | `array \| null`     | The company↔consumer reply thread (only with `includeComplaintDetail`)                               |
| `userCity` / `userState`                   | `string \| null`    | Consumer's self-reported location (only with `includeComplaintDetail`)                               |

### How much does it cost to scrape Reclame Aqui?

This Actor uses Apify's **pay-per-event** pricing: you pay only for what is delivered, with no separate charge for Apify platform usage (compute, proxy, bandwidth).

| Event                | Price      | When it applies                                                                                                |
| -------------------- | ---------- | -------------------------------------------------------------------------------------------------------------- |
| **Company profile**  | **$0.02**  | Once per company — reputation scorecard (score, CNPJ, contacts, response rates)                                |
| **Complaint**        | **$0.01**  | Per complaint, for each of the 5 most recent complaints of a company                                           |
| **Extra complaint**  | **$0.015** | Per complaint beyond the 5 most recent (or from `searchQueries`) — older complaints and keyword search results |
| **Complaint detail** | **$0.005** | Per complaint, only when `includeComplaintDetail` is on — full text + reply thread                             |

**Full example — every event in one run:** 1 company, `maxComplaintsPerCompany: 15`, `includeComplaintDetail: true`:

| Event                | Count | Price  | Subtotal   |
| -------------------- | ----- | ------ | ---------- |
| **Company profile**  | 1     | $0.02  | $0.02      |
| **Complaint**        | 5     | $0.01  | $0.05      |
| **Extra complaint**  | 10    | $0.015 | $0.15      |
| **Complaint detail** | 15    | $0.005 | $0.075     |
| **Total**            |       |        | **$0.295** |

**More examples:**

- 1 company, profile + 5 recent complaints → `$0.02 + 5 × $0.01 = $0.07`
- 1 company, 5 recent complaints with full text and reply thread → `$0.02 + 5 × ($0.01 + $0.005) = $0.095`
- Monitoring 10 companies (profile + 5 recent each) → `10 × $0.07 = $0.70`
- Keyword search only, 20 results (`searchQueries`, no companies) → `20 × $0.015 = $0.30`

Prices above are for Apify's free plan; paid Apify plans get a discount on every event (shown on the Pricing tab).

Apify's [free plan](https://apify.com/pricing) includes $5 of free usage per month — about 70 company checks.

#### Tips to keep costs low

- Leave `maxComplaintsPerCompany` at 5 to get the cheapest useful signal (score + recent complaints) for reputation monitoring at scale.
- Turn on `includeComplaintDetail` when you need the full complaint text and the company's reply — it adds $0.005 per complaint.
- Older complaints (beyond the 5 most recent) cost a bit more because they come from extra paginated requests to Reclame Aqui.

### Known limitations

- **Older complaints (beyond the 5 most recent) cap out around 10–15 per company.** Reclame Aqui itself only lists that many older complaints per company, the same for every company we tested. If it can't go further, the Actor returns fewer than requested instead of failing the run, and never charges for complaints it didn't deliver. Setting `maxComplaintsPerCompany` well above ~15 won't return more. Keyword search (`searchQueries`) is not limited this way.
- `interactions` (the reply thread) is returned as-is from the source; its exact shape may vary between complaints.

### FAQ

#### Is it legal to scrape Reclame Aqui?

This Actor only collects publicly available data — the same complaint text, company scores, and reply threads visible to any visitor without logging in. Always comply with Reclame Aqui's [Terms of Service](https://www.reclameaqui.com.br/termos-de-uso/) and applicable local laws (including the LGPD if you process any personal data returned, such as a consumer's self-reported city).

#### Do I need a Reclame Aqui account or API key?

No. The Actor works without any Reclame Aqui credentials — just a free Apify account.

#### Where do I find a company's slug?

It's the identifier in the company's Reclame Aqui URL, e.g. `nubank` in `reclameaqui.com.br/empresa/nubank/`. You can also just paste the full URL into `companies` — the Actor extracts the slug automatically.

#### Am I charged for a run that finds nothing?

No. Billing is per delivered item (company profile, complaint, extra complaint, or complaint detail) — a company that fails to load or a paginated request that returns nothing is never charged. If none of the companies you asked for can be found, the run fails with a message telling you to check the slug.

#### How long does a run take?

Measured on the live Actor: 1 company with its 5 recent complaints takes about 10–20 seconds; 1 company with 15 complaints and full text about 30 seconds; 3 companies plus a keyword search with full text under a minute. The default timeout is more than enough — for large batches (hundreds of companies) allow a few minutes.

#### Why did I get fewer extra complaints than the ~10-15 ceiling?

For companies that receive a high volume of new complaints, a new one can land between the moment the 5 most recent complaints are read and the moment the extra pages are fetched moments later. Since the Actor deduplicates by complaint ID so nothing is ever double-counted, that overlap can push the actual extra count a bit under what the pagination ceiling would otherwise allow. This is a timing effect on very active companies, not an error — you're only ever charged for what was actually delivered.

### Changelog

- **2026-10-09** — New grouped JSON output: each company with its complaints nested, next to the usual table. Complaints now show which search term found them (`searchQuery`).
- **2026-10-08** — Older complaints and keyword search are now much faster and more reliable. Runs stop at your maximum cost per run, and a run where no company can be found fails with a clear message.
- **2026-10-06** — Updated for Reclame Aqui's new website layout.

### Support

If you encounter a bug or have a suggestion for this Actor or a new one, reach us at <contact.riseandcode@gmail.com>. We respond in English 🇺🇸 and Portuguese 🇧🇷.

# Actor input Schema

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

Company slugs or full Reclame Aqui URLs (e.g. "nubank" or "https://www.reclameaqui.com.br/empresa/nubank/"). Each company returns its reputation profile ($0.02) and its 5 most recent complaints ($0.01 each).

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

Free-text terms to search for complaints across the whole platform, independent of "Companies". Paginates Reclame Aqui's search API (best-effort — Reclame Aqui's search page is not officially documented) and is charged as "Extra complaint" ($0.015) per result. Leave empty to skip.

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

How many recent complaints to fetch per company. The 5 most recent cost $0.01 each. Every complaint beyond 5 requires extra paginated requests and is charged as "Extra complaint" ($0.015 each). In practice, Reclame Aqui's own pagination stops responding after about 10-15 extra complaints per company regardless of how high this is set — you're never charged for complaints it couldn't deliver, but setting this well above ~20 is unlikely to get you more.

## `includeComplaintDetail` (type: `boolean`):

Fetch the full complaint text, taxonomy, and the company's reply thread for every complaint returned (instead of just title/status/date snippet). Charged as "Complaint detail" ($0.005) per complaint. Off by default.

## Actor input object example

```json
{
  "companies": [
    "nubank",
    "https://www.reclameaqui.com.br/empresa/ifood/"
  ],
  "searchQueries": [
    "entrega atrasada"
  ],
  "maxComplaintsPerCompany": 15,
  "includeComplaintDetail": true
}
```

# Actor output Schema

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

No description

## `grouped` (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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("riseandcode/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("riseandcode/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 riseandcode/reclameaqui-scraper --silent --output-dataset

```

## MCP server setup

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