Reclame Aqui API & Scraper
The ReclameAqui API returns Brazilian consumer-complaint data as clean JSON.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
The primary company/search endpoint resolves a company (name, slug, reputation), and you can pull company/detail, company/stats, company/complaints, search complaints and a complaint/detail. It is built for reputation monitoring and Brazilian market research that need ReclameAqui data without a scraper. One ReefAPI key, one shared credit pool, the standard envelope.
The reputation block, and the two identifiers you actually need
RA1000 is not a score and the score is not a percentage, which is the first thing that trips people up. A company carries one headline reputation object plus five separate period windows, each with its own score and date range. The numbers below are a live company/search on nubank in August 2026.
| Field | What it holds | Measured (nubank) |
|---|---|---|
| reputation.status | The seal, as a string. RA1000 is a status value, not a numeric rating | RA1000 |
| reputation.score | The 0-10 reputation index | 8.7 |
| reputation.consumer_score | A separate 0-10 consumer rating, computed from evaluations only | 7.7 |
| the three percent fields | 0-100 with one decimal, not fractions | 100.0 / 93.4 / 81.3 |
| average_response_time_seconds and _hours | Both are returned; seconds is a long float, hours is rounded | 378978.2 seconds, 105.27 hours |
| period_indexes | Five windows: SIX_MONTHS, TWELVE_MONTHS, LAST_YEAR, PAST_LAST_YEAR, LAST_THREE_YEARS, each with its own score plus start and end | 8.7 for the last six months against 8.4 for the year before last |
| id and shortname | The numeric company id comes back as a string; shortname is the URL slug | id 88850, shortname nubank |
| Complaint id and legacy_id | A 16-character opaque string, alongside the older integer id | wet7mKfYp_rT-dXo and 257467727 |
url_slug is the title slug plus an underscore plus the complaint id, so complaint/detail needs company_slug and that whole string. company/complaints takes company_id (the number), not the slug, so resolve with company/search first.
Real request and response JSON
Captured from the indexed primary action, company/search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/reclameaqui/v1/company/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "nubank"
}
}{
"ok": true,
"meta": {
"api": "reclameaqui",
"endpoint": "company/search",
"mode": "live",
"latency_ms": 4777.2,
"record_count": 1,
"bytes": 0,
"cache_hit": false
},
"data": {
"companies": [
{
"id": "88850",
"evolution_id": "667af[redacted-phone]ce-b9b3-f013cf1f03d1",
"name": "Nubank",
"fantasy_name": "Nubank",
"shortname": "nubank",
"description": "Somos uma fintech que nasceu para mudar como você lida com o seu dinheiro. Lutamos contra a burocracia para deixar você sempre no controle.",
"website": "http://www.nubank.com.br",
"company_url": "https://www.reclameaqui.com.br/empresa/nubank/",
"url_site": "http://www.nubank.com.br",
"verified": true,
"category": null,
"complaints_last_6_months": 57898,
"reputation": {
"status": "RA1000",
"score": 8.7,
"consumer_score": 7.7,
"answered_percent": 99.7,
"solved_percent": 93,
"would_buy_again_percent": 81.2,
"average_response_time_seconds": 387707.59291652235,
"average_response_time_hours": 107.7,
"total_complaints": 57898,
"answered": 57740,
"total_solved": 14507,
"total_not_solved": 1085,
"total_deal_again": 12657,
"total_not_deal_again": 2935,
"total_evaluations": 15592,
"evaluation_sum": 120028
},
"period_indexes": {
"SIX_MONTHS": {
"type": "[trimmed-depth]",
"status": "[trimmed-depth]",
"score": "[trimmed-depth]",
"consumer_score": "[trimmed-depth]",
"total_complaints": "[trimmed-depth]",
"total_answered": "[trimmed-depth]",
"total_not_answered": "[trimmed-depth]",
"answered_percent": "[trimmed-depth]",
"solved_percent": "[trimmed-depth]",
"would_buy_again_percent": "[trimmed-depth]",
"total_evaluated": "[trimmed-depth]",
"average_response_time_seconds": "[trimmed-depth]",
"average_response_time_3m_seconds": "[trimmed-depth]",
"start": "[trimmed-depth]",
"end": "[trimmed-depth]"
},
"TWELVE_MONTHS": {
"type": "[trimmed-depth]",
"status": "[trimmed-depth]",
"score": "[trimmed-depth]",
"consumer_score": "[trimmed-depth]",
"total_complaints": "[trimmed-depth]",
"total_answered": "[trimmed-depth]",
"total_not_answered": "[trimmed-depth]",
"answered_percent": "[trimmed-depth]",
"solved_percent": "[trimmed-depth]",
"would_buy_again_percent": "[trimmed-depth]",
"total_evaluated": "[trimmed-depth]",
"average_response_time_seconds": "[trimmed-depth]",
"average_response_time_3m_seconds": "[trimmed-depth]",
"start": "[trimmed-depth]",
"end": "[trimmed-depth]"
},
"LAST_YEAR": {
"type": "[trimmed-depth]",
"status": "[trimmed-depth]",
"score": "[trimmed-depth]",
"consumer_score": "[trimmed-depth]",
"total_complaints": "[trimmed-depth]",
"total_answered": "[trimmed-depth]",
"total_not_answered": "[trimmed-depth]",
"answered_percent": "[trimmed-depth]",
"solved_percent": "[trimmed-depth]",
"would_buy_again_percent": "[trimmed-depth]",
"total_evaluated": "[trimmed-depth]",
"average_response_time_seconds": "[trimmed-depth]",
"average_response_time_3m_seconds": "[trimmed-depth]",
"start": "[trimmed-depth]",
"end": "[trimmed-depth]"
},
"PAST_LAST_YEAR": {
"type": "[trimmed-depth]",
"status": "[trimmed-depth]",
"score": "[trimmed-depth]",
"consumer_score": "[trimmed-depth]",
"total_complaints": "[trimmed-depth]",
"total_answered": "[trimmed-depth]",
"total_not_answered": "[trimmed-depth]",
"answered_percent": "[trimmed-depth]",
"solved_percent": "[trimmed-depth]",
"would_buy_again_percent": "[trimmed-depth]",
"total_evaluated": "[trimmed-depth]",
"average_response_time_seconds": "[trimmed-depth]",
"average_response_time_3m_seconds": "[trimmed-depth]",
"start": "[trimmed-depth]",
"end": "[trimmed-depth]"
},
"LAST_THREE_YEARS": {
"type": "[trimmed-depth]",
"status": "[trimmed-depth]",
"score": "[trimmed-depth]",
"consumer_score": "[trimmed-depth]",
"total_complaints": "[trimmed-depth]",
"total_answered": "[trimmed-depth]",
"total_not_answered": "[trimmed-depth]",
"answered_percent": "[trimmed-depth]",
"solved_percent": "[trimmed-depth]",
"would_buy_again_percent": "[trimmed-depth]",
"total_evaluated": "[trimmed-depth]",
"average_response_time_seconds": "[trimmed-depth]",
"average_response_time_3m_seconds": "[trimmed-depth]",
"start": "[trimmed-depth]",
"end": "[trimmed-depth]"
}
},
"raw_keys": [
"additionalFields",
"documents",
"marketplaceConfiguration"
],
"pageviews": 2694596
}
]
}
}What the Reclame Aqui API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| company/search | resolve a company by name/slug | Support teams call company/search to resolve a company by name/slug. | query, slug |
| company/detail | company profile + reputation index | Reputation platforms call company/detail to get company profile + reputation index. | slug, company_id |
| company/stats | reputation metrics + main/performance problems | Market researchers call company/stats to get reputation metrics + main/performance problems. | slug, company_id |
| company/complaints | paginated complaints for a company | B2B review analysts call company/complaints to get paginated complaints for a company. | company_id, status, statuses, limit, page_size, ... |
| complaints/search | search complaints by keyword | Support teams call complaints/search to search complaints by keyword. | query, limit, page_size, date_from, date_to |
| complaint/detail | single complaint thread (HTML timeline) | Reputation platforms call complaint/detail to get single complaint thread (HTML timeline). | company_slug, complaint_url_slug |
Call company/search from your stack
curl -X POST https://api.reefapi.com/reclameaqui/v1/company/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"nubank"}'import requests
r = requests.post(
"https://api.reefapi.com/reclameaqui/v1/company/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "nubank"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/reclameaqui/v1/company/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "nubank"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.reclameaqui.company/search with {"query":"nubank"}.Who uses this API and why
- Reputation teams call company/stats to monitor a brand's ReclameAqui score.
- Researchers use complaints/search to find recurring complaint themes.
- Support tools use complaint/detail to review individual cases.
Questions developers ask before integrating
Is RA1000 a score out of 1000?
No. RA1000 is a seal, returned as reputation.status, and it sits next to a completely separate numeric score on a 0-10 scale. On a measured nubank lookup status was RA1000 and score was 8.7, with consumer_score at 7.7. The same status string repeats inside every period window, so a company can hold the seal in one window and a lower score in another.
Which complaint status values actually come back?
The filter enum and the returned vocabulary are not the same list. You filter with ANSWERED, EVALUATED, NOT_ANSWERED or PROCESSING, but a measured complaints/search returned rows whose status was PENDING with status_label 'Não respondida'. Read status_label if you want the Portuguese wording the site itself shows. Status is also independent of resolution: a row can be ANSWERED with solved false and status_label 'Respondida • Não resolvida'.
Why are problem_type.name, product_type.name and category.name null?
Complaint rows carry only the taxonomy ids, as 16-digit zero-padded strings such as 0000000000000091, with the name left null. The names live in company/stats, whose main_problems block returns categories, products and problems lists keyed by the same ids — 39, 36 and 43 entries respectively for nubank. Pull that once, cache it, and join locally. Store the ids as strings; parsing them as integers destroys the padding.
What does complaint/detail return that the list actions do not?
The reply thread and nothing else. A measured call returned the complaint url, company_responses[] and consumer_replies[], with a full company reply of about 3,700 characters. Title, body, status and dates are not repeated there, so keep the row from company/complaints and use detail purely to fetch the conversation. Timestamps inside that block are Brazilian format, '26/08/2026 às 18:25', while list rows use ISO 2026-08-26T16:59:43.
Is personal data included in complaints?
Consumer names are masked. Every measured row returned consumer_name as '****' while city and state stayed populated, for example Seropédica and RJ. The complaint title and description are the consumer's own text and are returned verbatim, including raw HTML such as <br/> tags in complaints/search results, so escape them before rendering.
How many complaints can I pull for one company?
255 is the public ceiling and the response tells you where it stopped. meta carries api_cap_records 255, plus stop_reason, pages, duplicates_removed, date_filtered_out and completeness_pct. A measured pull with limit 10 reported stop_reason limit_reached after 2 upstream pages with 0 duplicates removed. Use date_from and date_to to move the window rather than trying to page past the cap.
Why is complaint_url pointing at the company's own website?
In complaints/search that field can carry the company site rather than the complaint page — a measured Banco Safra row returned http://www.safra.com.br. company/complaints does return the real page, https://www.reclameaqui.com.br/nubank/<url_slug>/. If you are working from search results, build the link yourself from company_slug and url_slug instead of trusting the field.
Which window should I quote when comparing companies?
Say which one, because they diverge. For nubank the same reputation object reported 57,057 complaints over six months, 115,622 over twelve, and 347,147 over three years, with the score drifting from 8.4 in PAST_LAST_YEAR to 8.7 in SIX_MONTHS. Each period entry carries explicit start and end timestamps, so store those with the number rather than the label alone.
What is the Reclame Aqui API?
Reclame Aqui API is a ReefAPI endpoint group for brazilian company complaints and reputation. It returns live JSON through POST requests under /reclameaqui/v1.
Is the Reclame Aqui API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Reclame Aqui calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Reclame Aqui login or account?
No login to Reclame Aqui is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Reclame Aqui data?
The page example is captured from a live company/search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Reclame Aqui API use?
Reclame Aqui actions currently cost 1-3 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Reclame Aqui from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call reclameaqui actions with the same key, credit pool and JSON envelope used by normal REST requests.