{
  "openapi": "3.0.1",
  "info": {
    "title": "Steam Reviews Scraper – Steam API, Steam Player Count, Playtime",
    "description": "Steam reviews API, Steam store API and Steam review data to JSON/CSV: review text, playtime, thumbs up/down, helpfulness votes, purchase type. Filter by playtime, keyword, language or review type, or include off-topic review bombs Steam hides; games mode adds price, genres, player count and tags.",
    "version": "0.1",
    "x-build-id": "0nkc9k0ntu7eikPi3"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fetchsmith~steam-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fetchsmith-steam-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/fetchsmith~steam-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-fetchsmith-steam-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/fetchsmith~steam-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-fetchsmith-steam-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": {
          "dataType": {
            "title": "What to scrape",
            "enum": [
              "reviews",
              "games"
            ],
            "type": "string",
            "description": "reviews = player reviews for the given games; games = the store record for each game (price, genres, developer, review score summary, optional live player count).",
            "default": "reviews"
          },
          "apps": {
            "title": "Games",
            "type": "array",
            "description": "Steam store URLs or numeric App IDs, e.g. https://store.steampowered.com/app/1145360/Hades/ or 1145360. Leading/trailing spaces are ignored.",
            "items": {
              "type": "string"
            }
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Find games by name instead of (or as well as) giving URLs. Each match is then scraped according to 'What to scrape'.",
            "items": {
              "type": "string"
            }
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per game",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Reviews only: how many reviews to SCAN per game before moving to the next one (max 5000). This counts reviews looked at, before the keyword/minPlaytimeHours filter is applied — a low cap combined with a narrow filter can return far fewer matches than actually exist deeper in Steam's feed. Raise it if the log warns the cap was hit while filtering.",
            "default": 200
          },
          "maxResults": {
            "title": "Max results (total)",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "Hard cap on rows pushed to the dataset across all games — also caps what you are charged.",
            "default": 2000
          },
          "language": {
            "title": "Review language",
            "type": "string",
            "description": "Steam language code for the reviews to return: english, schinese, russian, german, french, spanish, japanese, brazilian, ... or \"all\" for every language.",
            "default": "english"
          },
          "reviewType": {
            "title": "Recommended / not recommended",
            "enum": [
              "all",
              "positive",
              "negative"
            ],
            "type": "string",
            "description": "positive = thumbs-up reviews only, negative = thumbs-down only.",
            "default": "all"
          },
          "purchaseType": {
            "title": "Purchase type",
            "enum": [
              "all",
              "steam",
              "non_steam_purchase"
            ],
            "type": "string",
            "description": "steam = reviews from players who bought the game on Steam (excludes key activations and free weekends).",
            "default": "all"
          },
          "includeOffTopic": {
            "title": "Include off-topic review bombs",
            "type": "boolean",
            "description": "Steam hides reviews from periods Valve flagged as off-topic review-bomb activity (a controversy rather than the game itself). Turn this on to get the unfiltered set — e.g. Total War: ROME II returns 88,334 reviews filtered vs 94,228 unfiltered. Also applies to the review totals on Game details rows.",
            "default": false
          },
          "sortBy": {
            "title": "Sort / selection",
            "enum": [
              "recent",
              "updated",
              "all",
              "funny"
            ],
            "type": "string",
            "description": "recent = newest first, updated = most recently edited first, all = Steam's helpfulness ranking, funny = Steam's \"Funny\" tab, the reviews with the most funny votes (always all-time). Note: Steam itself defaults 'all' to only the last 30 days unless you also set 'Last N days' below.",
            "default": "recent"
          },
          "dayRange": {
            "title": "Last N days (Most helpful only)",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "With Sort = Most helpful, restrict to reviews from the last N days (1-365). Steam applies a 30-day window by default in that mode if you leave this blank, so set it to 365 for a true all-time 'most helpful' pull. Steam honours a day range in NO other sort mode, so this is ignored (with a warning) for Most recent / Recently updated / Funniest - use 'Reviews after/before' for a date window instead."
          },
          "reviewsAfter": {
            "title": "Reviews after (ISO date)",
            "type": "string",
            "description": "e.g. 2024-01-01. Keep only reviews created on or after this date. Unlike 'Last N days', this reaches any point in a game's history, not just the last year. Forces Sort to 'Most recent' so the date window can be applied correctly."
          },
          "reviewsBefore": {
            "title": "Reviews before (ISO date)",
            "type": "string",
            "description": "e.g. 2024-06-30. Keep only reviews created before this date. Combine with 'Reviews after' for an exact historical window (e.g. reviews from a specific patch or controversy). Forces Sort to 'Most recent'."
          },
          "minPlaytimeHours": {
            "title": "Minimum playtime (hours)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only reviews from players with at least this many hours in the game — a cheap way to drop drive-by reviews."
          },
          "keyword": {
            "title": "Keyword filter",
            "type": "string",
            "description": "Keep only reviews whose text contains this word or phrase (case-insensitive), e.g. \"crash\", \"controller\", \"price\". Leading/trailing spaces are ignored. Accented letters are Unicode-normalized before matching, so \"très\" matches regardless of which Unicode form (composed or decomposed) you typed it in."
          },
          "country": {
            "title": "Country / currency",
            "type": "string",
            "description": "Two-letter country code used for store prices and availability (us, gb, de, ...).",
            "default": "us"
          },
          "includeGameInfo": {
            "title": "Attach game info to every review",
            "type": "boolean",
            "description": "Adds gameName, developers, publishers, genres, releaseDate and storeUrl to each review row (one extra request per game).",
            "default": true
          },
          "includePlayerCount": {
            "title": "Include live player count",
            "type": "boolean",
            "description": "Game details only: also fetch the current concurrent player count for each game (one extra request per game).",
            "default": false
          },
          "includeOwnerEstimates": {
            "title": "Include owner estimates & tags",
            "type": "boolean",
            "description": "Game details only: adds estimated owner range (ownersMin/ownersMax), peak concurrent players yesterday and Steam's crowd-voted tags with vote counts, from the free public SteamSpy API (one extra request per game, paced to 1/second). Steam's own store API exposes none of these.",
            "default": false
          },
          "searchLimit": {
            "title": "Games per search term",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many games to take from each search term (max 50).",
            "default": 10
          },
          "watchLabel": {
            "title": "Watch label (alert mode)",
            "type": "string",
            "description": "Set a name (e.g. \"my-game-reviews\") to turn this run into a watch: the FIRST run for a given label + filter set records which reviews already exist and returns nothing (0 charged). Every run after that returns only reviews posted since the last run under the same label, so you can schedule this Actor and get alerted on new reviews without re-paying for ones you already have. Changing any filter (apps/searchTerms/searchLimit/country/language/reviewType/purchaseType/includeOffTopic/sortBy/dayRange/keyword/minPlaytimeHours/reviewsAfter/reviewsBefore) starts a fresh baseline. Reviews only — ignored when dataType is \"games\". Leave empty for normal one-off runs."
          },
          "watchEvents": {
            "title": "Watch events to report",
            "type": "array",
            "description": "Optional. Only report these kinds of change in watch mode — e.g. pick \"Thumbs-up/thumbs-down edited\" alone to be alerted only when an existing reviewer flips their recommendation, and never pay for anything else. Leave empty for both. Steam keeps a review's id stable when its author edits it in place, including flipping their own thumbs-up/thumbs-down — without this event an already-delivered review that later flips is invisible to a watch forever. Steam reviews have no developer-response feature, so that is not a watchable event here. The change event compares against the recommendation recorded the last time the review was delivered, so it only starts firing on the second run after a baseline created before this feature existed. Ignored when \"Watch label\" is empty.",
            "items": {
              "type": "string",
              "enum": [
                "new",
                "recommendationChanged"
              ],
              "enumTitles": [
                "New review",
                "Thumbs-up/thumbs-down edited (reviewer changed their own recommendation)"
              ]
            },
            "default": []
          },
          "webhookUrl": {
            "title": "Webhook URL (notify on completion)",
            "type": "string",
            "description": "Optional. An http(s) URL to POST a small JSON summary to when the run finishes — results pushed, watch-label new count if Watch label is set, and the run's dataset ID so you can fetch the results. A convenience for callers who want a completion ping without setting up an Apify platform webhook (which needs separate Console/API configuration per Task, not per run). Best-effort: a failed or slow webhook is logged as a warning and never fails the run or affects charging — it fires after every result has already been pushed and charged. Leave empty to skip."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}