{
  "openapi": "3.0.1",
  "info": {
    "title": "Trustpilot Reviews Scraper - Ratings, Replies & Filters",
    "description": "Scrape Trustpilot reviews for any company: rating, title, text, dates, reviewer country, verification and company replies. Filter by stars, language, date or keyword and go past the usual ~200-review window. No login needed.",
    "version": "0.1",
    "x-build-id": "FP1nKRsF2ocJkyfoa"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/zenomastro~trustpilot-reviews-reliable/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-zenomastro-trustpilot-reviews-reliable",
        "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/zenomastro~trustpilot-reviews-reliable/runs": {
      "post": {
        "operationId": "runs-sync-zenomastro-trustpilot-reviews-reliable",
        "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/zenomastro~trustpilot-reviews-reliable/run-sync": {
      "post": {
        "operationId": "run-sync-zenomastro-trustpilot-reviews-reliable",
        "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": "Companies or Trustpilot review URLs",
            "minItems": 0,
            "maxItems": 100,
            "type": "array",
            "description": "Company domains (booking.com) or Trustpilot review URLs (https://www.trustpilot.com/review/booking.com), up to 100. Can be combined with brand searches and category pages; leave it empty to scrape only what they find. Also accepted: companyUrls, startUrls.",
            "items": {
              "type": "string"
            }
          },
          "companySearchQueries": {
            "title": "Brand/company search queries",
            "maxItems": 25,
            "type": "array",
            "description": "Search Trustpilot for brands or companies by name, then scrape the review profiles found (up to Maximum discovered companies). Also accepted: searchTerms.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "categoryUrls": {
            "title": "Trustpilot category/listing URLs",
            "maxItems": 25,
            "type": "array",
            "description": "Optional public Trustpilot category or listing pages, e.g. https://www.trustpilot.com/categories/electronics_technology. Company profiles found on these pages are scraped too.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxReviewsPerCompany": {
            "title": "Maximum reviews per company",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Maximum matching review rows emitted for each unique company. Set 0 to collect as many reviews as Trustpilot shows without login across its star, language and date slices (up to 10,000 per company, still capped by Maximum total reviews); 0 turns on deep pagination automatically. Raise Maximum pages per filter slice to 10 to read each slice as deep as Trustpilot allows.",
            "default": 100
          },
          "maxTotalReviews": {
            "title": "Maximum total reviews",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "Hard cap across all companies for predictable runtime and spend. Also accepted: maxItems.",
            "default": 1000
          },
          "sortBy": {
            "title": "Review order",
            "enum": [
              "newest",
              "relevance"
            ],
            "type": "string",
            "description": "Newest first or Trustpilot relevance order. Also accepted: sort (recency or relevance).",
            "default": "newest"
          },
          "starRatings": {
            "title": "Star ratings",
            "uniqueItems": true,
            "type": "array",
            "description": "Optional star filters. Empty means all 1-5 star ratings. When you pick several ratings (for example 1 and 2 stars for bad reviews), each rating is requested from Trustpilot separately; with deep pagination off the per-company limit is shared evenly between them. Also accepted: stars.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ],
              "enumTitles": [
                "1 star",
                "2 stars",
                "3 stars",
                "4 stars",
                "5 stars"
              ]
            },
            "default": []
          },
          "languageCodes": {
            "title": "Review languages",
            "type": "array",
            "description": "Optional ISO language codes such as en, de, fr, it. Empty means all languages and enables automatic language slicing for very deep runs. Also accepted: languages, filterLanguages.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "reviewerCountries": {
            "title": "Reviewer countries",
            "type": "array",
            "description": "Optional 2-letter ISO country codes of the reviewer, such as US, GB, DE, IT. Empty means all countries. Trustpilot has no country filter, so the Actor scans more pages (deep pagination turns on) and bills only matching reviews. Also accepted: filterCountries.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "reviewedAfter": {
            "title": "Published after",
            "type": "string",
            "description": "Optional inclusive lower boundary: YYYY-MM-DD or ISO 8601. The Actor asks Trustpilot for the matching date window and, with newest-first order, stops paging once reviews get older than this date. Also accepted: publishedAfter, startDate.",
            "default": ""
          },
          "reviewedBefore": {
            "title": "Published before",
            "type": "string",
            "description": "Optional inclusive upper boundary: YYYY-MM-DD or ISO 8601.",
            "default": ""
          },
          "lastDays": {
            "title": "Only the last N days",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "Rolling window for scheduled runs: only reviews published in the last N days (0 = off). Combined with Published after, the later date wins.",
            "default": 0
          },
          "containsText": {
            "title": "Review text contains",
            "type": "string",
            "description": "Optional case-insensitive keyword across review title and text. Filtered rows are not billed.",
            "default": ""
          },
          "containsAny": {
            "title": "Review contains any of these keywords",
            "maxItems": 100,
            "type": "array",
            "description": "Keep a review when its title or text mentions at least one of these words or phrases (case-insensitive), e.g. refund, scam, late delivery. This filter runs on the Actor side, so deep pagination turns on by itself. Filtered rows are not billed. Up to 100.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "containsAll": {
            "title": "Review contains all of these keywords",
            "maxItems": 100,
            "type": "array",
            "description": "Keep a review only when every one of these words or phrases appears in its title or text (case-insensitive). Deep pagination turns on by itself. Up to 100.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude reviews with these keywords",
            "maxItems": 100,
            "type": "array",
            "description": "Drop a review when its title or text mentions any of these words or phrases (case-insensitive), e.g. giveaway. Dropped rows are not billed. Up to 100.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "verifiedOnly": {
            "title": "Verified reviews only",
            "type": "boolean",
            "description": "Only emit reviews whose Trustpilot verification label reports isVerified=true. Also accepted: verified, filterVerifiedOnly.",
            "default": false
          },
          "companyReply": {
            "title": "Company reply",
            "enum": [
              "any",
              "yes",
              "no"
            ],
            "type": "string",
            "description": "Return any reviews, only reviews with a company reply, or only reviews without a reply. Also accepted: withReplies, filterRepliesOnly (true).",
            "default": "any"
          },
          "minLikes": {
            "title": "Minimum useful/like count",
            "minimum": 0,
            "type": "integer",
            "description": "Only emit reviews with at least this many Trustpilot likes/useful votes.",
            "default": 0
          },
          "monitorName": {
            "title": "Review monitor name",
            "type": "string",
            "description": "Reuse the same name on scheduled runs to remember the reviews already delivered; each review gets isNew true/false. Letters, numbers, dot, underscore or hyphen.",
            "default": ""
          },
          "onlyNew": {
            "title": "Emit only new reviews",
            "type": "boolean",
            "description": "Output and bill only reviews that earlier runs with the same monitor name did not deliver. Without a Review monitor name, one is derived from the companies, searches and category pages.",
            "default": false
          },
          "includeBusinessSummary": {
            "title": "Include business summary",
            "type": "boolean",
            "description": "Add one free company-summary row with TrustScore, total reviews, categories, contact and profile data, claim status, reply behaviour, and review-language and star statistics.",
            "default": true
          },
          "includeReviewInsights": {
            "title": "Include review insights",
            "type": "boolean",
            "description": "Add one free analytics row per company for the matching reviews: average score, score distribution, reply rate overall and per star, company reply time (average and median hours), verified share, monthly trend, top complaint keywords (1-2 stars) and praise keywords (4-5 stars), Insight keyword mentions, and language, country and source distributions. Plain word counting, no AI.",
            "default": true
          },
          "insightKeywords": {
            "title": "Insight keywords",
            "maxItems": 100,
            "type": "array",
            "description": "Words or phrases counted in the free review insights row: how many matching reviews mention each one. Up to 100.",
            "default": [
              "refund",
              "delivery",
              "customer service",
              "support"
            ],
            "items": {
              "type": "string"
            }
          },
          "deepPagination": {
            "title": "Deep pagination beyond the first 200 reviews",
            "type": "boolean",
            "description": "Automatically segment by star rating and language to reach review history beyond Trustpilot's normal anonymous pagination window. Switches on by itself when Maximum reviews per company is 0, or a reviewer-country or keyword-list filter is set. When it is off and a company has more reviews than the standard window, the business summary explains it in coverageNote.",
            "default": false
          },
          "maxPagesPerSlice": {
            "title": "Maximum pages per filter slice",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Trustpilot exposes 20 reviews per page and normally caps anonymous browsing at 10 pages per filter combination.",
            "default": 5
          },
          "maxAutoLanguages": {
            "title": "Maximum automatic language slices",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "For very deep runs, cap the number of automatically discovered languages used for star x language segmentation.",
            "default": 5
          },
          "maxDiscoveredCompanies": {
            "title": "Maximum discovered companies",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Hard cap across brand searches and category pages.",
            "default": 50
          },
          "maxRuntimeSecs": {
            "title": "Safe runtime budget",
            "minimum": 120,
            "maximum": 3300,
            "type": "integer",
            "description": "Soft runtime cap in seconds. The Actor stops cleanly with partial results before this budget and before the run's own timeout (whichever comes first), so runs do not time out.",
            "default": 1200
          },
          "browserTimeoutSecs": {
            "title": "Browser/session timeout",
            "minimum": 20,
            "maximum": 120,
            "type": "integer",
            "description": "Maximum seconds to pass Trustpilot's browser challenge and initialize a company session.",
            "default": 45
          },
          "requestTimeoutSecs": {
            "title": "Review JSON request timeout",
            "minimum": 10,
            "maximum": 60,
            "type": "integer",
            "description": "Maximum seconds for each paginated Trustpilot JSON request.",
            "default": 25
          },
          "retries": {
            "title": "Retries",
            "minimum": 0,
            "maximum": 3,
            "type": "integer",
            "description": "Retries a company session after transient browser/WAF/network failures.",
            "default": 1
          },
          "autoProxyFallback": {
            "title": "Automatic Apify Proxy fallback",
            "type": "boolean",
            "description": "Try direct Chromium first; if Trustpilot blocks the session, retry through Apify Proxy when available.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional explicit proxy configuration. Leave disabled for direct-first mode.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}