{
  "openapi": "3.0.1",
  "info": {
    "title": "Trustpilot Scraper: Reviews, Star Breakdown & Company Stats",
    "description": "Scrape Trustpilot business profiles and reviews on any country domain: TrustScore, the exact 1-5 star distribution in counts and percentages, reply rate, claim and verification status, contact block, plus reviews with verification badge and company reply. Keyword, category sweep or pasted links.",
    "version": "1.0",
    "x-build-id": "eSOHuuVXE4JEasPxB"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~trustpilot-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-trustpilot-reviews-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/abotapi~trustpilot-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-trustpilot-reviews-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/abotapi~trustpilot-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-trustpilot-reviews-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Search finds businesses by keyword or sweeps a whole Trustpilot category. URL mode reads the exact Trustpilot links (or bare company domains) you paste.",
            "default": "search"
          },
          "searchType": {
            "title": "Search type",
            "enum": [
              "keyword",
              "category"
            ],
            "type": "string",
            "description": "Search mode only. Keyword searches Trustpilot's business index; Category sweeps every business listed under one Trustpilot category id.",
            "default": "keyword"
          },
          "query": {
            "title": "Search query",
            "type": "string",
            "description": "Search mode with Search type = Keyword. A company name, brand or domain, for example \"bookshop.org\" or \"nike\".",
            "default": "bookshop.org"
          },
          "category": {
            "title": "Category id",
            "type": "string",
            "description": "Search mode with Search type = Category. The Trustpilot category id from the category page URL, for example \"book_store\" from https://www.trustpilot.com/categories/book_store. Also accepts a full category URL.",
            "default": "book_store"
          },
          "urls": {
            "title": "Trustpilot links or company domains",
            "type": "array",
            "description": "URL mode only. One entry per line. Accepts a Trustpilot profile link (https://www.trustpilot.com/review/bookshop.org), a bare company domain (bookshop.org), a category link (https://www.trustpilot.com/categories/book_store) or a search link (https://www.trustpilot.com/search?query=nike). Category and search links are walked forward; profile links and domains are read as single businesses. Multi-value supported.",
            "items": {
              "type": "string"
            }
          },
          "site": {
            "title": "Trustpilot country domain",
            "type": "string",
            "description": "Which Trustpilot country domain to read. Applies in BOTH modes (a pasted link keeps its own domain). Examples: www.trustpilot.com (global), uk.trustpilot.com, de.trustpilot.com, fr.trustpilot.com, nl.trustpilot.com, dk.trustpilot.com, it.trustpilot.com, es.trustpilot.com. Each domain fronts the same business data but ranks and localises its category listings for that market.",
            "default": "www.trustpilot.com"
          },
          "scrapeReviews": {
            "title": "Scrape reviews",
            "type": "boolean",
            "description": "Return each business's individual reviews as their own rows (reviewer display name, rating, title, text, verification badge, dates, and the company's reply). Turn this off to return business profiles only. 💲 In Search mode, turning this ON (or Fetch business details) reads each discovered business's own profile page and charges the profile-enrichment event once per business returned.",
            "default": true
          },
          "maxReviewsPerBusiness": {
            "title": "Max reviews per business",
            "minimum": 0,
            "type": "integer",
            "description": "How many reviews to return for each business (20 per page). This is a per-business budget, not the run cap: Max items below is what bounds the whole run. Use 0 to take every review Trustpilot serves for the active filters.",
            "default": 20
          },
          "reviewStars": {
            "title": "Star ratings",
            "type": "array",
            "description": "Only return reviews with these star ratings. Leave empty for all ratings. Applied by Trustpilot itself, so the star breakdown on the business row still reports the FULL distribution while the review rows are narrowed.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ],
              "enumTitles": [
                "1 star",
                "2 stars",
                "3 stars",
                "4 stars",
                "5 stars"
              ]
            },
            "default": []
          },
          "reviewLanguage": {
            "title": "Review language",
            "type": "string",
            "description": "Two-letter language code to restrict reviews to, for example \"en\", \"de\", \"it\". The default \"all\" reads every language: Trustpilot itself defaults to the visitor's language and silently hides the rest, which is why a business with 45,986 reviews shows only 30,234 to a default English visitor.",
            "default": "all"
          },
          "reviewSort": {
            "title": "Review order",
            "enum": [
              "recency",
              "relevance"
            ],
            "type": "string",
            "description": "Order Trustpilot returns reviews in.",
            "default": "recency"
          },
          "verifiedOnly": {
            "title": "Verified reviews only",
            "type": "boolean",
            "description": "Only return reviews Trustpilot marks as verified (an invitation or a confirmed purchase behind them). Applied by Trustpilot itself.",
            "default": false
          },
          "reviewsSince": {
            "title": "Review age",
            "enum": [
              "any",
              "last30days",
              "last3months",
              "last6months",
              "last12months"
            ],
            "type": "string",
            "description": "Only return reviews published within this window. Applied by Trustpilot itself.",
            "default": "any"
          },
          "reviewKeyword": {
            "title": "Review keyword",
            "type": "string",
            "description": "Only return reviews whose text matches this keyword, for example \"refund\" or \"delivery\". Leave empty for all reviews. Applied by Trustpilot itself.",
            "default": ""
          },
          "fetchDetails": {
            "title": "Fetch business details",
            "type": "boolean",
            "description": "Search mode only (a pasted profile link or domain always returns full details). Reads each discovered business's own profile page to add the exact star-distribution breakdown, reply behaviour, claim and verification status, full contact block and category breadcrumb. Turn it off to return only what the listing card carries. 💲 Charges the profile-enrichment event once per business returned, as described in the section caption.",
            "default": true
          },
          "minTrustScore": {
            "title": "Minimum TrustScore",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Only return businesses whose TrustScore is at least this value (0 to 5). Leave at 0 for all businesses. Applied after each business is read, in both modes.",
            "default": 0
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap on the total number of rows returned across the whole run, counting business profiles and review rows together. Use 0 for no limit; the run then stops when the results run out.",
            "default": 50
          },
          "maxPages": {
            "title": "Max pages per scope",
            "minimum": 0,
            "type": "integer",
            "description": "Upper bound on how many pages each category, search or business review list is walked through. Defaults wide open (0), so Max items is the only cap that stops a run early.",
            "default": 0
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large pull without returning, or charging for, rows already collected there. Use this after an interrupted run. For recurring monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns every business and review as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED rows. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately for each search and review-filter setup; use State key to name or deliberately share a monitoring campaign.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the search and review-filter settings."
          },
          "emitUnchanged": {
            "title": "Emit unchanged rows (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return rows that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired rows (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return rows that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked scope: not when Max items capped it, not when a page could not be read, and not when Resume was used. This returns, and bills, extra synthetic rows.",
            "default": false
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write or digest. Leave empty to skip; never changes the dataset output.",
            "items": {
              "type": "string"
            }
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy settings. Trustpilot refuses ordinary connections on every route, so this actor tries the connection you configure here first and, only if that one is refused, switches once to Apify Proxy's enhanced connection tier for the rest of the run. Keep Apify Proxy enabled or the run will have nothing to fall back to.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}