{
  "data": {
    "id": "GxuUpYbrzkiWxwZa1",
    "actId": "KcRtpVrqTcmshwJGE",
    "userId": "zq8lKbpLzTjGDayPC",
    "startedAt": "2026-11-04T06:38:24.066Z",
    "finishedAt": "2026-11-04T06:38:27.610Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 3415,
      "runTimeSecs": 3.415,
      "computeUnits": 0.0037944444444444445,
      "imageSizeBytes": 318993920
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "GK9YjZRyQZVzOdoH5",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Steam Review Scraper Input\",\n  \"description\": \"Choose games by app ID, URL or name, then export reviews or a per-game summary.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"reviews = one row per review; gameSummary = one row per game with metadata and overall score.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"reviews\",\n        \"gameSummary\"\n      ],\n      \"enumTitles\": [\n        \"Reviews (one row per review)\",\n        \"Game summaries (one row per game)\"\n      ],\n      \"default\": \"reviews\",\n      \"prefill\": \"reviews\"\n    },\n    \"appIds\": {\n      \"title\": \"Steam App IDs\",\n      \"type\": \"array\",\n      \"description\": \"Numeric app IDs, store URLs, community review URLs, or old appreviews URLs. Example: 1174180 or https://store.steampowered.com/app/1174180/\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"startUrls\": {\n      \"title\": \"Steam Game URLs (legacy)\",\n      \"type\": \"array\",\n      \"description\": \"Steam store page URLs for the games to scrape. Merged with appIds.\",\n      \"editor\": \"requestListSources\",\n      \"prefill\": [\n        {\n          \"url\": \"https://store.steampowered.com/app/1174180/Red_Dead_Redemption_2/\"\n        }\n      ]\n    },\n    \"gameNames\": {\n      \"title\": \"Game Names\",\n      \"type\": \"array\",\n      \"description\": \"Search Steam by name. An exact case-insensitive title match is preferred over the first search result.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"maxReviews\": {\n      \"title\": \"Max Reviews per Game\",\n      \"type\": \"integer\",\n      \"description\": \"Reviews to collect per game. Use 0 for every matching review (hard safety cap 1,000,000 per game).\",\n      \"default\": 50,\n      \"prefill\": 3,\n      \"minimum\": 0,\n      \"maximum\": 1000000,\n      \"editor\": \"number\"\n    },\n    \"maxGames\": {\n      \"title\": \"Max Games\",\n      \"type\": \"integer\",\n      \"description\": \"Cap the merged game list. Use 0 for no cap.\",\n      \"default\": 0,\n      \"prefill\": 0,\n      \"minimum\": 0,\n      \"maximum\": 1000,\n      \"editor\": \"number\"\n    },\n    \"reviewType\": {\n      \"title\": \"Review Type\",\n      \"type\": \"string\",\n      \"description\": \"Filter reviews by recommendation verdict.\",\n      \"default\": \"all\",\n      \"prefill\": \"all\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"all\",\n        \"positive\",\n        \"negative\"\n      ],\n      \"enumTitles\": [\n        \"All Reviews\",\n        \"Positive Only\",\n        \"Negative Only\"\n      ]\n    },\n    \"language\": {\n      \"title\": \"Language\",\n      \"type\": \"string\",\n      \"description\": \"Steam language code for review text. Select All Languages to include every language.\",\n      \"default\": \"all\",\n      \"prefill\": \"all\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"all\",\n        \"english\",\n        \"german\",\n        \"french\",\n        \"spanish\",\n        \"latam\",\n        \"portuguese\",\n        \"brazilian\",\n        \"russian\",\n        \"schinese\",\n        \"tchinese\",\n        \"japanese\",\n        \"koreana\",\n        \"turkish\",\n        \"italian\",\n        \"dutch\",\n        \"polish\",\n        \"thai\",\n        \"vietnamese\",\n        \"indonesian\",\n        \"bulgarian\",\n        \"czech\",\n        \"danish\",\n        \"finnish\",\n        \"greek\",\n        \"hungarian\",\n        \"norwegian\",\n        \"romanian\",\n        \"swedish\",\n        \"ukrainian\"\n      ],\n      \"enumTitles\": [\n        \"All Languages\",\n        \"English\",\n        \"German\",\n        \"French\",\n        \"Spanish (Spain)\",\n        \"Spanish (Latin America)\",\n        \"Portuguese (Portugal)\",\n        \"Portuguese (Brazil)\",\n        \"Russian\",\n        \"Chinese (Simplified)\",\n        \"Chinese (Traditional)\",\n        \"Japanese\",\n        \"Korean\",\n        \"Turkish\",\n        \"Italian\",\n        \"Dutch\",\n        \"Polish\",\n        \"Thai\",\n        \"Vietnamese\",\n        \"Indonesian\",\n        \"Bulgarian\",\n        \"Czech\",\n        \"Danish\",\n        \"Finnish\",\n        \"Greek\",\n        \"Hungarian\",\n        \"Norwegian\",\n        \"Romanian\",\n        \"Swedish\",\n        \"Ukrainian\"\n      ]\n    },\n    \"sortBy\": {\n      \"title\": \"Sort\",\n      \"type\": \"string\",\n      \"description\": \"recent and updated walk the full history; helpful is a ranked sample inside the helpfulness window; funny is also ranked and not exhaustive.\",\n      \"default\": \"recent\",\n      \"prefill\": \"recent\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"recent\",\n        \"helpful\",\n        \"updated\",\n        \"funny\"\n      ],\n      \"enumTitles\": [\n        \"Most Recent\",\n        \"Most Helpful (ranked)\",\n        \"Recently Updated\",\n        \"Funniest\"\n      ]\n    },\n    \"helpfulWithinDays\": {\n      \"title\": \"Helpful Window (days)\",\n      \"type\": \"integer\",\n      \"description\": \"Only for sortBy=helpful: rank reviews from the last 1-365 days. Use recent for full history.\",\n      \"default\": 30,\n      \"prefill\": 30,\n      \"minimum\": 1,\n      \"maximum\": 365,\n      \"editor\": \"number\"\n    },\n    \"purchaseType\": {\n      \"title\": \"Purchase Type\",\n      \"type\": \"string\",\n      \"description\": \"Whether the reviewer acquired the game through Steam, outside Steam, or either.\",\n      \"default\": \"all\",\n      \"prefill\": \"all\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"all\",\n        \"steam\",\n        \"nonSteamPurchase\"\n      ],\n      \"enumTitles\": [\n        \"All Purchases\",\n        \"Steam Purchase\",\n        \"Non-Steam Purchase (key, gift, free)\"\n      ]\n    },\n    \"minPlaytimeHours\": {\n      \"title\": \"Minimum Playtime (hours)\",\n      \"type\": \"integer\",\n      \"description\": \"Minimum hours played at the time of review. Use 0 for no minimum.\",\n      \"default\": 0,\n      \"prefill\": 0,\n      \"minimum\": 0,\n      \"maximum\": 100000,\n      \"editor\": \"number\"\n    },\n    \"maxPlaytimeHours\": {\n      \"title\": \"Maximum Playtime (hours)\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum hours played at the time of review. Use 0 for no maximum.\",\n      \"default\": 0,\n      \"prefill\": 0,\n      \"minimum\": 0,\n      \"maximum\": 100000,\n      \"editor\": \"number\"\n    },\n    \"steamDeckOnly\": {\n      \"title\": \"Steam Deck Only\",\n      \"type\": \"boolean\",\n      \"description\": \"Only reviews written while playing primarily on a Steam Deck.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeOffTopic\": {\n      \"title\": \"Include Off-Topic Reviews\",\n      \"type\": \"boolean\",\n      \"description\": \"Include reviews Steam hides as off-topic review-bomb activity. Off by default, matching the store.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"useReviewQuality\": {\n      \"title\": \"Use Review Quality Ranking\",\n      \"type\": \"boolean\",\n      \"description\": \"Only for sortBy=helpful: rank low-quality reviews lower.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"reviewsFromDate\": {\n      \"title\": \"Reviews From (YYYY-MM-DD)\",\n      \"type\": \"string\",\n      \"description\": \"Include reviews created on or after this UTC date.\",\n      \"editor\": \"datepicker\"\n    },\n    \"reviewsToDate\": {\n      \"title\": \"Reviews To (YYYY-MM-DD)\",\n      \"type\": \"string\",\n      \"description\": \"Include reviews created on or before this UTC date.\",\n      \"editor\": \"datepicker\"\n    },\n    \"includeGameDetails\": {\n      \"title\": \"Attach Game Details\",\n      \"type\": \"boolean\",\n      \"description\": \"mode=reviews: attach game metadata, price and overall review summary to every review row.\",\n      \"default\": false,\n      \"prefill\": false\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Steam Game Reviews & Playtime Extractor\n\nExport the actual customer-review feed for any Steam game — the review text, thumbs up/down verdict, reviewer profile, playtime, votes, and hardware shown on a store page. Pick games by app ID, store URL, community review URL, or plain name, then walk the full review history or stop at a fixed count. Every row is real Steam data; empty values are omitted instead of being filled with `0`, `false`, or `\"\"`.\n\n## What this actor does\n\n- **Two output modes:** `reviews` emits one row per review; `gameSummary` emits one row per game with metadata, price, and the overall review score.\n- **Flexible game selection:** numeric app IDs, store URLs, community review URLs, old review URLs, and game-name search all work in one run. Names prefer an exact title match.\n- **Complete review filters:** language, review type, purchase type, sort order, helpfulness window, exact UTC date window, playtime range, Steam Deck, off-topic reviews, and review-quality ranking.\n- **Rich reviewer context:** display name, profile and avatar URLs, SteamID, review counts, total/at-review/recent playtime, last played, Deck playtime, votes, comment count, reactions, purchase/refund/Early Access/Deck flags, and optional hardware details.\n- **Unlimited history:** `maxReviews: 0` follows the review cursor until Steam runs out, with no 500-row ceiling.\n- **Empty fields are omitted** at every nesting level, so a missing value is never confused with a real zero.\n\n## Output per review (`mode` = `reviews`)\n\n- `appId`, `gameTitle`, `gameUrl` — the game's Steam identity\n- `reviewId`, `reviewText`, `reviewUrl` — Steam recommendation ID, body, and permalink\n- `rating` — `Positive` or `Negative`; `votedUp` boolean form\n- `authorSteamId`, `authorName`, `authorProfileUrl`, `authorAvatarUrl`\n- `authorNumReviews`, `authorNumGamesOwned` — profile activity (games owned is omitted when private or zero)\n- `authorPlaytimeForever`, `authorPlaytimeAtReview`, `authorPlaytimeLastTwoWeeks`, `authorDeckPlaytimeAtReview` — hours, one decimal\n- `authorLastPlayed` — ISO 8601 UTC\n- `votesHelpful`, `votesFunny`, `weightedVoteScore`, `commentCount`, `reactionCount`\n- `steamPurchase`, `receivedForFree`, `refunded`, `writtenDuringEarlyAccess`, `primarilySteamDeck`\n- `language`, `timestampCreated`, `timestampUpdated` — Steam language code and ISO 8601 UTC timestamps\n- `developerResponse`, `developerResponseAt` — only when Steam returns a developer reply\n- `hardware` — optional `{ os, cpu, gpu, systemRamMb, vramMb }`\n- `game` — optional metadata block when `includeGameDetails` is on\n- `recordType: \"review\"`, `scrapedAt`\n\n## Output per game (`mode` = `gameSummary`)\n\n- `appId`, `gameTitle`, `gameUrl`, `gameType`, `isFree`, `shortDescription`\n- `developers[]`, `publishers[]`, `genres[]`, `categories[]`\n- `platforms` — `{ windows, mac, linux }`\n- `releaseDate`, `metacriticScore`, `headerImage`\n- `price` — `{ currency, initial, final, discountPercent, formatted }` when a price exists\n- `reviewSummary` — `{ reviewScore, reviewScoreDesc, totalPositive, totalNegative, totalReviews, positivePercent }`\n- `recordType: \"game\"`, `scrapedAt`\n\n`reviewSummary` is the game's overall score across all languages and purchase types, not the filtered review query.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `reviews` | `reviews` (one row per review) or `gameSummary` (one row per game) |\n| `appIds` | array | – | Numeric IDs, store URLs, community review URLs, or old review URLs |\n| `startUrls` | array | – | Legacy-compatible Steam store URLs; merged with `appIds` |\n| `gameNames` | array | – | Names resolved through Steam search; exact title match preferred |\n| `maxReviews` | int | `50` | Per-game review cap; `0` means all matching reviews |\n| `maxGames` | int | `0` | Cap the merged game list; `0` means no cap |\n| `reviewType` | string | `all` | `all`, `positive`, or `negative` |\n| `language` | string | `all` | Steam language code or `all` |\n| `sortBy` | string | `recent` | `recent`, `helpful`, `updated`, or `funny`; helpful and funny are ranked, not exhaustive |\n| `helpfulWithinDays` | int | `30` | Helpful sort window (1–365 days) |\n| `purchaseType` | string | `all` | `all`, `steam`, or `nonSteamPurchase` |\n| `minPlaytimeHours` | int | `0` | Minimum hours at review; `0` = no minimum |\n| `maxPlaytimeHours` | int | `0` | Maximum hours at review; `0` = no maximum |\n| `steamDeckOnly` | boolean | `false` | Only reviews played primarily on Steam Deck |\n| `includeOffTopic` | boolean | `false` | Include review-bomb/off-topic activity Steam hides by default |\n| `useReviewQuality` | boolean | `true` | Apply Steam's quality ranking to `sortBy=helpful` |\n| `reviewsFromDate` | string | – | Include reviews created on/after this UTC date (`YYYY-MM-DD`) |\n| `reviewsToDate` | string | – | Include reviews created on/before this UTC date (`YYYY-MM-DD`) |\n| `includeGameDetails` | boolean | `false` | Attach game metadata, price, and score to every review row |\n\nAt least one game source (`appIds`, `startUrls`, or `gameNames`) is required.\n\n### Example: the smallest daily run\n\n```json\n{\n    \"mode\": \"reviews\",\n    \"startUrls\": [{ \"url\": \"https://store.steampowered.com/app/1174180/Red_Dead_Redemption_2/\" }],\n    \"maxReviews\": 3,\n    \"sortBy\": \"recent\"\n}\n```\n\n### Example: negative English reviews in an exact date window\n\n```json\n{\n    \"mode\": \"reviews\",\n    \"appIds\": [\"570\"],\n    \"reviewType\": \"negative\",\n    \"language\": \"english\",\n    \"reviewsFromDate\": \"2024-01-01\",\n    \"reviewsToDate\": \"2024-03-31\",\n    \"maxReviews\": 500\n}\n```\n\n### Example: long sessions on a Steam Deck\n\n```json\n{\n    \"mode\": \"reviews\",\n    \"gameNames\": [\"Hades\"],\n    \"steamDeckOnly\": true,\n    \"minPlaytimeHours\": 20,\n    \"sortBy\": \"helpful\",\n    \"helpfulWithinDays\": 90,\n    \"maxReviews\": 200\n}\n```\n\n### Example: game metadata and score summaries\n\n```json\n{\n    \"mode\": \"gameSummary\",\n    \"appIds\": [\"1145360\", \"1245620\"],\n    \"gameNames\": [\"Baldur's Gate 3\"],\n    \"maxGames\": 3\n}\n```\n\n## Use cases\n\n- **Patch and DLC sentiment** — pull reviews from a narrow date window to see reaction before and after a release.\n- **Competitive benchmarking** — compare review volume, positive share, playtime, and hardware mix across titles.\n- **Community management** — filter negative reviews by language and date to triage bugs and crashes.\n- **Reviewer vetting** — check total playtime, review history, and whether a copy was free or refunded.\n- **Store dashboards** — run `gameSummary` for a clean one-row-per-game view of price, score, and metadata.\n- **Localization research** — compare sentiment in specific Steam language markets.\n\n## FAQ\n\n**Where does the data come from?**\nSteam's public store review services and store metadata endpoints — the same information shown under \"Customer Reviews\" and on a game's store page.\n\n**Do I need a Steam account, API key, or proxy?**\nNo. The actor uses anonymous public endpoints, needs no login or key, and is configured without a proxy input.\n\n**Are the date filters inclusive?**\nYes. `reviewsFromDate` starts at 00:00:00 UTC and `reviewsToDate` ends at 23:59:59 UTC, using the review's creation time. Reviews edited later do not move into an older window.\n\n**Why are some fields missing from a row?**\nEmpty values are omitted deliberately. Hardware is only recorded when a reviewer shares it, reactions and developer responses are rare, and private profiles hide games-owned. If Steam's rich review service is unavailable, the actor switches to Valve's official review API, which omits reviewer display names and avatars. Absence means Steam did not provide the value.\n\n**Does `maxReviews: 0` really return everything?**\nWith `recent` or `updated` it follows Steam's cursor until the source is exhausted. Ranked sorts (`helpful`, `funny`) only expose Steam's ranked subset. A safety cap of 1,000,000 reviews per game prevents runaway runs; narrow the date window or use `maxReviews` for very large titles.\n\n**Is `sortBy=helpful` a full export?**\nNo. Helpful is Steam's ranked view inside `helpfulWithinDays`, and `funny` is likewise a ranked subset of the game's reviews; neither is exhaustive. Use `recent` or `updated` for full-history exports.\n\n**What does `purchaseType` mean?**\n`steam` means Steam records the copy as bought through Steam; `nonSteamPurchase` covers keys, gifts, and other acquisitions. On some free-to-play titles Steam's own purchase flag does not split cleanly, so treat that filter as Steam's classification rather than an independent audit.\n\n**Why does `gameSummary` show a different score than a filtered review run?**\n`reviewSummary` is always the game's overall score across all languages and purchase types. The review filters only affect which individual review rows are emitted.\n\n**Can I mix IDs, URLs, and names in one run?**\nYes. All sources are merged and deduplicated by app ID, then capped by `maxGames`.\n\n**Is this affiliated with Steam or Valve?**\nNo. This is an independent, third-party actor that reads Steam's public endpoints; it is not operated by Valve.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "steam-game-reviews-and-playtime-extractor",
      "title": "Steam Game Reviews & Playtime Extractor",
      "description": "Export Steam game reviews by app ID, URL, or game name. Filter by language, review type, purchase type, exact dates, playtime, Steam Deck, and helpfulness. Includes reviewer profiles, votes, hardware, game metadata, and overall score summaries.",
      "version": "1.0",
      "buildTag": "latest",
      "meta": {
        "templateId": "python-start"
      },
      "readme": "# Steam Game Reviews & Playtime Extractor\n\nExport the actual customer-review feed for any Steam game — the review text, thumbs up/down verdict, reviewer profile, playtime, votes, and hardware shown on a store page. Pick games by app ID, store URL, community review URL, or plain name, then walk the full review history or stop at a fixed count. Every row is real Steam data; empty values are omitted instead of being filled with `0`, `false`, or `\"\"`.\n\n## What this actor does\n\n- **Two output modes:** `reviews` emits one row per review; `gameSummary` emits one row per game with metadata, price, and the overall review score.\n- **Flexible game selection:** numeric app IDs, store URLs, community review URLs, old review URLs, and game-name search all work in one run. Names prefer an exact title match.\n- **Complete review filters:** language, review type, purchase type, sort order, helpfulness window, exact UTC date window, playtime range, Steam Deck, off-topic reviews, and review-quality ranking.\n- **Rich reviewer context:** display name, profile and avatar URLs, SteamID, review counts, total/at-review/recent playtime, last played, Deck playtime, votes, comment count, reactions, purchase/refund/Early Access/Deck flags, and optional hardware details.\n- **Unlimited history:** `maxReviews: 0` follows the review cursor until Steam runs out, with no 500-row ceiling.\n- **Empty fields are omitted** at every nesting level, so a missing value is never confused with a real zero.\n\n## Output per review (`mode` = `reviews`)\n\n- `appId`, `gameTitle`, `gameUrl` — the game's Steam identity\n- `reviewId`, `reviewText`, `reviewUrl` — Steam recommendation ID, body, and permalink\n- `rating` — `Positive` or `Negative`; `votedUp` boolean form\n- `authorSteamId`, `authorName`, `authorProfileUrl`, `authorAvatarUrl`\n- `authorNumReviews`, `authorNumGamesOwned` — profile activity (games owned is omitted when private or zero)\n- `authorPlaytimeForever`, `authorPlaytimeAtReview`, `authorPlaytimeLastTwoWeeks`, `authorDeckPlaytimeAtReview` — hours, one decimal\n- `authorLastPlayed` — ISO 8601 UTC\n- `votesHelpful`, `votesFunny`, `weightedVoteScore`, `commentCount`, `reactionCount`\n- `steamPurchase`, `receivedForFree`, `refunded`, `writtenDuringEarlyAccess`, `primarilySteamDeck`\n- `language`, `timestampCreated`, `timestampUpdated` — Steam language code and ISO 8601 UTC timestamps\n- `developerResponse`, `developerResponseAt` — only when Steam returns a developer reply\n- `hardware` — optional `{ os, cpu, gpu, systemRamMb, vramMb }`\n- `game` — optional metadata block when `includeGameDetails` is on\n- `recordType: \"review\"`, `scrapedAt`\n\n## Output per game (`mode` = `gameSummary`)\n\n- `appId`, `gameTitle`, `gameUrl`, `gameType`, `isFree`, `shortDescription`\n- `developers[]`, `publishers[]`, `genres[]`, `categories[]`\n- `platforms` — `{ windows, mac, linux }`\n- `releaseDate`, `metacriticScore`, `headerImage`\n- `price` — `{ currency, initial, final, discountPercent, formatted }` when a price exists\n- `reviewSummary` — `{ reviewScore, reviewScoreDesc, totalPositive, totalNegative, totalReviews, positivePercent }`\n- `recordType: \"game\"`, `scrapedAt`\n\n`reviewSummary` is the game's overall score across all languages and purchase types, not the filtered review query.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `reviews` | `reviews` (one row per review) or `gameSummary` (one row per game) |\n| `appIds` | array | – | Numeric IDs, store URLs, community review URLs, or old review URLs |\n| `startUrls` | array | – | Legacy-compatible Steam store URLs; merged with `appIds` |\n| `gameNames` | array | – | Names resolved through Steam search; exact title match preferred |\n| `maxReviews` | int | `50` | Per-game review cap; `0` means all matching reviews |\n| `maxGames` | int | `0` | Cap the merged game list; `0` means no cap |\n| `reviewType` | string | `all` | `all`, `positive`, or `negative` |\n| `language` | string | `all` | Steam language code or `all` |\n| `sortBy` | string | `recent` | `recent`, `helpful`, `updated`, or `funny`; helpful and funny are ranked, not exhaustive |\n| `helpfulWithinDays` | int | `30` | Helpful sort window (1–365 days) |\n| `purchaseType` | string | `all` | `all`, `steam`, or `nonSteamPurchase` |\n| `minPlaytimeHours` | int | `0` | Minimum hours at review; `0` = no minimum |\n| `maxPlaytimeHours` | int | `0` | Maximum hours at review; `0` = no maximum |\n| `steamDeckOnly` | boolean | `false` | Only reviews played primarily on Steam Deck |\n| `includeOffTopic` | boolean | `false` | Include review-bomb/off-topic activity Steam hides by default |\n| `useReviewQuality` | boolean | `true` | Apply Steam's quality ranking to `sortBy=helpful` |\n| `reviewsFromDate` | string | – | Include reviews created on/after this UTC date (`YYYY-MM-DD`) |\n| `reviewsToDate` | string | – | Include reviews created on/before this UTC date (`YYYY-MM-DD`) |\n| `includeGameDetails` | boolean | `false` | Attach game metadata, price, and score to every review row |\n\nAt least one game source (`appIds`, `startUrls`, or `gameNames`) is required.\n\n### Example: the smallest daily run\n\n```json\n{\n    \"mode\": \"reviews\",\n    \"startUrls\": [{ \"url\": \"https://store.steampowered.com/app/1174180/Red_Dead_Redemption_2/\" }],\n    \"maxReviews\": 3,\n    \"sortBy\": \"recent\"\n}\n```\n\n### Example: negative English reviews in an exact date window\n\n```json\n{\n    \"mode\": \"reviews\",\n    \"appIds\": [\"570\"],\n    \"reviewType\": \"negative\",\n    \"language\": \"english\",\n    \"reviewsFromDate\": \"2024-01-01\",\n    \"reviewsToDate\": \"2024-03-31\",\n    \"maxReviews\": 500\n}\n```\n\n### Example: long sessions on a Steam Deck\n\n```json\n{\n    \"mode\": \"reviews\",\n    \"gameNames\": [\"Hades\"],\n    \"steamDeckOnly\": true,\n    \"minPlaytimeHours\": 20,\n    \"sortBy\": \"helpful\",\n    \"helpfulWithinDays\": 90,\n    \"maxReviews\": 200\n}\n```\n\n### Example: game metadata and score summaries\n\n```json\n{\n    \"mode\": \"gameSummary\",\n    \"appIds\": [\"1145360\", \"1245620\"],\n    \"gameNames\": [\"Baldur's Gate 3\"],\n    \"maxGames\": 3\n}\n```\n\n## Use cases\n\n- **Patch and DLC sentiment** — pull reviews from a narrow date window to see reaction before and after a release.\n- **Competitive benchmarking** — compare review volume, positive share, playtime, and hardware mix across titles.\n- **Community management** — filter negative reviews by language and date to triage bugs and crashes.\n- **Reviewer vetting** — check total playtime, review history, and whether a copy was free or refunded.\n- **Store dashboards** — run `gameSummary` for a clean one-row-per-game view of price, score, and metadata.\n- **Localization research** — compare sentiment in specific Steam language markets.\n\n## FAQ\n\n**Where does the data come from?**\nSteam's public store review services and store metadata endpoints — the same information shown under \"Customer Reviews\" and on a game's store page.\n\n**Do I need a Steam account, API key, or proxy?**\nNo. The actor uses anonymous public endpoints, needs no login or key, and is configured without a proxy input.\n\n**Are the date filters inclusive?**\nYes. `reviewsFromDate` starts at 00:00:00 UTC and `reviewsToDate` ends at 23:59:59 UTC, using the review's creation time. Reviews edited later do not move into an older window.\n\n**Why are some fields missing from a row?**\nEmpty values are omitted deliberately. Hardware is only recorded when a reviewer shares it, reactions and developer responses are rare, and private profiles hide games-owned. If Steam's rich review service is unavailable, the actor switches to Valve's official review API, which omits reviewer display names and avatars. Absence means Steam did not provide the value.\n\n**Does `maxReviews: 0` really return everything?**\nWith `recent` or `updated` it follows Steam's cursor until the source is exhausted. Ranked sorts (`helpful`, `funny`) only expose Steam's ranked subset. A safety cap of 1,000,000 reviews per game prevents runaway runs; narrow the date window or use `maxReviews` for very large titles.\n\n**Is `sortBy=helpful` a full export?**\nNo. Helpful is Steam's ranked view inside `helpfulWithinDays`, and `funny` is likewise a ranked subset of the game's reviews; neither is exhaustive. Use `recent` or `updated` for full-history exports.\n\n**What does `purchaseType` mean?**\n`steam` means Steam records the copy as bought through Steam; `nonSteamPurchase` covers keys, gifts, and other acquisitions. On some free-to-play titles Steam's own purchase flag does not split cleanly, so treat that filter as Steam's classification rather than an independent audit.\n\n**Why does `gameSummary` show a different score than a filtered review run?**\n`reviewSummary` is always the game's overall score across all languages and purchase types. The review filters only affect which individual review rows are emitted.\n\n**Can I mix IDs, URLs, and names in one run?**\nYes. All sources are merged and deduplicated by app ID, then capped by `maxGames`.\n\n**Is this affiliated with Steam or Valve?**\nNo. This is an independent, third-party actor that reads Steam's public endpoints; it is not operated by Valve.\n",
      "input": {
        "title": "Steam Review Scraper Input",
        "description": "Choose games by app ID, URL or name, then export reviews or a per-game summary.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "reviews = one row per review; gameSummary = one row per game with metadata and overall score.",
            "editor": "select",
            "enum": [
              "reviews",
              "gameSummary"
            ],
            "enumTitles": [
              "Reviews (one row per review)",
              "Game summaries (one row per game)"
            ],
            "default": "reviews",
            "prefill": "reviews"
          },
          "appIds": {
            "title": "Steam App IDs",
            "type": "array",
            "description": "Numeric app IDs, store URLs, community review URLs, or old appreviews URLs. Example: 1174180 or https://store.steampowered.com/app/1174180/",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "startUrls": {
            "title": "Steam Game URLs (legacy)",
            "type": "array",
            "description": "Steam store page URLs for the games to scrape. Merged with appIds.",
            "editor": "requestListSources",
            "prefill": [
              {
                "url": "https://store.steampowered.com/app/1174180/Red_Dead_Redemption_2/"
              }
            ]
          },
          "gameNames": {
            "title": "Game Names",
            "type": "array",
            "description": "Search Steam by name. An exact case-insensitive title match is preferred over the first search result.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "maxReviews": {
            "title": "Max Reviews per Game",
            "type": "integer",
            "description": "Reviews to collect per game. Use 0 for every matching review (hard safety cap 1,000,000 per game).",
            "default": 50,
            "prefill": 3,
            "minimum": 0,
            "maximum": 1000000,
            "editor": "number"
          },
          "maxGames": {
            "title": "Max Games",
            "type": "integer",
            "description": "Cap the merged game list. Use 0 for no cap.",
            "default": 0,
            "prefill": 0,
            "minimum": 0,
            "maximum": 1000,
            "editor": "number"
          },
          "reviewType": {
            "title": "Review Type",
            "type": "string",
            "description": "Filter reviews by recommendation verdict.",
            "default": "all",
            "prefill": "all",
            "editor": "select",
            "enum": [
              "all",
              "positive",
              "negative"
            ],
            "enumTitles": [
              "All Reviews",
              "Positive Only",
              "Negative Only"
            ]
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Steam language code for review text. Select All Languages to include every language.",
            "default": "all",
            "prefill": "all",
            "editor": "select",
            "enum": [
              "all",
              "english",
              "german",
              "french",
              "spanish",
              "latam",
              "portuguese",
              "brazilian",
              "russian",
              "schinese",
              "tchinese",
              "japanese",
              "koreana",
              "turkish",
              "italian",
              "dutch",
              "polish",
              "thai",
              "vietnamese",
              "indonesian",
              "bulgarian",
              "czech",
              "danish",
              "finnish",
              "greek",
              "hungarian",
              "norwegian",
              "romanian",
              "swedish",
              "ukrainian"
            ],
            "enumTitles": [
              "All Languages",
              "English",
              "German",
              "French",
              "Spanish (Spain)",
              "Spanish (Latin America)",
              "Portuguese (Portugal)",
              "Portuguese (Brazil)",
              "Russian",
              "Chinese (Simplified)",
              "Chinese (Traditional)",
              "Japanese",
              "Korean",
              "Turkish",
              "Italian",
              "Dutch",
              "Polish",
              "Thai",
              "Vietnamese",
              "Indonesian",
              "Bulgarian",
              "Czech",
              "Danish",
              "Finnish",
              "Greek",
              "Hungarian",
              "Norwegian",
              "Romanian",
              "Swedish",
              "Ukrainian"
            ]
          },
          "sortBy": {
            "title": "Sort",
            "type": "string",
            "description": "recent and updated walk the full history; helpful is a ranked sample inside the helpfulness window; funny is also ranked and not exhaustive.",
            "default": "recent",
            "prefill": "recent",
            "editor": "select",
            "enum": [
              "recent",
              "helpful",
              "updated",
              "funny"
            ],
            "enumTitles": [
              "Most Recent",
              "Most Helpful (ranked)",
              "Recently Updated",
              "Funniest"
            ]
          },
          "helpfulWithinDays": {
            "title": "Helpful Window (days)",
            "type": "integer",
            "description": "Only for sortBy=helpful: rank reviews from the last 1-365 days. Use recent for full history.",
            "default": 30,
            "prefill": 30,
            "minimum": 1,
            "maximum": 365,
            "editor": "number"
          },
          "purchaseType": {
            "title": "Purchase Type",
            "type": "string",
            "description": "Whether the reviewer acquired the game through Steam, outside Steam, or either.",
            "default": "all",
            "prefill": "all",
            "editor": "select",
            "enum": [
              "all",
              "steam",
              "nonSteamPurchase"
            ],
            "enumTitles": [
              "All Purchases",
              "Steam Purchase",
              "Non-Steam Purchase (key, gift, free)"
            ]
          },
          "minPlaytimeHours": {
            "title": "Minimum Playtime (hours)",
            "type": "integer",
            "description": "Minimum hours played at the time of review. Use 0 for no minimum.",
            "default": 0,
            "prefill": 0,
            "minimum": 0,
            "maximum": 100000,
            "editor": "number"
          },
          "maxPlaytimeHours": {
            "title": "Maximum Playtime (hours)",
            "type": "integer",
            "description": "Maximum hours played at the time of review. Use 0 for no maximum.",
            "default": 0,
            "prefill": 0,
            "minimum": 0,
            "maximum": 100000,
            "editor": "number"
          },
          "steamDeckOnly": {
            "title": "Steam Deck Only",
            "type": "boolean",
            "description": "Only reviews written while playing primarily on a Steam Deck.",
            "default": false,
            "prefill": false
          },
          "includeOffTopic": {
            "title": "Include Off-Topic Reviews",
            "type": "boolean",
            "description": "Include reviews Steam hides as off-topic review-bomb activity. Off by default, matching the store.",
            "default": false,
            "prefill": false
          },
          "useReviewQuality": {
            "title": "Use Review Quality Ranking",
            "type": "boolean",
            "description": "Only for sortBy=helpful: rank low-quality reviews lower.",
            "default": true,
            "prefill": true
          },
          "reviewsFromDate": {
            "title": "Reviews From (YYYY-MM-DD)",
            "type": "string",
            "description": "Include reviews created on or after this UTC date.",
            "editor": "datepicker"
          },
          "reviewsToDate": {
            "title": "Reviews To (YYYY-MM-DD)",
            "type": "string",
            "description": "Include reviews created on or before this UTC date.",
            "editor": "datepicker"
          },
          "includeGameDetails": {
            "title": "Attach Game Details",
            "type": "boolean",
            "description": "mode=reviews: attach game metadata, price and overall review summary to every review row.",
            "default": false,
            "prefill": false
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Steam Game Reviews & Playtime Extractor Output",
        "description": "Steam review rows with reviewer profile, playtime, votes, hardware and flags, plus per-game metadata and overall score summaries.",
        "properties": {
          "reviews": {
            "type": "string",
            "title": "Steam Reviews",
            "description": "Dataset containing scraped Steam review records or per-game summary records.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "defaultMemoryMbytes": 1024,
      "defaultRunOptions": {
        "build": "latest",
        "memoryMbytes": 1024,
        "timeoutSecs": 3600
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "fields": {},
          "views": {
            "overview": {
              "title": "Steam Reviews",
              "transformation": {
                "fields": [
                  "gameTitle",
                  "rating",
                  "reviewText",
                  "authorName",
                  "authorSteamId",
                  "authorPlaytimeForever",
                  "votesHelpful",
                  "timestampCreated",
                  "language",
                  "steamPurchase",
                  "primarilySteamDeck",
                  "recordType",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "gameTitle": {
                    "label": "Game",
                    "format": "text"
                  },
                  "rating": {
                    "label": "Rating",
                    "format": "text"
                  },
                  "reviewText": {
                    "label": "Review",
                    "format": "text"
                  },
                  "authorName": {
                    "label": "Author",
                    "format": "text"
                  },
                  "authorSteamId": {
                    "label": "Author ID",
                    "format": "text"
                  },
                  "authorPlaytimeForever": {
                    "label": "Playtime (hrs)",
                    "format": "number"
                  },
                  "votesHelpful": {
                    "label": "Helpful Votes",
                    "format": "number"
                  },
                  "timestampCreated": {
                    "label": "Date",
                    "format": "text"
                  },
                  "language": {
                    "label": "Language",
                    "format": "text"
                  },
                  "steamPurchase": {
                    "label": "Steam Purchase",
                    "format": "text"
                  },
                  "primarilySteamDeck": {
                    "label": "Steam Deck",
                    "format": "text"
                  },
                  "recordType": {
                    "label": "Type",
                    "format": "text"
                  },
                  "scrapedAt": {
                    "label": "Scraped At",
                    "format": "text"
                  }
                }
              }
            }
          }
        }
      }
    },
    "buildNumber": "1.0.2",
    "imageDigest": "cae254c4c1d3ec92259d43dd3d41ab2f59d19a9535f5bd8f89ec196702426b4c",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.0037944444444444445
    }
  }
}