{
  "openapi": "3.0.1",
  "info": {
    "title": "Steam Reviews Scraper",
    "description": "User reviews for any Steam game, with the playtime, purchase source and vote counts Steam attaches to each. Never stops on a short page - Steam serves 99-row pages mid-stream, and a walker that treats one as the end returns 1,499 of 5,236,483 reviews and reports success.",
    "version": "0.1",
    "x-build-id": "aIEW7gTsrorxmlf5O"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapyx~steam-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapyx-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/scrapyx~steam-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapyx-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/scrapyx~steam-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapyx-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": {
          "mode": {
            "title": "What to collect",
            "enum": [
              "reviews",
              "summary"
            ],
            "type": "string",
            "description": "reviews = walk the full review stream for each game. summary = one request per game for its score and totals only — a cheap way to compare hundreds of games.",
            "default": "reviews"
          },
          "appIds": {
            "title": "Steam App IDs",
            "type": "array",
            "description": "A numeric App ID (730) or a store URL (https://store.steampowered.com/app/730/Counter_Strike_2/). Must be a positive integer — Steam answers 0 and non-numeric values with an in-body error rather than an HTTP one.",
            "items": {
              "type": "string"
            }
          },
          "purchaseType": {
            "title": "Which purchases count",
            "enum": [
              "all",
              "steam",
              "non_steam_purchase"
            ],
            "type": "string",
            "description": "IMPORTANT: Steam's own default is 'steam', which hides reviews from keys activated outside Steam — measured 5,236,483 of 9,816,519 on CS2, so 46.7% of them. This actor defaults to 'all' instead, and every summary reports what Steam's default would have returned.",
            "default": "all"
          },
          "language": {
            "title": "Review language",
            "type": "string",
            "description": "A Steam language code (english, french, schinese, russian…) or 'all'. Note Steam treats an omitted or empty language as ENGLISH, not as everything — 1,498,594 of CS2's 5,236,483 reviews. Defaults to 'all' here. An unknown language honestly returns zero results.",
            "default": "all"
          },
          "filter": {
            "title": "Order",
            "enum": [
              "recent",
              "updated",
              "all",
              "funny"
            ],
            "type": "string",
            "description": "recent = newest first. updated = recently edited first. all = Steam's own relevance order. funny = funniest first. An unknown value is refused here, because Steam silently falls back to 'all' — a different ordering — and still answers 200.",
            "default": "recent"
          },
          "reviewType": {
            "title": "Positive, negative or both",
            "enum": [
              "all",
              "positive",
              "negative"
            ],
            "type": "string",
            "description": "Beware: choosing positive or negative makes Steam stop reporting totals entirely, so the summary's totals become null and the run has no denominator. Leave on 'all' if you need the counts.",
            "default": "all"
          },
          "excludeOfftopicActivity": {
            "title": "Exclude review-bombing periods",
            "type": "boolean",
            "description": "Steam's own default. On most games this changes nothing at all; on titles that were actually review-bombed it does — Cyberpunk 2077 measured 878,232 with it on against 884,470 with it off, so 6,238 reviews hidden.",
            "default": true
          },
          "reportOfftopicGap": {
            "title": "Measure how many reviews the off-topic filter hides",
            "type": "boolean",
            "description": "Spends one extra request per game to fetch the opposite setting's total, so the summary can report offtopicReviewsHidden as a number instead of leaving you to guess. Usually 0.",
            "default": false
          },
          "dateFrom": {
            "title": "Reviews written on or after (YYYY-MM-DD)",
            "type": "string",
            "description": "Must be given together with dateTo — Steam applies the window only when both bounds are present. Unlike Steam's day_range parameter (deliberately not offered here), an explicit window moves the reported totals as well as the rows."
          },
          "dateTo": {
            "title": "Reviews written on or before (YYYY-MM-DD)",
            "type": "string",
            "description": "End of the window. Required whenever the start is set."
          },
          "dateRangeType": {
            "title": "Include or exclude that window",
            "enum": [
              "include",
              "exclude"
            ],
            "type": "string",
            "description": "include = only reviews inside the window. exclude = everything outside it.",
            "default": "include"
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per game",
            "minimum": 0,
            "type": "integer",
            "description": "Set 0 for unlimited. Popular games have millions — CS2 reports 9,816,519 — so leaving this at 0 is a long run. The walker never stops early on a short page, which is what makes an unlimited run actually complete.",
            "default": 500
          },
          "pageSize": {
            "title": "Reviews per request",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Between 1 and 100. Steam silently clamps anything above 100 with no error.",
            "default": 100
          },
          "maxConcurrency": {
            "title": "Max concurrent requests",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Games in flight at once. Each game's own pages are sequential because the cursor is a chain.",
            "default": 3
          },
          "minRequestInterval": {
            "title": "Min seconds between request starts",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "Politeness pacing shared across all workers. 0 uses the built-in default.",
            "default": 0
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional and OFF by default. The endpoint is public and keyless and showed no WAF — all seven TLS profiles returned byte-identical responses.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}