{
  "openapi": "3.0.1",
  "info": {
    "title": "Steam Reviews API — Reviews & Game Details",
    "description": "Scrape Steam user reviews as data. One row per review: text, recommended or not, playtime, helpful and funny votes, author, dates. Plus a game row with price, genres, platforms, Metacritic and the review-score summary. By store URL, app ID or game name. No API key, no login.",
    "version": "0.1",
    "x-build-id": "BepqGGFd2rcWKQ8XK"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/insight.solutions~steam-reviews-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-insight.solutions-steam-reviews-api",
        "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/insight.solutions~steam-reviews-api/runs": {
      "post": {
        "operationId": "runs-sync-insight.solutions-steam-reviews-api",
        "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/insight.solutions~steam-reviews-api/run-sync": {
      "post": {
        "operationId": "run-sync-insight.solutions-steam-reviews-api",
        "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",
        "required": [
          "apps"
        ],
        "properties": {
          "apps": {
            "title": "Steam games",
            "type": "array",
            "description": "One entry per game. Three shapes work: a Steam store URL (`https://store.steampowered.com/app/413150/Stardew_Valley/`), a bare app ID (`413150`), or the game's name (`Stardew Valley`), which is resolved through Steam's own store search and reported back in `resolvedFrom`. Bundle, package and search URLs are rejected, because they are not one game. Duplicates are read, and billed, once — including two different names that turn out to be the same game.",
            "items": {
              "type": "string"
            }
          },
          "maxReviewsPerApp": {
            "title": "Reviews per game",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "How many reviews to return for each game. Steam serves at most a hundred per page, so the walk stops on the page that reaches your number — you may get a few fewer than a round figure if the game runs out of reviews first. Set 0 for every review the game has, which on a big title means hundreds of thousands of rows and a run bounded only by your time and charge budgets.",
            "default": 100
          },
          "filter": {
            "title": "Review order",
            "enum": [
              "recent",
              "helpful",
              "updated"
            ],
            "type": "string",
            "description": "Which of Steam's own three orders to walk. `recent` is reverse-chronological by posting date. `helpful` is Steam's helpfulness ranking — the reviews the store itself shows first — and it is the only order that honours `dayRange`. `updated` is ordered by when a review was last edited, which surfaces people who changed their mind.",
            "default": "recent"
          },
          "language": {
            "title": "Review language",
            "type": "string",
            "description": "Steam names review languages in English — `english`, `russian`, `schinese`, `tchinese`, `german`, `spanish`, `turkish`, `ukrainian`, `japanese`, `koreana`, `brazilian`, `latam`, `french`, `italian`, `polish`, `thai`, `vietnamese` and so on — not by ISO code. `all` returns every language, which is the default. Filtering here also narrows the review-score summary on the game row: ask for `english` and `totalReviews` is how many English reviews the game has.",
            "default": "all"
          },
          "reviewType": {
            "title": "Recommended or not",
            "enum": [
              "all",
              "positive",
              "negative"
            ],
            "type": "string",
            "description": "Keep only thumbs-up reviews, only thumbs-down reviews, or both. The `recommended` column on each row carries the same fact, so `all` plus a filter on your side is usually the better trade — it costs the same and you keep the ratio.",
            "default": "all"
          },
          "purchaseType": {
            "title": "How the game was obtained",
            "enum": [
              "all",
              "steam",
              "non_steam_purchase"
            ],
            "type": "string",
            "description": "`steam` keeps only reviews from people who bought the game on Steam, which is the setting the store defaults to on a game's own page. `non_steam_purchase` keeps only keys activated from elsewhere — retail, a bundle site, a giveaway. `all` keeps both and is the honest default for research.",
            "default": "all"
          },
          "dayRange": {
            "title": "Only reviews from the last N days",
            "minimum": 0,
            "maximum": 365,
            "type": "integer",
            "description": "Limit the helpfulness ranking to reviews written in the last N days — 30 for \"what people are saying this month\". Steam only honours this on the `helpful` order; with `recent` or `updated` it is ignored, and this Actor does not send it there rather than pretending it worked. 0 turns it off.",
            "default": 0
          },
          "includeGameDetails": {
            "title": "Include the game row",
            "type": "boolean",
            "description": "Return one `game` row per app before its reviews: price, currency, developers, publishers, release date, genres, categories, platforms, Metacritic score, achievement count, and the review-score summary (score, description, total, positive, negative, positive percentage). It costs one extra request per game and is billed as its own event. Turn it off when you only want review text.",
            "default": true
          },
          "country": {
            "title": "Store country",
            "type": "string",
            "description": "Two-letter country code for the store front the price is read from — `us`, `gb`, `de`, `br`, `jp`. It decides `price` and `currency` on the game row and nothing else; reviews are the same worldwide. An unrecognised code falls back to `us`.",
            "default": "us"
          },
          "maxConcurrency": {
            "title": "Games in parallel",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many games are read at once. Each parallel worker keeps its own proxy session, so a game that gets rate-limited burns only its own exit IP. Pages *within* one game cannot be parallelised — each page hands over the cursor for the next — so this is the only lever on speed. Three is the balance that holds up against Steam's rate limits.",
            "default": 3
          },
          "maxRunSecs": {
            "title": "Maximum run time (seconds)",
            "minimum": 30,
            "maximum": 3600,
            "type": "integer",
            "description": "Wall-clock budget for the whole run. When it is reached the Actor stops walking, keeps and bills for every review it already wrote, and files a free diagnostic row for each game it never reached. A game stopped part-way keeps its rows and is not marked as failed. Nothing is charged for work that did not happen.",
            "default": 240
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Steam serves these endpoints to datacenter addresses, so the default is Apify's datacenter proxy — the same data at a fraction of the traffic cost, and its cost is already inside the per-review price. Switch to residential if you are pulling hundreds of thousands of reviews and start seeing `blocked` rows. Sessions rotate automatically when an exit IP is refused.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}