{
  "openapi": "3.0.1",
  "info": {
    "title": "ReclameAqui Brand Monitor: Complaint Threads & RA Scores",
    "description": "Monitor any Brazilian brand on ReclameAqui. Get every complaint with the company's full reply thread, plus the reputation scorecard buyers judge on — score, RA status, response and resolution rates, average answer time, CNPJ. Incremental runs emit only what changed. No browser.",
    "version": "0.0",
    "x-build-id": "J5e4zY0DvEbnZzCQe"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~reclameaqui-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-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/memo23~reclameaqui-scraper/runs": {
      "post": {
        "operationId": "runs-sync-memo23-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/memo23~reclameaqui-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-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": "ReclameAqui companies",
            "type": "array",
            "description": "One per line. Use the part of the company's ReclameAqui link after /empresa/ (magazine-luiza-loja-online), the whole link, or the name, which is turned into that form (Mercado Livre becomes mercado-livre). If a name finds nothing, paste the link instead.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Company or complaint links",
            "type": "array",
            "description": "Optional ReclameAqui links. A company page link works like an entry above. A link to one complaint saves that complaint with its whole conversation.",
            "items": {
              "type": "string"
            }
          },
          "statusFilter": {
            "title": "Complaint lists to read",
            "type": "array",
            "description": "Newest of any state (default) is mostly complaints still waiting for an answer. To get complaints with a company reply, pick answered, rated or resolved. Several lists can be read in one run.",
            "items": {
              "type": "string",
              "enum": [
                "LATEST",
                "PENDING",
                "ANSWERED",
                "EVALUATED",
                "SOLVED",
                "UNSOLVED"
              ],
              "enumTitles": [
                "Newest of any state",
                "Waiting for an answer",
                "Answered by the company",
                "Rated by the consumer",
                "Resolved",
                "Not resolved"
              ]
            },
            "default": [
              "LATEST"
            ]
          },
          "dateFrom": {
            "title": "Posted on or after",
            "type": "string",
            "description": "Optional date as YYYY-MM-DD, e.g. 2026-01-01. Older complaints are skipped."
          },
          "dateTo": {
            "title": "Posted on or before",
            "type": "string",
            "description": "Optional date as YYYY-MM-DD. Newer complaints are skipped."
          },
          "solvedOnly": {
            "title": "Only complaints marked resolved",
            "type": "boolean",
            "description": "On: keep a complaint only if the consumer said the problem was solved.",
            "default": false
          },
          "withReplyOnly": {
            "title": "Only complaints the company answered",
            "type": "boolean",
            "description": "On: keep a complaint only if the company replied at least once.",
            "default": false
          },
          "includeKeywords": {
            "title": "Must mention one of",
            "type": "array",
            "description": "Optional words or phrases, e.g. reembolso or entrega. A complaint is kept when its title, text, problem type, product or category contains any of them.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Skip if it mentions",
            "type": "array",
            "description": "Optional words or phrases. A complaint that contains any of them in the same places is skipped.",
            "items": {
              "type": "string"
            }
          },
          "maxComplaintsPerCompany": {
            "title": "Complaints per company",
            "minimum": 0,
            "type": "integer",
            "description": "Each company stops after this many complaints, default 100. 0: no limit, which for a large brand can mean hundreds of thousands.",
            "default": 100
          },
          "scrapeComplaints": {
            "title": "Complaint rows",
            "type": "boolean",
            "description": "On (default): one row per complaint. Turn it off to get only the company reputation rows.",
            "default": true
          },
          "includeCompanyProfile": {
            "title": "Company reputation row",
            "type": "boolean",
            "description": "On (default): one extra row per company with its ReclameAqui score and label (Ótimo, Bom, Regular, Ruim), RA1000 status, answer, solution and come-back rates, average answer time, complaint totals for several periods, segment, CNPJ, website, phones and address.",
            "default": true
          },
          "includeInteractions": {
            "title": "Add the full conversation",
            "type": "boolean",
            "description": "Off (default). On: each complaint row also gets every company answer, consumer reply and the final rating, as text, HTML and Markdown. Each complaint is opened separately for this, so runs take longer.",
            "default": false
          },
          "extractContacts": {
            "title": "Pull emails and phones from complaint text",
            "type": "boolean",
            "description": "On: emails and phone numbers written in the complaint or its replies go into contactEmails and contactPhones.",
            "default": false
          },
          "enrichEmails": {
            "title": "Find emails on the company's website",
            "type": "boolean",
            "description": "Off (default). On: the website listed on the company's ReclameAqui profile is searched for business emails, which land in enrichedEmails on the company row. Charged only when an email is found.",
            "default": false
          },
          "flatten": {
            "title": "Flat columns for CSV and Excel",
            "type": "boolean",
            "description": "On (default): nested values become their own columns joined with underscores, and lists of objects become JSON text. Off: rows keep their nested JSON shape.",
            "default": true
          },
          "compact": {
            "title": "Short rows",
            "type": "boolean",
            "description": "On: complaint rows keep about ten columns (id, link, title, state, date, resolved, replied, company, problem type) and company rows keep the score, label, rates and totals.",
            "default": false
          },
          "excludeEmptyFields": {
            "title": "Leave out empty fields",
            "type": "boolean",
            "description": "On: fields with no value are removed from each row instead of appearing as null or empty.",
            "default": false
          },
          "descriptionFormat": {
            "title": "Complaint text as",
            "enum": [
              "text",
              "markdown",
              "html",
              "all"
            ],
            "type": "string",
            "description": "Which versions of each complaint's text to keep. All three (default) gives plain text, HTML and Markdown side by side.",
            "default": "all"
          },
          "descriptionMaxLength": {
            "title": "Cut complaint text at",
            "minimum": 0,
            "type": "integer",
            "description": "Longest complaint text kept, in characters. 0 (default): the whole text.",
            "default": 0
          },
          "incrementalMode": {
            "title": "Only what changed since the last run",
            "type": "boolean",
            "description": "Off (default). On: each record is marked NEW, UPDATED, UNCHANGED or EXPIRED against earlier runs, and only new and updated ones are saved unless you turn on the options below. Rows that are not saved are not charged.",
            "default": false
          },
          "detectUpdates": {
            "title": "Re-check known complaints for edits",
            "type": "boolean",
            "description": "Off (default). On: complaints already in the memory are read again, so edited text and new company replies show up as UPDATED. Runs take longer.",
            "default": false
          },
          "emitUnchanged": {
            "title": "Also save unchanged records",
            "type": "boolean",
            "description": "On: records with no change since the last run are saved too, marked UNCHANGED.",
            "default": false
          },
          "emitExpired": {
            "title": "Also save records that disappeared",
            "type": "boolean",
            "description": "On: records from earlier runs that are gone from ReclameAqui are saved, marked EXPIRED. This happens only when the run read every list to the end, because a run that stopped at a limit cannot tell gone from not reached.",
            "default": false
          },
          "stateKey": {
            "title": "Change-tracking name",
            "type": "string",
            "description": "Optional. The memory is named after your companies and settings, so a run with a different input starts fresh. Give a name here to share one memory between runs whose input differs."
          },
          "notifyOnlyNew": {
            "title": "Alert on new records only",
            "type": "boolean",
            "description": "On (default): with scheduled runs on, alerts list only records that are new since the last run.",
            "default": true
          },
          "notificationLimit": {
            "title": "Records per alert",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many records each Slack, Discord, Telegram or WhatsApp message lists, default 10, at most 20.",
            "default": 10
          },
          "webhookUrl": {
            "title": "Webhook address",
            "type": "string",
            "description": "Optional. Gets a JSON POST with the run summary and the alert list (title, company, place, link), e.g. for n8n, Make or Zapier."
          },
          "webhookHeaders": {
            "title": "Headers for that webhook",
            "type": "object",
            "description": "Optional JSON object of headers sent with the webhook POST. They are saved with the run input, so use a short-lived token rather than a long-lived secret."
          },
          "slackWebhookUrl": {
            "title": "Slack incoming webhook",
            "type": "string",
            "description": "Optional. The alert is posted to the Slack channel behind this link."
          },
          "discordWebhookUrl": {
            "title": "Discord channel webhook",
            "type": "string",
            "description": "Optional. The alert is posted to the Discord channel behind this link."
          },
          "telegramChatId": {
            "title": "Telegram chat",
            "type": "string",
            "description": "Optional. ID of the chat or channel your bot posts the alert to. Needs the bot token below."
          },
          "telegramToken": {
            "title": "Token of your Telegram bot",
            "type": "string",
            "description": "Optional. From BotFather. Used with the chat above."
          },
          "whatsappTo": {
            "title": "WhatsApp number to message",
            "type": "string",
            "description": "Optional. Number that receives the alert, with country code, e.g. 5511999999999. Needs the two fields below."
          },
          "whatsappPhoneNumberId": {
            "title": "WhatsApp sender number ID",
            "type": "string",
            "description": "The phone number ID of your WhatsApp Business sender, from Meta's developer dashboard."
          },
          "whatsappAccessToken": {
            "title": "WhatsApp Cloud API token",
            "type": "string",
            "description": "Access token of your WhatsApp Business app."
          },
          "maxItems": {
            "title": "Rows in the whole run",
            "minimum": 0,
            "type": "integer",
            "description": "The run stops after this many saved rows, complaints and company rows together, default 1000. 0: no limit. On the free Apify plan a run stops at 100.",
            "default": 1000
          },
          "maxConcurrency": {
            "title": "Complaints opened at once",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many complaints are opened in parallel while the full conversation is on, default 5, at most 20.",
            "default": 5
          },
          "minDelayMs": {
            "title": "Pause between requests (ms)",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Wait after each request, default 250. A shorter pause can mean more retries.",
            "default": 250
          },
          "proxy": {
            "title": "Your own proxy (optional)",
            "type": "object",
            "description": "Leave empty and the run uses its own connection in Brazil. If you set a proxy here, it is used as configured; choose residential exits in Brazil."
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}