{
  "openapi": "3.0.1",
  "info": {
    "title": "Software Reviews Scraper: Capterra, Google Play, App Store",
    "description": "Reviews of a software product from Capterra, Google Play and the App Store in one dataset and one row shape, by name or URL; $1.79 per 1,000 reviews. Free summary row per product, Software Advice optional. Verified name matching, only-new mode, no reviewer names.",
    "version": "0.1",
    "x-build-id": "xeeyA2TtKQBrAifZl"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/arcadium~software-reviews/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-arcadium-software-reviews",
        "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/arcadium~software-reviews/runs": {
      "post": {
        "operationId": "runs-sync-arcadium-software-reviews",
        "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/arcadium~software-reviews/run-sync": {
      "post": {
        "operationId": "run-sync-arcadium-software-reviews",
        "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": {
          "products": {
            "title": "Products (by name)",
            "type": "array",
            "description": "Software product names, e.g. Slack or Asana. Each name is looked up on Capterra / Software Advice and in the Google Play and App Store catalogs. An app is used only when it is confidently the same product; otherwise that source returns a free 'no_match' row.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs (optional)",
            "type": "array",
            "description": "Product pages from Capterra, Software Advice, GetApp, Google Play or the App Store. Each link is routed to its source by host. A Google Play package id (com.slack) or an App Store id (618783545) also works. Can be combined with product names. Example: https://www.capterra.com/p/135003/Slack/.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "sources": {
            "title": "Sources for product names",
            "type": "array",
            "description": "Which sources to search when you give product names. Capterra, Google Play and App Store are on by default. Software Advice shows largely the same reviews as Capterra, so it is opt-in; duplicates are dropped and never charged. Links in 'Start URLs' are always read, whatever is chosen here. Default: capterra, googleplay, appstore.",
            "items": {
              "type": "string",
              "enum": [
                "capterra",
                "softwareadvice",
                "googleplay",
                "appstore"
              ],
              "enumTitles": [
                "Capterra",
                "Software Advice",
                "Google Play",
                "App Store"
              ]
            }
          },
          "maxReviewsPerSource": {
            "title": "Max reviews per source",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "Maximum number of reviews to collect from each source for each product (up to 50,000). Default: 100."
          },
          "sort": {
            "title": "Sort order",
            "enum": [
              "recent",
              "helpful",
              "most_recent",
              "most_helpful",
              "highest_rated",
              "lowest_rated"
            ],
            "type": "string",
            "description": "Most recent first, or most helpful first (each store's own relevance ranking). The names most_recent, most_helpful, highest_rated and lowest_rated from similar actors also work; the two rating sorts are not supported and use Most recent.",
            "default": "recent"
          },
          "appCountry": {
            "title": "App store country",
            "type": "string",
            "description": "Two-letter storefront country for Google Play and the App Store, e.g. us, gb, de. Leave empty for us (or the country in an App Store link)."
          },
          "language": {
            "title": "Review language",
            "type": "string",
            "description": "Language of the Google Play reviews, e.g. en or pt-BR.",
            "default": "en"
          },
          "dateFrom": {
            "title": "Reviews from date",
            "type": "string",
            "description": "Only keep reviews published on or after this date (YYYY-MM-DD, or a relative span such as 30 days or 2 months; empty = no filter). With 'Most recent' sorting, paging stops once reviews are older."
          },
          "onlyNewReviews": {
            "title": "Only new reviews",
            "type": "boolean",
            "description": "Return only reviews not delivered by earlier runs that used the same state key. Uses the 'Most recent' sort order. The state is kept in a named key-value store in your account (change the state key to start over). Skipped reviews are not charged.",
            "default": false
          },
          "stateKey": {
            "title": "State key",
            "type": "string",
            "description": "Name of the incremental state used by 'Only new reviews' (letters, digits and dashes, up to 40 characters). Use different keys for independent schedules. Example: weekly-monitoring.",
            "default": "default"
          },
          "includeSummaryRows": {
            "title": "Include summary rows",
            "type": "boolean",
            "description": "Add one row with rowType 'summary' (not charged) per product: the rating and review count each source shows, and how confident the match is.",
            "default": true
          },
          "includeErrorRows": {
            "title": "Include error rows",
            "type": "boolean",
            "description": "Add one row with rowType 'error' (not charged) for each input or source that could not be scraped, e.g. no confident app match.",
            "default": true
          },
          "includeCoverageRows": {
            "title": "Include coverage rows",
            "type": "boolean",
            "description": "Add one free row with rowType 'coverage' per product or source: the review total the site states, how many were delivered, why paging ended and whether anything is missing. Not charged.",
            "default": true
          },
          "markEdited": {
            "title": "Mark edited reviews",
            "type": "boolean",
            "description": "With 'Only new reviews': also deliver reviews seen before whose text changed in the last 7 days, marked extras.changeType 'edited'. Edited reviews are charged like new ones.",
            "default": true
          },
          "maxRetries": {
            "title": "Max retries",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "How many times a failed request is retried before that source is skipped.",
            "default": 3
          },
          "proxyConfiguration": {
            "title": "Proxy configuration (advanced)",
            "type": "object",
            "description": "Optional. By default the actor automatically picks the cheapest working proxy. Set this only to force your own proxy setup."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}