{
  "openapi": "3.0.1",
  "info": {
    "title": "Steam Game Data API — Prices, Players & Charts",
    "description": "Scrape Steam as data. One row per game: price, discount, release date, developer, genres, tags, Metacritic, live player count, owner estimates and the review score. Plus the Most Played and Top Sellers charts, Specials, and store search by keyword or tag. No API key, no login.",
    "version": "0.1",
    "x-build-id": "Y3BObeS2QExjdwlwW"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/insight.solutions~steam-store-stats-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-insight.solutions-steam-store-stats-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-store-stats-api/runs": {
      "post": {
        "operationId": "runs-sync-insight.solutions-steam-store-stats-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-store-stats-api/run-sync": {
      "post": {
        "operationId": "run-sync-insight.solutions-steam-store-stats-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",
        "properties": {
          "apps": {
            "title": "Games",
            "type": "array",
            "description": "One entry per game, as a store link (`https://store.steampowered.com/app/1245620/`), a bare app ID (`570`) or the game's name (`Elden Ring`). Each entry becomes one `game` row — price, discount, release date, developer, genres, tags, Metacritic, live player count, owner estimates and the review score. A name costs one extra request through Steam's search box and is flagged `resolvedFrom: name`. DLC, demos and soundtracks work too; duplicates are read, and billed, once.",
            "items": {
              "type": "string"
            }
          },
          "charts": {
            "title": "Charts",
            "type": "array",
            "description": "Ranked lists, each one a handful of requests for up to 500 rows. `most-played` is Valve's live top 100 by concurrent players; `top-sellers` and `global-top-sellers` are the store's best-seller ranking (the first weighted to your `country`, the second worldwide); `specials`, `new-releases` and `coming-soon` are its front-page sections; `top-releases` is Valve's monthly list for the newest three months; `steamspy-top-2weeks` is the only chart carrying owner estimates.",
            "items": {
              "type": "string",
              "enum": [
                "most-played",
                "top-sellers",
                "global-top-sellers",
                "new-releases",
                "specials",
                "coming-soon",
                "top-releases",
                "steamspy-top-2weeks"
              ],
              "enumTitles": [
                "Most played — Valve's live top 100 by concurrent players",
                "Top sellers — the store's best-seller ranking for your country",
                "Global top sellers — the worldwide best-seller ranking",
                "New releases — the store's new-and-trending section",
                "Specials — what is discounted right now",
                "Coming soon — upcoming releases with a store page",
                "Top releases — Valve's monthly lists, newest 3 months",
                "SteamSpy top 100 (2 weeks) — with owner estimates"
              ]
            }
          },
          "chartSize": {
            "title": "Chart size",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "How deep each chart goes. The ceilings are the upstream's, not ours: **100** for `most-played` and `steamspy-top-2weeks` (that is the whole list Valve and SteamSpy publish), **500** for the search-backed charts, which page 50 at a time, and whatever the section holds for `specials`, `coming-soon` and `top-sellers` (10 each) and `new-releases` (30). Anything larger is clamped rather than refused.",
            "default": 50
          },
          "country": {
            "title": "Country (storefront)",
            "type": "string",
            "description": "Two-letter ISO country code, lower case. Steam prices per storefront: `us` gives USD, `de` gives EUR, `br` gives BRL, and the discount on a game is often different in each. It also changes which games are listed at all — some titles are not sold in some countries — and it weights the `top-sellers` chart. It does **not** change SteamSpy's estimates, which are global.",
            "default": "us"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Steam's `l` parameter, which decides the language of descriptions, genre names and category names. `en` is English; `german`, `french`, `schinese` and the rest of Steam's own language names work too. It does not translate the game's title, which is whatever the publisher registered.",
            "default": "en"
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Search the Steam store by keyword, exactly as the store's own search box does. Each query returns up to `maxResultsPerQuery` **search-result** rows — name, app ID, price, discount, release date, review summary, platforms and Steam's tag IDs — in the store's own ranking. Combine with `tagIds` and `sortBy` to build a list: \"every Soulslike released this year, cheapest first\". Leave the query empty and set `tagIds` to browse a tag rather than search for words.",
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Sort search results by",
            "enum": [
              "relevance",
              "released",
              "name",
              "price-asc",
              "price-desc",
              "reviews"
            ],
            "type": "string",
            "description": "The order the store returns hits in. **Relevance** is Steam's own ranking and the default. **Release date** is newest first and is what you want for a \"what came out this week\" list. **Reviews** ranks by review score, which is how you find the well-liked end of a tag.",
            "default": "relevance"
          },
          "tagIds": {
            "title": "Steam tag IDs",
            "type": "array",
            "description": "Restrict every search query to games carrying these Steam tags, by numeric ID — two IDs means games carrying **both**. The ones you will reach for: `19` Action, `492` Indie, `21` Adventure, `122` RPG, `599` Simulation, `9` Strategy, `1695` Open World, `1663` FPS, `4026` Souls-like, `1716` Roguelike, `4191` Story Rich, `1667` Horror. The README lists 50 and steamdb.info/tags has the rest; every `search-result` row carries the same numbers in its `tagIds` column.",
            "items": {
              "type": "string"
            }
          },
          "maxResultsPerQuery": {
            "title": "Results per query",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "How many hits each search query returns. The store serves 50 a page and this Actor pages up to 500. A query that matches fewer returns fewer; a query that matches nothing gets a free `no-results` row.",
            "default": 50
          },
          "onlyGames": {
            "title": "Games only",
            "type": "boolean",
            "description": "Filter searches and the search-backed charts to **games**, leaving out DLC, soundtracks, software, videos, hardware and bundles. On by default, because a search for a popular title otherwise fills up with its own DLC. Turn it off to see packages and bundles as well; those rows carry `itemType: package` or `bundle` and have no app ID.",
            "default": true
          },
          "includePlayerCount": {
            "title": "Include the live player count",
            "type": "boolean",
            "description": "Add `currentPlayers` — how many people are in the game **right now**, from Valve's own endpoint. One extra request per game, and the single most perishable number here: it is a snapshot, not an average. Apps Valve does not track (most DLC, soundtracks and tools) return null rather than zero.",
            "default": true
          },
          "includeSteamSpy": {
            "title": "Include SteamSpy estimates",
            "type": "boolean",
            "description": "Add SteamSpy owner and playtime **estimates** plus community tags: `ownersMin`/`ownersMax`, `averagePlaytimeMin`, `medianPlaytimeMin`, `ccuYesterday`, `tags` and `tagVotes`. They are sampled from public profiles rather than published by Valve, which is why owners is a range. One extra request per game, queued at one a second across the whole run because that is the rate SteamSpy asks for; an outage leaves these columns null and never fails a row.",
            "default": true
          },
          "includeReviewSummary": {
            "title": "Include the review score",
            "type": "boolean",
            "description": "Add `reviewScoreDesc` (\"Very Positive\"), `totalReviews`, `positiveReviews`, `negativeReviews` and `positiveRatio`. One extra request per game, and a cheap one — it asks for zero reviews and gets back only the totals. For the reviews themselves, see the companion Steam Reviews API.",
            "default": true
          },
          "enrichChartEntries": {
            "title": "Build a full game row for every chart and search hit",
            "type": "boolean",
            "description": "Look every chart position and search hit up in full, adding a `game` row beside its `chart-entry` or `search-result` row. **This is the expensive option**: up to four requests per app, so an enriched Top 100 is around 400 requests and several minutes, and every one of those rows is billed as a game. Off by default — a chart row already carries the name, rank, price, discount, review summary and platforms, which is what most chart work needs.",
            "default": false
          },
          "maxConcurrency": {
            "title": "Jobs in parallel",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many games, charts or queries are read at once. Each parallel worker keeps its own proxy session, so one blocked job burns only its own exit IP. SteamSpy is the exception: its requests queue through a single slot at one a second whatever this is set to.",
            "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 fetching, keeps and bills for every row it already wrote, and files a free diagnostic row for each entry it never reached. A chart stopped part-way keeps its ranks. Nothing is charged for work that did not happen.",
            "default": 240
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Steam's store and Web API endpoints answer datacenter addresses happily — every endpoint this Actor reads was captured through one — so the default is Apify's datacenter proxy, much cheaper than residential, and the proxy cost is already inside the per-row price. Switch to residential only if you are running large volumes 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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}