{
  "openapi": "3.0.1",
  "info": {
    "title": "itch.io Game, Review, Creator and Jam Scraper",
    "description": "Scrape itch.io games by genre, tag, platform, price band or keyword, plus creator catalogues and game jam results. Returns price and pay-what-you-want floor, rating, tags, platforms, files and the full review thread with creator replies. Incremental mode tracks changes.",
    "version": "1.0",
    "x-build-id": "QdBdGLlfIVZdKny4b"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~itch-io-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-itch-io-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/abotapi~itch-io-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-itch-io-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/abotapi~itch-io-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-itch-io-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "browse",
              "search",
              "developer",
              "jam",
              "url"
            ],
            "type": "string",
            "description": "Choose 'browse' to walk the site's game index with the filters below, 'search' to search by keyword, 'developer' to pull named creators with their catalogue, 'jam' to read game jams and their ranked results, or 'url' to scrape pasted game, creator, jam, browse and search links.",
            "default": "browse"
          },
          "queries": {
            "title": "Search keywords",
            "type": "array",
            "description": "Only used when mode = search, ignored in the other modes. One or more keywords, for example 'horror', 'pixel art platformer' or a studio name. The site returns one page of matches per keyword.",
            "items": {
              "type": "string"
            }
          },
          "creators": {
            "title": "Creators",
            "type": "array",
            "description": "Only used when mode = developer, ignored in the other modes. Creator handles such as 'gbpatch', full creator page links, or a link to any game they made.",
            "items": {
              "type": "string"
            }
          },
          "jams": {
            "title": "Jams",
            "type": "array",
            "description": "Only used when mode = jam, ignored in the other modes. Jam handles such as 'gmtk-2024' or full jam links. Leave empty to read a whole listing instead.",
            "items": {
              "type": "string"
            }
          },
          "jamScope": {
            "title": "Jam listing (used when no jams are named)",
            "enum": [
              "in-progress",
              "upcoming-featured",
              "starting-this-month",
              "past"
            ],
            "type": "string",
            "description": "Only used when mode = jam and Jams is empty. Which of the site's own jam listings to read.",
            "default": "in-progress"
          },
          "urls": {
            "title": "Site links",
            "type": "array",
            "description": "Only used when mode = url, ignored in the other modes. Mix freely: game pages such as https://studio.itch.io/game-name, creator pages, jam pages, browse addresses such as https://itch.io/games/genre-puzzle and search addresses.",
            "items": {
              "type": "string"
            }
          },
          "genres": {
            "title": "Genres",
            "type": "array",
            "description": "Browse mode only. Optional, one filter slot each. Genres written the way the site writes them, for example 'Puzzle', 'Visual Novel' or 'Role Playing'. Capitals, spaces and punctuation do not matter. Checked against the site's OWN published genre list every run; a genre the site does not publish is reported with close matches, and if none of your genres exist the run stops rather than quietly returning the unfiltered index. Note the site's own behaviour: its genre listing returns games in that genre AND closely related ones, so roughly half of a page carries that genre as its own primary genre.",
            "items": {
              "type": "string"
            }
          },
          "tags": {
            "title": "Tags",
            "type": "array",
            "description": "Browse mode only. Optional, one filter slot each. Tags written the way they appear under a game, for example 'horror', 'pixel art' or 'multiplayer'. A tag the site does not publish stops the run with a message naming it, rather than returning the unfiltered index.",
            "items": {
              "type": "string"
            }
          },
          "jamEntries": {
            "title": "Jam entries",
            "enum": [
              "any",
              "in-jam",
              "not-in-jam"
            ],
            "type": "string",
            "description": "Browse mode only. Optional, one filter slot. Keep only games that were submitted to a game jam, or only games that were not. The site's keyword search publishes no jam-entry option, so choosing one outside browse mode stops the run instead of being ignored.",
            "default": "any"
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "popular",
              "newest",
              "top-rated",
              "top-sellers",
              "new-and-popular"
            ],
            "type": "string",
            "description": "Browse mode only. The order the site returns results in. Every value is one of the site's OWN orderings, applied at the source. Popularity is the site default and is the only value that does NOT use one of the two filter slots, so leaving it alone frees a slot for a second filter. The site's keyword search returns results in its own relevance order and offers no ordering option, so choosing anything other than the default outside browse mode stops the run instead of being ignored.",
            "default": "popular"
          },
          "platform": {
            "title": "Platform",
            "enum": [
              "any",
              "windows",
              "macos",
              "linux",
              "android",
              "ios",
              "web"
            ],
            "type": "string",
            "description": "Browse, search and url modes. Optional. Keep only games released for this platform. Applied by the site itself either way, so it narrows at the source: as one browse filter slot, or as the search facet of the same name. A pasted browse address in url mode keeps its own platform segment instead.",
            "default": "any"
          },
          "price": {
            "title": "Price",
            "enum": [
              "any",
              "free",
              "on-sale",
              "under-5",
              "under-15"
            ],
            "type": "string",
            "description": "Keep only games in this price band, applied by the site itself. The browse index publishes all five bands and each uses one filter slot. The keyword search publishes only the free or paid split, so 'Currently discounted', '$5 or less' and '$15 or less' are BROWSE ONLY: choosing one in search or url mode stops the run with a message rather than quietly returning every price.",
            "default": "any"
          },
          "hasDemo": {
            "title": "Has a demo",
            "type": "boolean",
            "description": "Browse, search and url modes. Keep only games that publish a playable demo. One browse filter slot, or the search facet of the same name. A pasted browse address in url mode keeps its own segments instead.",
            "default": false
          },
          "minRating": {
            "title": "Minimum rating (0 to 5)",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Browse, search and url modes. Optional. Keep only games rated at or above this score on the site's own 0 to 5 scale. No listing publishes a rating, so this reads each game's own page and requires Fetch details and reviews. Use 0 for no minimum.",
            "default": 0
          },
          "minRatingCount": {
            "title": "Minimum number of ratings",
            "minimum": 0,
            "type": "integer",
            "description": "Browse, search and url modes. Optional. Keep only games rated at least this many times, which is the usual way to drop games whose average rests on a handful of votes. Reads each game's own page and requires Fetch details and reviews. Use 0 for no minimum.",
            "default": 0
          },
          "fetchDetails": {
            "title": "Fetch details and reviews",
            "type": "boolean",
            "description": "Read each record's own page. For a game that adds the description, the full tag, language, input and accessibility lists, the publish and update stamps, the exact price and pay-what-you-want floor, the file list, the jam it was submitted to, the rating and rating count, and the REVIEW THREAD: every public comment with its author, the exact time, the body, the reply nesting, and whether the reply came from the game's own creator. For a creator it adds the public follower, post and topic counters. For a jam it adds the ranked result table. One extra request per record, billed as one Detail enrichment event per record returned.",
            "default": false
          },
          "maxReviewsPerGame": {
            "title": "Max reviews per game",
            "minimum": 0,
            "type": "integer",
            "description": "Cap on how many comments from a game's review thread are returned. Use 0 to return the game without its thread. The game's own page already carries about 40 recent comments at no extra cost; a higher cap walks the thread further, which costs extra requests but is never charged more than the single Detail enrichment event for that game.",
            "default": 20
          },
          "includeJamEntries": {
            "title": "Also return each jam's ranked results",
            "type": "boolean",
            "description": "Used in jam mode and for a jam link pasted in url mode, together with Fetch details and reviews. On by default: the jam row is returned with its ranked entry table, each entry carrying its overall rank, its number of ratings, its adjusted score, and its rank and score under every criterion the jam scored on. Switch off to return the jam row alone.",
            "default": true
          },
          "maxJamEntries": {
            "title": "Max ranked entries per jam",
            "minimum": 0,
            "type": "integer",
            "description": "Cap on how many ranked entries are returned per jam. Use 0 for every entry the results page publishes.",
            "default": 20
          },
          "maxItems": {
            "title": "Max results",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of records to return across the whole run. This is the run's cap. Use 0 for unlimited. Note the site's own limit underneath it: one browse scope stops at page 200, which is 7,200 games; narrow the filters or change the ordering to reach past that.",
            "default": 20
          },
          "maxPages": {
            "title": "Max result pages per scope",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of result pages read per keyword, creator, jam or browse address. 0 means no limit, which is the default: the run then stops only at Max results, at the end of the results, or at the site's own 200-page browse limit.",
            "default": 0
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large pull without returning or charging for records already collected there. Use this after an interrupted run. For recurring daily monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns every matching record as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED records. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately for each mode, target and filter setup; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the mode, targets and filters, so different searches never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged records (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired records (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return records that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, so never when Max results capped it, when Resume was used, or when a scope hit the site's own 200-page browse limit. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy is recommended. The standard pool is the default and is sufficient for this site.",
            "default": {
              "useApifyProxy": true
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write or digest. Leave empty to skip; never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}