{
  "openapi": "3.0.1",
  "info": {
    "title": "Capterra & SaaS Reviews Scraper — Pros, Cons, Ratings",
    "description": "Scrape SaaS and software reviews from Capterra, Software Advice, TrustRadius and GetApp in one schema: pros and cons, ratings, reviewer job title, company size, industry and vendor replies. No login.",
    "version": "0.1",
    "x-build-id": "dIYhTFBt5ooiiY3zc"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/lergassy~capterra-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-lergassy-capterra-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/lergassy~capterra-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-lergassy-capterra-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/lergassy~capterra-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-lergassy-capterra-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",
        "properties": {
          "searchTerms": {
            "title": "🔍 Product names",
            "type": "array",
            "description": "Names of the products you want reviews for, one per line — for example <code>Slack</code>. Each name is looked up on the sites chosen below and the best match is scraped. Leave empty if you already have product URLs. Looking a product up by name asks every chosen site first and only then fetches the reviews, so it takes one to three minutes depending on how quickly the sites answer. Passing the review URL in \"productUrls\" is several times faster.",
            "items": {
              "type": "string"
            }
          },
          "searchSites": {
            "title": "Sites to search",
            "type": "array",
            "description": "Where to look the names up. GetApp has no search page of its own, so it can only be reached with a product URL. Capterra is supported but currently blocks data-centre addresses — it needs a residential proxy.",
            "items": {
              "type": "string",
              "enum": [
                "capterra",
                "softwareadvice",
                "trustradius"
              ],
              "enumTitles": [
                "Capterra",
                "Software Advice",
                "TrustRadius"
              ]
            },
            "default": [
              "trustradius",
              "softwareadvice"
            ]
          },
          "maxProductsPerTerm": {
            "title": "Products per name",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many matching products to scrape for each name on each site. Keep it at 1 for the exact product; raise it to compare a name against its closest alternatives.",
            "default": 1
          },
          "productUrls": {
            "title": "📊 Product review URLs",
            "type": "array",
            "description": "Product pages on Capterra, Software Advice, GetApp or TrustRadius. Paste the product URL — the Actor adds the reviews path itself. Mix sites freely: every source comes back with the same field names. <b>Capterra note:</b> Capterra currently answers Apify's servers with a block page; TrustRadius and Software Advice work without a proxy. Use a residential proxy for Capterra URLs.",
            "items": {
              "type": "string"
            }
          },
          "maxReviews": {
            "title": "💯 Max reviews per product",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "How many reviews to collect for each product. Reviews arrive 25 per page in the order the site lists them, which is not strictly by date; add 'Published on or after' to get only recent ones.",
            "default": 100
          },
          "minRating": {
            "title": "Minimum star rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Keep only reviews at or above this rating, on a 1-5 scale. TrustRadius scores out of 10 are converted before filtering."
          },
          "maxRating": {
            "title": "Maximum star rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Keep only reviews at or below this rating, on a 1-5 scale. Set it to 3 to collect complaints only."
          },
          "publishedAfter": {
            "title": "📅 Published on or after",
            "type": "string",
            "description": "Keep only reviews published on or after this date, in <code>YYYY-MM-DD</code> format."
          },
          "publishedBefore": {
            "title": "📅 Published on or before",
            "type": "string",
            "description": "Keep only reviews published on or before this date, in <code>YYYY-MM-DD</code> format."
          },
          "sortReviews": {
            "title": "Sort reviews by",
            "enum": [
              "as_published",
              "newest",
              "oldest",
              "rating_high",
              "rating_low"
            ],
            "type": "string",
            "description": "Order the reviews come back in. The sites publish no sort of their own, so this orders what the run collected; to decide <i>which</i> reviews are collected use the rating and date filters above.",
            "default": "as_published"
          },
          "includeProductRow": {
            "title": "Include a product summary row",
            "type": "boolean",
            "description": "Add one row per product with the average rating, the total review count and the star breakdown.",
            "default": true
          },
          "onlyNewRowsStore": {
            "title": "🔁 Only new rows — memory name",
            "pattern": "^[A-Za-z0-9-]{0,63}$",
            "type": "string",
            "description": "Give this run a name — <code>my-reviews-watch</code> — and the Actor remembers every review row it delivered under that name. Every later run with the same name writes and charges <b>only rows you have not received before</b>. Schedule the Actor daily to get a feed of new reviews instead of the whole list each time. Leave empty to get everything found, every time."
          },
          "maxConcurrency": {
            "title": "⚡ Max concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many products to scrape at the same time.",
            "default": 3
          },
          "requestTimeoutSecs": {
            "title": "⏱️ Request timeout (seconds)",
            "minimum": 10,
            "maximum": 300,
            "type": "integer",
            "description": "How long to wait for one page before giving up on it.",
            "default": 45
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional. The Actor works without a proxy; add one only if the sites start refusing your runs.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}