{
  "openapi": "3.0.1",
  "info": {
    "title": "Steam Scraper - Game Prices, Reviews & Player Counts",
    "description": "Any Steam game by app id or search term: price, discount, genres, developers, Metacritic, Steam's review rollup and the live player count. The same game priced on every storefront you list, each in its own currency. Individual reviews carry the playtime behind the verdict.",
    "version": "0.0",
    "x-build-id": "Atl0Qt9eVtlKbg1tz"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/eiv~steam-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-eiv-steam-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/eiv~steam-scraper/runs": {
      "post": {
        "operationId": "runs-sync-eiv-steam-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/eiv~steam-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-eiv-steam-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": {
          "appIds": {
            "title": "App IDs",
            "type": "array",
            "description": "Steam app ids, one per line. 1091500 is Cyberpunk 2077, 730 is Counter-Strike 2. Paste the whole store URL if you prefer — store.steampowered.com/app/730/ is reduced to 730 for you. Anything that is neither a number nor a store URL is dropped with a warning. Steam answers appdetails for one app per request and rejects a batch of ids with HTTP 400, so a long list is a long run, not a single call.",
            "items": {
              "type": "string"
            }
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Phrases to put through the Steam store search, e.g. 'roguelike deckbuilder'. Every app id the search returns is then read in full, the same as an id you typed. The store ranks by its own relevance and answers with what it chooses to; this is a discovery aid, not an exhaustive catalogue query.",
            "items": {
              "type": "string"
            }
          },
          "maxSearchResults": {
            "title": "Max results per search term",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Cap on the app ids taken from each search term. Steam's search page returns at most 100 per call, so a higher number is trimmed to 100.",
            "default": 50
          },
          "countries": {
            "title": "Storefronts",
            "type": "array",
            "description": "Two-letter storefront codes. The first is the home storefront: it supplies the full record and the top-level price, currency and discount fields. The rest are asked for price only and land in regionalPrices. Regional pricing is real — the same game measured $59.99 in us, GBP 49.99 in gb, EUR 59.99 in de, BRL 199.90 in br and $44.99 in tr. Nothing is converted between currencies, so cheapestCountry and dearestCountry are worked out only among storefronts quoting the home currency; comparing across currencies is left to you and a rate you trust. Each extra storefront is one more request per game.",
            "items": {
              "type": "string"
            }
          },
          "includePlayerCount": {
            "title": "Include live player count",
            "type": "boolean",
            "description": "Adds currentPlayers, read live from Steam's own counter. One keyless request of about 65ms per game. Some apps report nothing, and those come back null rather than 0 — no answer is not the same as an empty server.",
            "default": true
          },
          "includeReviews": {
            "title": "Include individual reviews",
            "type": "boolean",
            "description": "Off by default. Steam's review rollup — score description, totals, positive rate — is on every game record either way; this adds one row per review on top. Reviews page 100 at a time by cursor, so 500 reviews means five extra requests and roughly 450 KB for that game.",
            "default": false
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per game",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Ceiling per game, reached a page of 100 at a time. Ignored unless reviews are switched on. Paging stops when Steam repeats its cursor, so a game with fewer reviews than the cap simply returns what it has.",
            "default": 200
          },
          "reviewLanguage": {
            "title": "Review language",
            "type": "string",
            "description": "A Steam language name such as english, russian or schinese, or all. This narrows which reviews come back. It does not change totalReviews or positiveRate, which stay game-wide — the count for the language you asked for is reported separately as reviewsInLanguage.",
            "default": "all"
          },
          "reviewFilter": {
            "title": "Review order",
            "enum": [
              "recent",
              "updated",
              "all"
            ],
            "type": "string",
            "description": "recent is newest first, all is Steam’s own usefulness order, updated is recently edited. This decides whether weightedVoteScore means anything: on recent the reviews are minutes old with no votes, so Steam returns a flat 0.5 for every one of them, while all gave 78 distinct weights across 100 reviews of the same game. Use all if you want to rank by how useful other players found a review.",
            "default": "recent"
          },
          "genres": {
            "title": "Genres",
            "type": "array",
            "description": "Keep only games carrying one of these genres. Matched case-insensitively and as a substring, so 'rpg' catches 'RPG' and 'action' catches 'Action-Adventure'. Any one matching is enough.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Any one matching is enough. Searched in the name, the short description, the genre and category lists, and the developer and publisher names. Not the long description, which is only fetched when you ask for it.",
            "items": {
              "type": "string"
            }
          },
          "freeOnly": {
            "title": "Free games only",
            "type": "boolean",
            "description": "Keep only games Steam flags as free to play. Free games carry no price block at all — CS2 and Dota 2 return nothing where the price would be — so their price, currency and discount fields are null, not zero.",
            "default": false
          },
          "onSaleOnly": {
            "title": "Discounted games only",
            "type": "boolean",
            "description": "Keep only games discounted right now on the home storefront. A game on sale in another region but not at home is dropped, because the top-level discount is the home storefront's.",
            "default": false
          },
          "minPrice": {
            "title": "Minimum price",
            "minimum": 0,
            "type": "number",
            "description": "In the home storefront's own currency, in units rather than cents: 19.99, not 1999. No conversion is applied anywhere, so a floor of 20 means 20 dollars on a us run and 20 pounds on a gb one. Free and unreleased games have no price and are dropped by a floor, because a price floor is a question only a priced game can answer."
          },
          "maxPrice": {
            "title": "Maximum price",
            "minimum": 0,
            "type": "number",
            "description": "Same units, and the same currency caveat as the floor. Unlike the floor this keeps unpriced games: a free game satisfies any budget. A ceiling below the floor is ignored with a warning rather than quietly returning nothing."
          },
          "minMetacritic": {
            "title": "Minimum Metacritic score",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "0 to 100. This drops every game with no Metacritic score, which is most of Steam — plenty of well-regarded games were never scored there. Leave it empty and use the positive review rate instead if you want a quality floor that does not throw the unscored away."
          },
          "minPositiveRate": {
            "title": "Minimum positive review rate",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "The share of Steam reviews that are positive — the number the store badge is built from. Give a rate (0.85) or a percentage (85); anything above 1 is read as a percentage. A game with no reviews has no rate and is dropped by this."
          },
          "releasedWithinDays": {
            "title": "Released within (days)",
            "minimum": 1,
            "maximum": 36500,
            "type": "integer",
            "description": "Drop anything released longer ago than this. Games marked 'coming soon' are kept, because an unreleased game is not an old one. Steam writes some release dates for humans ('Q1 2025', 'Coming soon'); those are left null rather than guessed into 1 January, and games carrying one are kept."
          },
          "includeDescription": {
            "title": "Include the full description",
            "type": "boolean",
            "description": "Adds the long store description with the HTML stripped out, and lifts the field filter on appdetails so the fetch goes from 6-15 KB to 15-34 KB per game. Be aware how little some of it is worth: Steam’s detailed_description is marketing HTML, and for the biggest games it is almost entirely images. Stripped, Cyberpunk 2077 yields 47 characters and The Witcher 3 yields 55, against 3,750 for Stardew Valley and 2,933 for GTA V. The short description is included either way and is a real sentence every time.",
            "default": false
          },
          "flattenOutput": {
            "title": "Flatten output for CSV",
            "type": "boolean",
            "description": "Emit flat dot-notation columns instead of nested objects. It mainly affects regionalPrices, which is otherwise one object per storefront.",
            "default": false
          },
          "maxConcurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Games read in parallel. Each game is several requests — one per storefront, one per page of reviews, one for the player count — with a 250ms gap between the calls belonging to one game. 25 sequential requests drew no complaint from Steam, which is documented at roughly 200 requests per 5 minutes; three at a time keeps a long run inside that.",
            "default": 3
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 180,
            "type": "integer",
            "description": "Per-request timeout. A page of 100 reviews is about 90 KB, so the default is generous for everything except a congested proxy.",
            "default": 60
          },
          "maxRetries": {
            "title": "Retries per request",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Retries for connection resets and 5xx responses. An HTTP 429 is not retried into the ground: that game is reported with errorCode HTTP_429 so you can lower the concurrency and run it again.",
            "default": 2
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional. Steam's store endpoints need no key and did not block a direct run. Worth adding for a long list, or when your own address is already being rate limited. A proxy exit in another country does not change which storefront answers — that is what the storefront list is for.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}