{
  "openapi": "3.0.1",
  "info": {
    "title": "Trustpilot Scraper — All Reviews, Contacts & No 200 Cap",
    "description": "Scrape every Trustpilot review — past the 200-review page cap — with ratings, full text, verification, reviewer profiles, company replies, TrustScore and the full star distribution. Find companies by keyword or category with email, phone and address. Incremental monitoring and alerts.",
    "version": "0.2",
    "x-build-id": "SEbxhja5PfsWNzO6o"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/corvuslab~trustpilot-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-corvuslab-trustpilot-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/corvuslab~trustpilot-scraper/runs": {
      "post": {
        "operationId": "runs-sync-corvuslab-trustpilot-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/corvuslab~trustpilot-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-corvuslab-trustpilot-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "mode": {
            "title": "🎯 Mode",
            "enum": [
              "reviews",
              "companies",
              "search",
              "category"
            ],
            "type": "string",
            "description": "Reviews — every review for the companies you name. Company profiles — one profile record per company, no reviews. Company search — find companies by keyword. Category browse — list every company in a Trustpilot category.",
            "default": "reviews"
          },
          "companyDomain": {
            "title": "🔗 Company domain",
            "type": "string",
            "description": "Company domain as used on Trustpilot, e.g. 'booking.com' or 'www.amazon.com'. Or paste a full Trustpilot URL."
          },
          "companyDomains": {
            "title": "📋 Company domains (bulk)",
            "type": "array",
            "description": "Scrape multiple companies in one run. Accepts Trustpilot domains or full review URLs. Each result is tagged with its companyDomain.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "🔗 Start URLs",
            "type": "array",
            "description": "Trustpilot URLs to read directly — review pages, /search?query=… pages or /categories/… pages. Paste a search or category URL and the actor switches to that mode by itself.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "searchQuery": {
            "title": "🔎 Search keyword",
            "type": "string",
            "description": "Keyword to search the Trustpilot company directory, e.g. 'car insurance', 'web hosting', 'solar panels'."
          },
          "searchQueries": {
            "title": "📋 Search keywords (bulk)",
            "type": "array",
            "description": "Run several keyword searches in one go. Companies are de-duplicated across searches.",
            "items": {
              "type": "string"
            }
          },
          "categoryId": {
            "title": "📂 Category ID",
            "type": "string",
            "description": "Trustpilot category id, e.g. 'insurance_agency', 'electronics_technology', 'bank'. Open trustpilot.com/categories, click a category and take the last part of the URL — or just paste the whole category URL."
          },
          "categoryIds": {
            "title": "📋 Category IDs (bulk)",
            "type": "array",
            "description": "Browse several categories in one run.",
            "items": {
              "type": "string"
            }
          },
          "country": {
            "title": "🌍 Country",
            "type": "string",
            "description": "Restrict a category listing to one market, as an ISO country code (e.g. 'US', 'GB', 'DE'). Category browse only — Trustpilot's keyword search is global."
          },
          "minTrustScore": {
            "title": "⭐ Minimum TrustScore",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Only keep companies at or above this TrustScore (0-5, decimals allowed). Applied to every company found, in both discovery modes."
          },
          "minReviews": {
            "title": "🗳️ Minimum review count",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep companies with at least this many reviews — filters out empty profiles when building prospect lists."
          },
          "onlyClaimed": {
            "title": "✅ Claimed companies only",
            "type": "boolean",
            "description": "Only return companies that have claimed their Trustpilot profile — usually the ones worth contacting.",
            "default": false
          },
          "maxResults": {
            "title": "💯 Max results",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum records per company (Reviews mode) or per keyword/category (discovery modes). Set 0 for everything reachable. Above 200 the actor automatically splits the listing into narrower views to read past Trustpilot's public page limit.",
            "default": 200
          },
          "sort": {
            "title": "🔀 Sort order",
            "enum": [
              "recency",
              "relevance"
            ],
            "type": "string",
            "description": "Review sort order. 'recency' returns newest first (best for monitoring). 'relevance' returns Trustpilot's algorithmic picks.",
            "default": "recency"
          },
          "stars": {
            "title": "⭐ Star ratings",
            "type": "array",
            "description": "Only return reviews with these star ratings. Leave empty for all.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ],
              "enumTitles": [
                "1 ★",
                "2 ★",
                "3 ★",
                "4 ★",
                "5 ★"
              ]
            }
          },
          "languages": {
            "title": "🌐 Review languages",
            "type": "array",
            "description": "Filter by review language ISO codes, e.g. 'en', 'de', 'fr'. Leave empty to read every language Trustpilot holds for the company.",
            "items": {
              "type": "string"
            }
          },
          "date": {
            "title": "📅 Date range",
            "enum": [
              "",
              "last30days",
              "last3months",
              "last6months",
              "last12months"
            ],
            "type": "string",
            "description": "Trustpilot's own rolling date filter. For an exact cut-off use 'Published after' or 'Last N days' below instead.",
            "default": ""
          },
          "startDate": {
            "title": "🗓️ Published after",
            "type": "string",
            "description": "Only reviews published on or after this date (YYYY-MM-DD). Reading stops as soon as a listing drops below it, so back-fills stay cheap."
          },
          "lastDays": {
            "title": "⏱️ Last N days",
            "minimum": 0,
            "type": "integer",
            "description": "Only reviews published in the last N days — 1 for a daily watch, 7 for a weekly one. The window is recalculated on every run and overrides 'Published after'."
          },
          "keyword": {
            "title": "🔤 Keyword in review text",
            "type": "string",
            "description": "Full-text search inside the reviews, e.g. 'refund' or 'delivery'. Applied by Trustpilot, so non-matching reviews are never billed."
          },
          "topics": {
            "title": "🏷️ Topics",
            "type": "array",
            "description": "Trustpilot topic tags to keep, e.g. 'refund', 'customer_service', 'delivery_service', 'booking_process'. Leave empty for all.",
            "items": {
              "type": "string"
            }
          },
          "verified": {
            "title": "✅ Verified reviews only",
            "type": "boolean",
            "description": "Return only reviews Trustpilot marks as verified.",
            "default": false
          },
          "withReplies": {
            "title": "💬 With company reply only",
            "type": "boolean",
            "description": "Return only reviews that have a reply from the company.",
            "default": false
          },
          "reviewerCountries": {
            "title": "🌍 Reviewer countries",
            "type": "array",
            "description": "Keep only reviews written by consumers in these countries, as ISO codes (e.g. 'US', 'GB', 'DE').",
            "items": {
              "type": "string"
            }
          },
          "includeCompanyInfo": {
            "title": "🏢 Include company info",
            "type": "boolean",
            "description": "Add the company profile (TrustScore, full star distribution, categories, reply rate, contact details) to every review record.",
            "default": true
          },
          "includeTransparency": {
            "title": "🔍 Include transparency report",
            "type": "boolean",
            "description": "Add Trustpilot's published transparency figures: how many reviews were organic vs invited, how many were reported, and how many were taken offline. One extra lookup per company.",
            "default": false
          },
          "includeAiSummary": {
            "title": "🤖 Include review summary",
            "type": "boolean",
            "description": "Add Trustpilot's own summary of what reviewers say, plus the per-topic breakdowns (delivery, refunds, customer service…).",
            "default": false
          },
          "includeSimilarCompanies": {
            "title": "🪞 Include similar companies",
            "type": "boolean",
            "description": "Add the competitor list Trustpilot shows on the profile, each with its TrustScore and review count.",
            "default": false
          },
          "compact": {
            "title": "📦 Compact records",
            "type": "boolean",
            "description": "Emit only the core fields. Ideal for AI agents and MCP clients.",
            "default": false
          },
          "excludeEmptyFields": {
            "title": "🧹 Drop empty fields",
            "type": "boolean",
            "description": "Remove null, empty-string and empty-array fields from each record.",
            "default": false
          },
          "incrementalMode": {
            "title": "♻️ Incremental mode",
            "type": "boolean",
            "description": "Track state between runs and tag every record with a changeType (NEW / UPDATED / UNCHANGED / EXPIRED).",
            "default": false
          },
          "stateKey": {
            "title": "🗝️ State key",
            "type": "string",
            "description": "Stable name for the tracked search. Leave empty to derive one automatically."
          },
          "emitUnchanged": {
            "title": "🔁 Include unchanged records",
            "type": "boolean",
            "description": "Also emit records that have not changed since the previous run.",
            "default": false
          },
          "emitExpired": {
            "title": "🗑️ Include expired records",
            "type": "boolean",
            "description": "Emit records for items present last run but gone now.",
            "default": false
          },
          "telegramToken": {
            "title": "💬 Telegram bot token",
            "type": "string",
            "description": "Bot token from @BotFather."
          },
          "telegramChatId": {
            "title": "🆔 Telegram chat ID",
            "type": "string",
            "description": "Chat or channel ID."
          },
          "slackWebhookUrl": {
            "title": "💼 Slack webhook URL",
            "type": "string",
            "description": "Slack incoming-webhook URL."
          },
          "discordWebhookUrl": {
            "title": "🎮 Discord webhook URL",
            "type": "string",
            "description": "Discord incoming-webhook URL."
          },
          "webhookUrl": {
            "title": "🪝 Webhook URL",
            "type": "string",
            "description": "Any HTTPS endpoint. Receives a JSON POST with the matched records."
          },
          "webhookHeaders": {
            "title": "🧾 Webhook headers",
            "type": "object",
            "description": "Extra headers for the webhook request."
          },
          "notificationLimit": {
            "title": "🔢 Records per notification",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many records to include in each notification message.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy configuration",
            "type": "object",
            "description": "Leave empty — the actor routes traffic itself and only escalates to paid proxy when needed. Only set this to use your own proxies.",
            "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}