{
  "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": "nQLZ7bKHfMSzc47OY"
  },
  "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"
            }
          },
          "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
          },
          "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
          },
          "mobileBearerToken": {
            "title": "Trustpilot mobile Bearer JWT (advanced — only set when the built-in token expires)",
            "type": "string",
            "description": "Override the built-in mobile-gateway Bearer JWT. Leave blank to use the bundled token. The built-in token has a fixed expiry (the actor logs the date at startup) — once it lapses, every mobile API call returns 401 until you paste a fresh JWT here. **How to capture a fresh token:** intercept any request from the Trustpilot iOS app to `consumermobile-apigateway.trustpilot.com` and copy the `Authorization: Bearer …` header value (without the `Bearer ` prefix). Tools: mitmproxy, Charles Proxy, or any HTTPS-inspecting iOS debugger. The JWT's `exp` claim is auto-decoded and surfaced as the actor status."
          },
          "mobileApiKey": {
            "title": "Trustpilot mobile API key (advanced — rarely needs changing)",
            "type": "string",
            "description": "Override the built-in mobile-gateway `apikey` header. Leave blank unless the bundled key is rejected with HTTP 403. Captured from the same iOS-app traffic as the Bearer above (look for the `apikey: …` header)."
          },
          "mobileBearerAllRequests": {
            "title": "Send Bearer on every request (default: only on page 1)",
            "type": "boolean",
            "description": "By default we attach the Bearer JWT only to page-1 calls (mirroring the iOS app) and retry without it elsewhere. Toggle on if you supplied a fresh paying-user Bearer above and want every request authenticated — useful when scraping endpoints that require auth on every page.",
            "default": false
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy servers used for outbound requests. Trustpilot's mobile gateway is generally not blocked, so proxy is optional but recommended for high-volume runs.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}