# ReclameAqui Scraper (`solidcode/reclameaqui-scraper`) Actor

\[💰 $40.0 / 1K] Extract consumer complaints, ratings, response rates, and reputation data from ReclameAqui (Brazil). Search by company slug or URL, filter by status and date, and pull complaint text, status, rating, and views per item across any Brazilian brand.

- **URL**: https://apify.com/solidcode/reclameaqui-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Developer tools, Agents, Other
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $40.00 / 1,000 complaints

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## ReclameAqui Scraper

Pull consumer complaints, brand reputation scores, response rates, and resolution rates from ReclameAqui — Brazil's largest consumer complaints platform — with full complaint text, status, category, city, state, and posted date on every row. Built for Brazilian-market researchers, brand-monitoring teams, BPO and customer-service agencies, fintech compliance teams, and journalists who need a clean reclamacao dataset without paginating through thousands of profile pages by hand.

### Why This Scraper?

- **Multi-brand sweeps in a single run** — fan out across 50 fintechs at 500 complaints each for a 25,000-row dataset, or chain telecoms, retailers, and airlines in one input array.
- **Up to 500 most-recent complaints per company** — that's ReclameAqui's own pagination ceiling, fetched in full with category, product, problem, body, status, location, and posted date on every row.
- **Pre-computed reputation in one row** — every company emits a free profile row with its 6-month ReclameAqui score (0–10), response rate %, resolution rate %, average response time in hours, RA status badge (RA1000, RA200, etc.), lifetime complaint count, and 6-month complaint count.
- **All three native ReclameAqui status filters** — Respondidas (answered), Não respondidas (not answered), and Pendentes (awaiting consumer reply). Multi-select runs fetch each status separately and merge the results.
- **Free-text complaint search across the entire platform** — pass a `searchQuery` like "atraso entrega" or "cobrança indevida" to surface every matching complaint across all brands in one sweep.
- **Slug or full-URL inputs accepted** — paste `nubank`, `bradesco`, or `https://www.reclameaqui.com.br/empresa/magazine-luiza-loja-online/` straight from your browser bar; both forms work.
- **Smart date filtering with early-stop pagination** — bound a run with `dateFrom` / `dateTo` and the scraper stops requesting older pages once the cutoff is crossed, saving credits on long-tail queries.
- **Localized PT status labels with resolution flag** — every complaint carries a human-readable status like `Respondida • Resolvida` or `Respondida • Não resolvida` so you can split answered-but-unresolved from genuinely closed cases.
- **Resolved category, product, and problem labels** — every complaint comes with the human-readable category (e.g. "Cartões"), product, and problem strings, not opaque IDs.
- **Company stats included free** — only complaint rows count toward your bill; profile rows are bundled at no charge.

### Use Cases

**Brand Monitoring & Reputation Management**
- Track week-over-week complaint volume on your own brand
- Compare your response rate, resolution rate, and RA score against direct competitors
- Detect a sudden surge in complaints tied to a product launch or pricing change
- Identify the top 5 problem categories driving negative sentiment

**Customer Service & Operations**
- Surface every "Não respondida" complaint older than 7 days and route to your CS queue
- Measure average response time vs. peers in your segment
- Mine complaint titles to refine your IVR taxonomy and FAQ coverage
- Build city/state heat maps of where complaints concentrate

**Lead Generation for BPO and CX Agencies**
- Find Brazilian brands with response rates under 60% — they need your contact-center help
- Build a target list of companies with thousands of unanswered complaints
- Pitch RA1000-aspirant companies before they hit the badge

**Fintech & Compliance Risk**
- Monitor complaint patterns at competing fintechs and digital banks
- Flag fraud, "cobrança indevida", and "cartão clonado" mentions for KYC/AML review
- Build risk dashboards on payment processors, neobanks, and credit-card issuers

**Market Research & Consumer Insights**
- Quantify pain points across e-commerce, retail, telecom, banking, airlines
- Compare delivery complaints across Mercado Livre, Magazine Luiza, and Amazon Brazil
- Track regional complaint patterns by city and state

**Legal, Journalism & Academic Research**
- Pull case studies for class-action research with full complaint text and dates
- Sample a brand's complaint corpus for investigative reporting
- Build labelled datasets of consumer Portuguese for NLP and sentiment work

### Getting Started

#### Single Brand — Most Recent 100

The simplest run — one company slug, default cap:

```json
{
    "companies": ["nubank"]
}
````

#### Multi-Brand With Status Filter

Track unanswered complaints across three banks at once:

```json
{
    "companies": ["nubank", "itau", "bradesco"],
    "statusFilter": ["NOT_ANSWERED"],
    "maxComplaintsPerCompany": 200
}
```

#### Date-Bounded Free-Text Search

Find every complaint mentioning "atraso entrega" posted in the last quarter, across all brands:

```json
{
    "searchQuery": "atraso entrega",
    "dateFrom": "2026-01-01",
    "dateTo": "2026-03-31",
    "maxResults": 2000
}
```

#### Full-URL Input + Comprehensive Audit

Paste a profile URL directly; pull both answered and pending complaints up to the platform ceiling:

```json
{
    "companies": [
        "https://www.reclameaqui.com.br/empresa/magazine-luiza-loja-online/",
        "mercado-livre"
    ],
    "statusFilter": ["ANSWERED", "PENDING"],
    "dateFrom": "2025-01-01",
    "maxComplaintsPerCompany": 500,
    "maxResults": 10000,
    "includeCompanyStats": true
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `companies` | string\[] | `["nubank"]` | Company slugs (e.g. `nubank`, `itau`, `bradesco`) or full ReclameAqui profile URLs. Both forms are accepted and combined with the search query below. |
| `searchQuery` | string | `""` | Free-text keyword search across every complaint on ReclameAqui. Run alongside companies or on its own. |

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `statusFilter` | select\[] | `[]` (all) | Restrict by status: **Respondidas (Answered by company)**, **Não respondidas (Not answered)**, **Pendentes (Awaiting consumer reply)**. Multi-select supported. |
| `dateFrom` | string | null | Lower date bound, format `YYYY-MM-DD`. The scraper stops paginating once it walks past this cutoff. |
| `dateTo` | string | null | Upper date bound, format `YYYY-MM-DD`. |

#### Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxComplaintsPerCompany` | integer | `100` | Cap on complaints captured per company, most recent first. Maximum 500 — the ReclameAqui platform's pagination ceiling. Set `0` to fetch up to that limit. |
| `maxResults` | integer | `1000` | Maximum complaint rows for the entire run. Set `0` for no row cap. Each complaint costs $0.04 — a 5,000-complaint run costs $200. |

#### Output

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `includeCompanyStats` | boolean | `true` | Emit one extra row per company with reputation data — score, response rate, resolution rate, average response time, total complaints, and category. Tagged `recordType: "company"`. Disable for a complaints-only output. |

### Output

Every row carries a `recordType` field — `company` or `complaint` — so you can filter cleanly downstream. Company rows are emitted once per brand and are bundled free.

#### Company Profile (`recordType: "company"`)

```json
{
    "recordType": "company",
    "companyName": "Nubank",
    "companySlug": "nubank",
    "category": "Bancos",
    "companyScore": 8.4,
    "responseRate": 99.6,
    "resolutionRate": 87.2,
    "averageResponseTimeHours": 14,
    "totalComplaints": 64584,
    "complaintsLast6Months": 18342,
    "raStatus": "RA1000",
    "description": "O Nubank é uma instituição financeira brasileira...",
    "website": "https://nubank.com.br",
    "companyUrl": "https://www.reclameaqui.com.br/empresa/nubank/"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `recordType` | string | Always `"company"` |
| `companyName` | string | Brand display name |
| `companySlug` | string | ReclameAqui URL slug |
| `category` | string | Primary segment (e.g. "Bancos", "E-commerce", "Telecom") |
| `companyScore` | number | 6-month ReclameAqui reputation score, scale 0–10 |
| `responseRate` | number | Percentage of complaints answered, last 6 months |
| `resolutionRate` | number | Percentage of complaints marked resolved by the consumer |
| `averageResponseTimeHours` | number | Mean time-to-first-response in hours |
| `totalComplaints` | number | Lifetime complaint count |
| `complaintsLast6Months` | number | Complaints posted in the trailing 6-month window |
| `raStatus` | string | RA badge (e.g. `RA1000`, `RA200`, `Bom`, `Regular`, `Ruim`, `Não recomendada`) |
| `description` | string | Brand description (HTML stripped) |
| `website` | string | Official brand website |
| `companyUrl` | string | Direct ReclameAqui profile URL |

#### Complaint (`recordType: "complaint"`)

```json
{
    "recordType": "complaint",
    "complaintId": "1856732041",
    "companyName": "Nubank",
    "companySlug": "nubank",
    "title": "Cobrança indevida no cartão de crédito",
    "body": "Identifiquei uma cobrança que não reconheço no valor de R$ 489,90...",
    "status": "Respondida • Resolvida",
    "city": "São Paulo",
    "state": "SP",
    "category": "Cartões",
    "product": "Cartão de crédito",
    "problem": "Cobrança indevida",
    "createdAt": "2026-04-12T09:42:18Z",
    "interactionCount": 3,
    "complaintUrl": "https://www.reclameaqui.com.br/nubank/cobranca-indevida-no-cartao_1856732041/"
}
```

##### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `recordType` | string | Always `"complaint"` |
| `complaintId` | string | Unique ReclameAqui complaint ID |
| `title` | string | Complaint headline as posted by the consumer |
| `body` | string | Full complaint text, HTML tags stripped |
| `status` | string | Localized PT status — `Respondida`, `Não respondida`, or `Pendente`, optionally suffixed with `• Resolvida` or `• Não resolvida` |
| `createdAt` | string | ISO 8601 timestamp of when the complaint was posted |
| `interactionCount` | number | Number of back-and-forth replies on the thread |
| `complaintUrl` | string | Direct ReclameAqui complaint URL |

##### Brand & Location

| Field | Type | Description |
|-------|------|-------------|
| `companyName` | string | Brand the complaint is filed against |
| `companySlug` | string | ReclameAqui URL slug for the brand |
| `city` | string | Consumer's reported city |
| `state` | string | Two-letter Brazilian state code (e.g. `SP`, `RJ`, `MG`) |

##### Categorization

| Field | Type | Description |
|-------|------|-------------|
| `category` | string | Top-level category, resolved to human-readable text (e.g. "Cartões", "Entrega") |
| `product` | string | Product subcategory (e.g. "Cartão de crédito") |
| `problem` | string | Problem subcategory (e.g. "Cobrança indevida", "Atraso na entrega") |

### Tips for Best Results

- **Plan around the 500-per-company cap.** ReclameAqui only exposes the 500 most-recent complaints per company through this view. To survey a brand's full history, schedule incremental runs filtered by `dateFrom` so each run captures the new complaints since the last one.
- **Sweep many brands at once.** Up to 500 per company × N companies scales linearly. A 20-fintech sweep at 500 each lands ~10,000 complaints in a single run with one input array.
- **Use `searchQuery` to find competitor mentions.** Drop a competitor's brand name or a campaign keyword into `searchQuery` to pull every complaint that names it, regardless of which company the complaint targets.
- **Pair `dateFrom` with `statusFilter: ["NOT_ANSWERED"]`** to surface fresh unaddressed complaints — perfect for daily monitoring or BPO lead-gen.
- **Use the `solved` suffix in `status`** to split your dataset: `Respondida • Resolvida` are closed cases; `Respondida • Não resolvida` flags answered-but-unhappy customers worth re-engaging.
- **Multi-select status sparingly.** Each selected status fires its own pagination pass per company, so multiplying statuses multiplies cost. Leave the filter empty to fetch all three in one run if your `maxComplaintsPerCompany` is already low.
- **Paste profile URLs directly.** No need to extract the slug — drop `https://www.reclameaqui.com.br/empresa/<brand>/` into `companies` and the scraper handles it.
- **Keep `includeCompanyStats: true`.** Profile rows are free, and they give you the score, response rate, and RA status alongside the complaints in a single dataset for downstream joins.

### Pricing

**$40 per 1,000 complaints** — charged per complaint row pushed to the dataset. Company profile rows are included free, and there are no compute charges.

| Complaints | Estimated Cost |
|---|---|
| 100 | $4 |
| 1,000 | $40 |
| 10,000 | $400 |
| 100,000 | $4,000 |

You only pay per complaint collected. `recordType: "company"` profile rows do not count toward your bill, and there are no compute or storage charges added on top. Each company is capped at 500 complaints (the platform's pagination ceiling), so 10,000 complaints in one run means a sweep of at least 20 companies.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate brand monitoring, market research, customer-service operations, compliance, journalism, and academic research. Users are responsible for complying with applicable laws — including the LGPD (Lei Geral de Proteção de Dados) — and ReclameAqui's terms of service. Do not use extracted data for spam, harassment, doxxing, or any illegal purpose. When publishing or sharing complaint text, redact personal identifiers where appropriate.

# Actor input Schema

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

Company slugs (e.g. "nubank", "itau", "bradesco") OR full ReclameAqui URLs (e.g. "https://www.reclameaqui.com.br/empresa/nubank/"). Both forms are accepted and combined with the search query below.

## `searchQuery` (type: `string`):

Free-text keyword search across all complaints on ReclameAqui (e.g. "cobrança indevida", "cartão bloqueado"). When provided alongside Companies, both are scraped (companies first, then the search).

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

Cap on complaints captured per company (most recent first). Maximum 500 per company — the ReclameAqui platform's pagination ceiling. Set 0 to fetch up to that limit. The default of 100 keeps quick checks cheap; raise to 500 for the full visible history.

## `maxResults` (type: `integer`):

Maximum complaint rows for the entire run. Set 0 for no row cap. Each complaint costs $0.04 — a 5,000-complaint run costs $200. The actor stops requesting new pages once this number is reached but keeps the full final page even if it slightly overshoots.

## `statusFilter` (type: `array`):

Only include complaints with one of these statuses. Leave empty to include every status. Multiple selections are supported — the actor fetches each status separately and merges the results.

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

Only include complaints posted on or after this date. Format: YYYY-MM-DD (e.g. 2025-01-15). Leave empty for no lower bound.

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

Only include complaints posted on or before this date. Format: YYYY-MM-DD. Leave empty for no upper bound.

## `includeCompanyStats` (type: `boolean`):

Emit one extra row per company with reputation data — overall score, response rate, average response time, total complaints, and category. The row is tagged recordType="company". Disable for a tighter complaints-only output.

## Actor input object example

```json
{
  "companies": [
    "nubank"
  ],
  "maxComplaintsPerCompany": 100,
  "maxResults": 1000,
  "statusFilter": [],
  "includeCompanyStats": true
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of scraped complaints with the most useful columns at a glance.

## `companies` (type: `string`):

Company-level reputation rows (score, response rate, resolution rate, total complaints).

# 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"
    ],
    "searchQuery": "",
    "maxComplaintsPerCompany": 100,
    "maxResults": 1000,
    "statusFilter": [],
    "includeCompanyStats": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/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"],
    "searchQuery": "",
    "maxComplaintsPerCompany": 100,
    "maxResults": 1000,
    "statusFilter": [],
    "includeCompanyStats": True,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/reclameaqui-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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"
  ],
  "searchQuery": "",
  "maxComplaintsPerCompany": 100,
  "maxResults": 1000,
  "statusFilter": [],
  "includeCompanyStats": true
}' |
apify call solidcode/reclameaqui-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=solidcode/reclameaqui-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ReclameAqui Scraper",
        "description": "[💰 $40.0 / 1K] Extract consumer complaints, ratings, response rates, and reputation data from ReclameAqui (Brazil). Search by company slug or URL, filter by status and date, and pull complaint text, status, rating, and views per item across any Brazilian brand.",
        "version": "1.1",
        "x-build-id": "NMDtGnV6QXfj2RpIK"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solidcode~reclameaqui-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solidcode-reclameaqui-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/solidcode~reclameaqui-scraper/runs": {
            "post": {
                "operationId": "runs-sync-solidcode-reclameaqui-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/solidcode~reclameaqui-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-solidcode-reclameaqui-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "companies": {
                        "title": "Companies",
                        "type": "array",
                        "description": "Company slugs (e.g. \"nubank\", \"itau\", \"bradesco\") OR full ReclameAqui URLs (e.g. \"https://www.reclameaqui.com.br/empresa/nubank/\"). Both forms are accepted and combined with the search query below.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchQuery": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Free-text keyword search across all complaints on ReclameAqui (e.g. \"cobrança indevida\", \"cartão bloqueado\"). When provided alongside Companies, both are scraped (companies first, then the search)."
                    },
                    "maxComplaintsPerCompany": {
                        "title": "Max Complaints Per Company",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Cap on complaints captured per company (most recent first). Maximum 500 per company — the ReclameAqui platform's pagination ceiling. Set 0 to fetch up to that limit. The default of 100 keeps quick checks cheap; raise to 500 for the full visible history.",
                        "default": 100
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum complaint rows for the entire run. Set 0 for no row cap. Each complaint costs $0.04 — a 5,000-complaint run costs $200. The actor stops requesting new pages once this number is reached but keeps the full final page even if it slightly overshoots.",
                        "default": 1000
                    },
                    "statusFilter": {
                        "title": "Complaint Status",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Only include complaints with one of these statuses. Leave empty to include every status. Multiple selections are supported — the actor fetches each status separately and merges the results.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "ANSWERED",
                                "NOT_ANSWERED",
                                "PENDING"
                            ],
                            "enumTitles": [
                                "Respondidas (Answered by company)",
                                "Não respondidas (Not answered)",
                                "Pendentes (Awaiting consumer reply)"
                            ]
                        },
                        "default": []
                    },
                    "dateFrom": {
                        "title": "Date From",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "type": "string",
                        "description": "Only include complaints posted on or after this date. Format: YYYY-MM-DD (e.g. 2025-01-15). Leave empty for no lower bound."
                    },
                    "dateTo": {
                        "title": "Date To",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "type": "string",
                        "description": "Only include complaints posted on or before this date. Format: YYYY-MM-DD. Leave empty for no upper bound."
                    },
                    "includeCompanyStats": {
                        "title": "Include Company Profile Rows",
                        "type": "boolean",
                        "description": "Emit one extra row per company with reputation data — overall score, response rate, average response time, total complaints, and category. The row is tagged recordType=\"company\". Disable for a tighter complaints-only output.",
                        "default": true
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
