{
  "openapi": "3.0.1",
  "info": {
    "title": "Trustpilot $0.75💰Reviews Ratings/Reply/Filter/Bypass 200 Limit",
    "description": "💰$0.75 per 1,000 results – Ratings, Replies & Filters. Enterprise-grade Trustpilot scraper that extracts 40+ data points per review with built-in analytics and 100% verified reviews coverage. Bypassing the limit of only the first 10 pages. Perfect for business intelligence and market research.",
    "version": "0.0",
    "x-build-id": "Z6m87bvzEiJAyV4em"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~trustpilot-scraper-ppe/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-trustpilot-scraper-ppe",
        "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~trustpilot-scraper-ppe/runs": {
      "post": {
        "operationId": "runs-sync-memo23-trustpilot-scraper-ppe",
        "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~trustpilot-scraper-ppe/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-trustpilot-scraper-ppe",
        "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": {
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Enter one item per row. Each value can be a Trustpilot `/review/` or `/users/` URL, a Trustpilot `/search?query=…` URL (the query is extracted and resolved via autosuggest, same as the Search filters field), a company URL, or a bare slug such as `bankfive`. Wrong `/review/` slugs trigger a Trustpilot search fallback. **Note on locale subdomains:** localized hosts (e.g. `fr.trustpilot.com`, `it.trustpilot.com`) are normalized to `www.trustpilot.com` so you don't accidentally miss reviews — Trustpilot's main `.com` page is multilingual and contains every review the locale subdomains do, plus more. If you want reviews in one specific language, use the **Languages to include** filter (`filterLanguages`) instead; submitting a locale subdomain alone won't restrict by language.",
            "items": {
              "type": "string"
            }
          },
          "searchTerms": {
            "title": "Brand names to search",
            "type": "array",
            "description": "One brand name per row, e.g. `nike`, `noom`, `marcovasco`. The scraper resolves each to its canonical business unit and (when 'Expand regional domains' is on) also sweeps every regional sibling on Trustpilot's index.",
            "items": {
              "type": "string"
            }
          },
          "painPointAnalysis": {
            "title": "Run AI pain-point analysis (one report per company)",
            "type": "boolean",
            "description": "Adds a single `painPointAnalysis` row per company alongside the reviews: the top complaint themes (each with a severity score and how often it recurs), the missing features users keep asking for, quick wins, overall sentiment, and a short summary — the 'what should we fix / build next' teardown, straight from real reviews. Analyzes up to 200 reviews per company. Requires a paid Apify plan; billed per company analyzed.",
            "default": false
          },
          "scrapeAllReviews": {
            "title": "Scrape all reviews -> eveything what is available",
            "type": "boolean",
            "description": "Controls the language scope sent to Trustpilot's gateway. **Enabled (default)**: requests `language=all`, fetching every language available on the BU — maximizes coverage but mixes locales (e.g. a `.com` URL returns Italian, French, German reviews alongside English). **Disabled**: the scraper derives a single language from the BU's country code (e.g. `bancamediolanum.it` → Italian, `darty.fr` → French, `nike.de` → German) so you get the locale-native slice — what a local visitor would see in their browser. If the BU's country doesn't have a known language mapping, the `language` param is omitted and the gateway uses its own default. The multi-language sweep that fires on huge BUs is also skipped when disabled. For a specific language regardless of BU country, use **Languages to include** below — an explicit filter overrides this setting.",
            "default": true
          },
          "filterStars": {
            "title": "Star ratings to include",
            "uniqueItems": true,
            "type": "array",
            "description": "Limit reviews to specific star ratings. Leave empty to include all ratings (1–5).",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ],
              "enumTitles": [
                "1 ★",
                "2 ★",
                "3 ★",
                "4 ★",
                "5 ★"
              ]
            },
            "default": []
          },
          "filterLanguages": {
            "title": "Languages to include",
            "type": "array",
            "description": "ISO 639-1 codes (e.g. `en`, `de`, `fr`, or `unknown` for reviews Trustpilot couldn't classify). Leave empty to auto-discover and sweep all languages found on each business unit. **This is the right knob to use if you want to restrict results to one language** — locale subdomains in start URLs (e.g. `it.trustpilot.com`) are intentionally normalized away to avoid silently losing reviews, so language filtering must be explicit here.",
            "items": {
              "type": "string"
            }
          },
          "filterDateRange": {
            "title": "Review date range",
            "enum": [
              "all",
              "last30days",
              "last3months",
              "last6months",
              "last12months"
            ],
            "type": "string",
            "description": "Server-side rolling date window. Equivalent to the iOS app's 'Date posted' filter. The gateway only accepts these enums; anything else returns HTTP 400. For an exact cutoff, use the 'Only scrape reviews newer than' field below — they compose (the more restrictive one wins).",
            "default": "all"
          },
          "filterVerifiedOnly": {
            "title": "Verified reviews only",
            "type": "boolean",
            "description": "Equivalent to the iOS app's 'Verified reviews' toggle. Sent server-side as `onlyVerified=true`, so the gateway prunes non-verified reviews before responding — no wasted requests. The canonical output's `isVerified` reflects truth (derived from `verificationLabel.type === 'verified'`; the raw response boolean is misleading).",
            "default": false
          },
          "filterRepliesOnly": {
            "title": "Reviews with company replies only",
            "type": "boolean",
            "description": "Equivalent to the iOS app's 'Reviews with replies' toggle. Sent server-side as `onlyWithReplies=true`, so the gateway prunes reviews without replies before responding.",
            "default": false
          },
          "filterCountries": {
            "title": "Reviewer countries to include",
            "type": "array",
            "description": "ISO 3166-1 alpha-2 country codes to keep, e.g. `US`, `GB`, `DE`. Matched against the reviewer's profile country (`consumer.countryCode`). Leave empty to keep all countries. The gateway has no server-side country filter, so this is applied client-side — non-matching reviews still cost a request and the drop count is logged in the per-URL summary.",
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Sort order",
            "enum": [
              "auto",
              "relevancy",
              "recent"
            ],
            "type": "string",
            "description": "How each review stream is ordered. `auto` picks `recent` whenever a start date is set (so the cutoff actually short-circuits pagination) and `relevancy` otherwise.",
            "default": "auto"
          },
          "expandRegionalDomains": {
            "title": "Expand regional domains",
            "type": "boolean",
            "description": "After resolving each input, also fetch every regional sibling on Trustpilot's index that matches the same brand (e.g. `nike` → `nike.com`, `nike.uk`, `nike.de`, `nike.dk`, …). Strict displayName matching keeps unrelated brands out. Shared `maxItems` budget across siblings.",
            "default": true
          },
          "strictNameMatch": {
            "title": "Strict brand-name matching",
            "type": "boolean",
            "description": "When ON, reject autosuggest hits whose business name doesn't look like your query (e.g. `FACTORHY Avocats` → `Omega Avocats` is rejected because the only shared word is the generic `avocats`). Useful when you'd rather see `BU not found` than reviews from an adjacent-but-wrong company. When OFF (default), accept whatever Trustpilot's autosuggest returns — some data is better than none.",
            "default": false
          },
          "splitDatasets": {
            "title": "Split BU metadata into a separate dataset",
            "type": "boolean",
            "description": "When ON, reviews go to the default dataset (clean, one row per review, no embedded `company`/`stats`/`transparency`) and BU metadata goes to a per-run sibling dataset named `businessUnits-<runId>` (one row per unique BU). Each review carries a `businessUnitId` you can JOIN on. The exact dataset id is written to this run's `OUTPUT` record (`businessUnitsDatasetId`). Solves the 95%-duplicated-data problem on large runs (a 1,500-review BU sweep no longer repeats ~3 KB of metadata 1,500 times). When OFF (default), preserve the legacy embedded-per-row shape so existing pipelines don't break.",
            "default": false
          },
          "flattenCompanyData": {
            "title": "Flat company columns (CSV/Excel friendly)",
            "type": "boolean",
            "description": "When ON, each review gets flat top-level company columns — `companyName`, `companyDomain`, `companyWebsite`, `companyTrustScore`, `companyStars`, `companyTotalReviews`, `companyCountryCode`, `companyUrl` — instead of (or alongside) the nested `company` object. Ideal for CSV/Excel exports where nested objects flatten into awkward `company/score/trustScore` columns. Works even without `includeCompanyDetails` (these are derived from the business unit we already resolved, at no extra cost). When OFF (default), output shape is unchanged.",
            "default": false
          },
          "emitInputStatus": {
            "title": "Report inputs that returned no reviews",
            "type": "boolean",
            "description": "When ON (default), any input that returns no reviews (brand not found on Trustpilot, empty business unit, or everything excluded by your filters) gets one diagnostic row in a per-run dataset named `inputStatus-<runId>` — with a machine-readable `reason` and a human-readable `detail`. The exact dataset id is written to this run's `OUTPUT` record (`inputStatusDatasetId`). Lets you see exactly which of your inputs came back empty and why, instead of silently missing from the output. This is a side channel: it never adds rows to your reviews dataset and is never billed. Turn OFF to suppress.",
            "default": true
          },
          "startDate": {
            "title": "Only scrape reviews newer than [date]",
            "type": "string",
            "description": "Format YYYY-MM-DD, e.g., 2022-02-20. Used as a hard chronological cutoff: when set, the scraper switches to `sort=createdAt:desc` and short-circuits pagination as soon as it crosses the date."
          },
          "includeCompanyDetails": {
            "title": "Include company details in output",
            "type": "boolean",
            "description": "When enabled, each review item is enriched with the `company` block (display name, identifying domain, country, total review count, …).",
            "default": false
          },
          "includeStats": {
            "title": "Include statistics in output",
            "type": "boolean",
            "description": "When enabled, each review item is enriched with the `stats` block (total review count, per-star rating distribution, …).",
            "default": false
          },
          "includeTransparency": {
            "title": "Include transparency page data",
            "type": "boolean",
            "description": "When enabled, each review item is enriched with the `transparency` block (collecting method distribution, stars breakdown by method, monthly data, etc.).",
            "default": false
          },
          "includeCompanyAdditionalFields": {
            "title": "Include extra company fields (consumerAlert, hasCollectedIncentivisedReviews, basiclinkRate)",
            "type": "boolean",
            "description": "On-demand enrichment. When enabled, each review's `company` block is augmented with `consumerAlert`, `consumerAlerts`, `hasCollectedIncentivisedReviews`, and (when still exposed by Trustpilot) `basiclinkRate`. Costs one extra HTTP request per unique business unit. Has no effect unless 'Include company details in output' is also enabled.",
            "default": false
          },
          "maxItems": {
            "title": "Limit the number of reviews per URL or search filter",
            "type": "integer",
            "description": "Per-input cap. With 3 inputs and `maxItems=30`, you can collect up to 90 reviews total (30 per input). When 'Expand regional domains' is on, this budget is shared across the primary BU and all its regional siblings.",
            "default": 10000
          },
          "maxConcurrency": {
            "title": "Max Concurrency",
            "type": "integer",
            "description": "Maximum number of inputs being processed in parallel (each input runs many sequential page fetches).",
            "default": 10
          },
          "minConcurrency": {
            "title": "Min Concurrency",
            "type": "integer",
            "description": "Minimum number of inputs that will be processed at the same time.",
            "default": 1
          },
          "maxRequestRetries": {
            "title": "Max Request Retries",
            "type": "integer",
            "description": "Number of times the scraper will retry a failed mobile-gateway request before giving up.",
            "default": 100
          },
          "proxy": {
            "title": "Proxy configuration (optional override)",
            "type": "object",
            "description": "Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}