Reclame Aqui Scraper - Complaints & Reputation avatar

Reclame Aqui Scraper - Complaints & Reputation

Pricing

from $9.20 / 1,000 row returneds

Go to Apify Store
Reclame Aqui Scraper - Complaints & Reputation

Reclame Aqui Scraper - Complaints & Reputation

Scrape Reclame Aqui, Brazil's consumer complaint site. One row per company: reputation score, index status, answer and resolution rates across five periods. One row per complaint: full text, the company's reply, the consumer's 0-10 rating, city and date. No login, no API key.

Pricing

from $9.20 / 1,000 row returneds

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Share

Reclame Aqui Scraper: complaints, replies and company reputation

Pulls two things off Reclame Aqui, Brazil's public consumer-complaint platform:

  1. The company's reputation card. The score out of 10, the index status (RA1000, Ótimo, Bom, Regular, Ruim, Não Recomendada), how many complaints came in, how many were answered, how many the consumer marked resolved, how many said they would buy again, and the average time to a first answer, for every period the site publishes: last 6 months, last 12 months, last calendar year, the year before that, and the last 3 years.
  2. The complaints themselves. Title, the full text the consumer wrote, status, the company's reply, the consumer's closing 0–10 score and comment, whether they would deal with the company again, city, state, the dates, and the public URL.

Give it a company and it returns both. Nothing else to configure.


What you put in

Any of these three, one per line, mixed freely:

{
"companies": [
"https://www.reclameaqui.com.br/empresa/nubank/",
"magazine-luiza-loja-online",
"Casas Bahia"
],
"maxComplaintsPerCompany": 50,
"includeCompanyProfile": true,
"includeCompanyReply": true,
"sortOrder": "newest"
}

A brand typed out gets looked up the same way the site's own search box does, and the best match wins. Big Brazilian retailers are split into several separate pages. "Loja Online", "Loja Física", "Marketplace" and the store card are four different companies with four different scores. If that distinction matters to you, paste the exact URL. When the actor has to guess, the company row carries matchedBy and an otherPagesForThisBrand list so you can see what else it could have picked.

Filters

InputWhat it does
complaintStatusANSWERED (the company replied) or PENDING (it has not). Those are the only two Reclame Aqui itself filters on
resolutiononly resolved, or only unresolved
onlyRatedonly complaints the consumer came back and scored
sortOrdernewest first, or oldest first. Oldest first starts at the company's very first complaint, which for a long-established brand means 2013
maxComplaintsPerCompanyset it to 0 to get the reputation card and skip the complaints entirely

What comes out

Two row shapes in one dataset, told apart by rowType.

rowType: "company"

{
"rowType": "company",
"companyId": "88850",
"companyName": "Nubank",
"shortname": "nubank",
"url": "https://www.reclameaqui.com.br/empresa/nubank/",
"cnpj": "18236120000158",
"segment": "Bancos e Financeiras",
"defaultPeriod": "last6Months",
"reputationScore": 8.7,
"indexStatus": "RA1000",
"consumerScore": 7.73,
"answeredPercent": 99.9,
"resolvedPercent": 93.3,
"wouldBuyAgainPercent": 81.2,
"averageAnswerHours": 98.1,
"complaintsTotalAllTime": 60372,
"complaintsLast30Days": 9393,
"periods": [
{
"period": "last12Months",
"from": "2025-09-01T00:00:00",
"to": "2026-08-31T23:59:59",
"reputationScore": 8.7,
"indexStatus": "RA1000",
"complaints": 115311,
"complaintsAnswered": 115064,
"complaintsNotAnswered": 148,
"complaintsRated": 48845,
"answeredPercent": 99.8,
"resolvedPercent": 92.4,
"wouldBuyAgainPercent": 80.2,
"averageAnswerHours": 114.2
}
],
"verifiedCompany": true,
"socialProfiles": [{ "type": "instagram", "url": "https://www.instagram.com/nubank/" }]
}

The headline numbers on that row are the period the site shows by default, the last six months. The other four are in periods, same shape, so a year-on-year comparison is one map away.

rowType: "complaint"

{
"rowType": "complaint",
"complaintId": "l06ktVrFogTC0m_D",
"complaintNumber": "259446661",
"companyName": "Nubank",
"title": "Nubank está retendo os meus contratos de empréstimo consignado do INSS",
"text": "Nubank retendo meus contratos de empréstimo consignado do inss...",
"status": "ANSWERED",
"answered": true,
"resolved": false,
"rated": true,
"consumerScore": 0,
"consumerComment": "infelizmente continua retendo meus contratos...",
"wouldBuyAgain": false,
"companyReply": "Olá. Somos o time do Reclame Aqui do Nubank e recebemos a sua manifestação...",
"companyReplyAt": "2026-09-18T17:27:49",
"companyReplyCount": 1,
"consumerReplies": [{ "text": "Continua sem solução.", "at": "2026-09-18T17:46:20" }],
"city": "Rio de Janeiro",
"state": "RJ",
"publishedAt": "2026-09-18T16:30:22",
"url": "https://www.reclameaqui.com.br/nubank/nubank-esta-retendo..._l06ktVrFogTC0m_D/"
}

status is the company's side: ANSWERED or PENDING. resolved is the consumer's side, and it only means something once rated is true. Most complaints from the last few days have not been rated yet, so resolved: false on a two-day-old row means "not yet", not "the company failed".


What this does not do

  • No consumer names, and none are available. Reclame Aqui does not publish them. The API returns **** for the complainant's name, e-mail and IP, and the public page shows only the city, the state and the date. So this actor emits the city and the state and nothing else about the person.
  • Free text gets masked before it is written. People do paste their own CPF, phone number or e-mail into a complaint, and companies sometimes quote it back. Every string field is scanned for e-mail addresses, CPF, CNPJ, CEP and Brazilian phone numbers, and any hit is replaced with [CPF removido] and friends. The run log says how many it caught. It is a pattern match, not magic, and it will not catch a number someone wrote out in words.
  • 5,100 complaints per company, per filter. That is Reclame Aqui's own listing ceiling, not a choice made here. To go further back, run the same company again with a filter set. Each combination of status, resolution and rating is its own 5,100-row listing, and
    sortOrder: "oldest"
    opens the other end of the history.
  • No private or deleted complaints, no "Reclame Aqui Verificada" internal tickets, no attachments, no images, no audio. Only what a signed-out visitor can read.
  • Sub-brands are separate companies. There is no roll-up for a group. Ask for each page.
  • averageAnswerHours is the site's own figure, carried through unchanged, not something computed from the complaints in your run.
  • It is paced. Reclame Aqui rate-limits bursts hard, so the actor keeps two requests in the air and slows itself down when it sees a refusal. Measured: 60 complaints plus the company card came back in 30 seconds with replies on, and 10 seconds with them off. Scale from there, and expect a few thousand complaints to take minutes, not seconds.
  • No sentiment scoring, no categories, no summaries. It returns what the site says.

Pricing

Pay per event. You are charged once per data row: one charge for a company profile row, one charge for each complaint row. Nothing else bills.

Free, always:

  • the sample row an empty run returns
  • every diagnostic row: a company Reclame Aqui does not have, a malformed input, a listing that came back empty, a run cut short by a refusal
  • the company lookup when you type a brand name instead of a short name

If a run returns nothing you asked for, it charges nothing for it.


FAQ

Is this the same score I see on the company's page? Yes. reputationScore and indexStatus are the figures Reclame Aqui publishes on the company page, for the same default period the page shows.

Do I need a Reclame Aqui login or an API key? No. Everything here is what a signed-out visitor can see.

Can I track a company over time? Run it on a schedule with maxComplaintsPerCompany: 0. That returns just the reputation card, one row, one charge, and the five periods let you see the trend inside a single run.

Can I get the complaints my own company received? Yes, and it is the main use for it. Put your own Reclame Aqui page in companies, set complaintStatus to PENDING, and you get everything waiting on an answer, with the text, the city and the link.

Why is companyReply null on some rows? Either the company has not replied yet (answered: false), or includeCompanyReply was off. The reply text lives on the complaint's own page, not in the listing, so it needs that extra read.

Why did "Americanas" return a different company than I expected? Because several exist. The company row's otherPagesForThisBrand lists the ones it did not pick. Copy the short name you want and put that in companies instead.

How far back does it go? As far as the company's history runs. Asking for the oldest first on a long-established retailer came back with a complaint filed in May 2013.

What happens if Reclame Aqui refuses mid-run? The rows already returned stay, and stay charged, because they are real. The run then writes one uncharged diagnostic row saying where it stopped and exits successfully rather than failing. A failed run would still bill you the start fee for nothing.

Which fields can be null? consumerScore, consumerComment and wouldBuyAgain until the consumer rates the complaint. companyReply until the company answers. cnpj, website and socialProfiles on companies that never filled them in. reputationScore and the percentages on a company that does not currently carry an index. The site shows -- there and this returns null rather than inventing a zero.