itch.io Game, Review, Creator and Jam Scraper icon

itch.io Game, Review, Creator and Jam Scraper

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…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

itch.io Game, Review, Creator and Jam Scraper at a glance

itch.io Game, Review, Creator and Jam Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes cover, game, creator or jam, record type and change type (incremental mode), which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Ecommerce
Pricing
$2.00 per 1,000 results (Free plan), from $1.00 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
30 options

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.

What itch.io Game, Review, Creator and Jam Scraper can do

  • The review thread, with creator replies. Other itch.io datasets stop at the star average. This one returns the individual comments, nested replies included, and flags every reply written by the game's own creator, so you can see not just the rating but how the studio actually answered.
  • The pay-what-you-want floor, not just the sticker price. A large share of the catalogue is "name your own price". Both numbers come back separately, read from the page's own payload rather than from button text, so a free game, a donation game and a fixed-price game are never confused.
  • Five modes, one output contract. Browse, keyword search, creator, jam and pasted links all produce the same flat record shape, so a mixed pull needs no branching downstream.
  • Jam results in full. A ranked jam returns every entry's overall rank, its number of ratings, its adjusted score, and its rank and score under each individual criterion the jam scored on.
  • Creator profiles with public follower counts. A creator record carries their catalogue, their outbound links, and the follower, post and topic counters, read exactly rather than from the abbreviated text the page shows.
  • Recurring monitoring built in. Incremental mode returns only what changed since the last run of the same search, and Resume continues one interrupted pull without paying for rows you already have.

Choose what to collect

These inputs let you configure itch.io Game, Review, Creator and Jam Scraper. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredChoose '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.

Choices: browse, search, developer, jam, url

queriesarrayOnly 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.
creatorsarrayOnly 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.
jamsarrayOnly 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.
jamScopestringOnly used when mode = jam and Jams is empty. Which of the site's own jam listings to read.

Choices: in-progress, upcoming-featured, starting-this-month, past

urlsarrayOnly 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.
genresarrayBrowse 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.
Show 23 more inputs
More input fields
InputWhat it controls
tagsarrayBrowse 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.
jamEntriesstringBrowse 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.

Choices: any, in-jam, not-in-jam

sortBystringBrowse 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.

Choices: popular, newest, top-rated, top-sellers, new-and-popular

platformstringBrowse, 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.

Choices: any, windows, macos, linux, android, ios, web

pricestringKeep 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.

Choices: any, free, on-sale, under-5, under-15

hasDemobooleanBrowse, 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.
minRatingintegerBrowse, 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.
minRatingCountintegerBrowse, 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.
fetchDetailsbooleanRead 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.
maxReviewsPerGameintegerCap 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. Values above 500 are limited to 500; the field accepts at most 1000.
includeJamEntriesbooleanUsed 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.
maxJamEntriesintegerCap on how many ranked entries are returned per jam. Use 0 for all entries, up to 1000; larger values are limited to 1000.
maxItemsintegerMaximum 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.
maxPagesintegerMaximum 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.
resumeFromRunIdstringPaste 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.
incrementalModebooleanTurn 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. A record counts as UPDATED when any returned field changes, including price, sale, rating, rating count, tags, files, followers or jam counts. These never count and never appear in Changed fields: scrape time, source URL, the review rows (use the review count and rating instead), the demo flag and the latest devlog post (title, date, link), relative-time wording, and a jam's rank, score and ranked entries; add more with Ignore fields when detecting changes below. 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.
stateKeystringOptional. 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.
emitUnchangedbooleanOff 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.
emitExpiredbooleanOff 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.
ignoreFieldsForChangesarrayOptional. Field names that must not make a record UPDATED or appear in Changed fields, for example ratingCount or followers when you do not care about that movement. Use a dotted path such as files.size to ignore one key inside every item of a list. The fields still appear in the output; they are only left out of the comparison. Changing this list never marks the whole baseline as updated.
mcpConnectorsarrayOptionally 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).
notionParentPageUrlstringURL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

coverImageUrlCover (image)
titleGame
nameCreator or jam
recordTypeRecord type (text)
changeTypeChange type (incremental mode) (text)
recordIdRecord ID
gameIdGame ID
urlURL (link)
developerNameCreator
developerUrlCreator URL (link)
genreGenre
tagsTags (array)
Show 56 more fields
platformsPlatforms (array)
priceUsdPrice (USD) (number)
minimumPriceUsdPay what you want floor (USD) (number)
pricingModelPricing model
isOnSaleOn sale (boolean)
salePercentDiscount % (number)
ratingRating (0 to 5) (number)
ratingCountRatings (number)
statusStatus
publishedAtPublished (date)
updatedAtUpdated (date)
hasDemoHas a demo (boolean)
updateTitleLatest devlog post
updatePublishedAtLatest devlog post date (date)
filesFiles (array)
jamNameSubmitted to jam
jamUrlJam URL (link)
jamRankJam rank (number)
jamScoreJam score (number)
reviewCountReviews (total on the page) (number)
reviewsReturnedReviews returned (number)
reviewsReview thread (array)
shortTextTagline
descriptionDescription
followersFollowers (number)
postsPosts (number)
topicsTopics (number)
followingFollowing (number)
memberSinceMember since (date)
profileUrlProfile URL (link)
gameCountGames in catalogue (number)
gamesCatalogue (array)
jamSlugJam handle
hostNamesHosted by (array)
joinedCountJoined (number)
submissionCountSubmissions (number)
isRankedRanked jam (boolean)
deadlineAtDeadline (date)
startsAtStarts (date)
endsAtEnds (date)
criteriaJudging criteria (array)
entriesReturnedRanked entries returned (number)
topEntriesRanked entries (array)
scrapedAtScraped at (date)
changedFieldsChanged fields (incremental mode) (array)
firstSeenAtFirst seen (incremental mode) (date)
lastSeenAtLast seen (incremental mode) (date)
jamIdjamId
hostUrlshostUrls
isFeaturedisFeatured
resultsSummaryresultsSummary
resultsUrlresultsUrl
entriesUrlentriesUrl
developerSlugdeveloperSlug
biobio
avatarUrlavatarUrl

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "recordType": "game",
  "recordId": "game-1",
  "gameId": 1,
  "title": "Sample Game Title",
  "url": "https://sample-studio.itch.io/sample-game",
  "slug": "sample-game",
  "developerName": "Sample Studio",
  "developerUrl": "https://sample-studio.itch.io",
  "developerSlug": "sample-studio",
  "shortText": "A one line tagline for the game.",
  "coverImageUrl": "https://img.itch.zone/000000000/315x250/cover.png",
  "description": "The full page description appears here when fetchDetails is on.",
  "genre": "Puzzle",
  "tags": [
    "atmospheric",
    "pixel art"
  ],
  "platforms": [
    "Windows",
    "macOS"
  ],
  "madeWith": [
    "Godot"
  ],
  "languages": [
    "English"
  ],
  "inputs": [
    "Keyboard",
    "Mouse"
  ],
  "accessibility": [
    "Subtitles"
  ],
  "averageSession": "About an hour",
  "status": "Released",
  "publishedAt": "2026-01-01T00:00:00Z",
  "updatedAt": "2026-01-01T00:00:00Z",
  "priceUsd": 4.99,
  "minimumPriceUsd": 0,
  "pricingModel": "name-your-own-price",
  "isOnSale": false,
  "salePercent": null,
  "rating": 4.6,
  "ratingCount": 1234,
  "isBrowserPlayable": false,
  "hasDevlog": true,
  "hasDemo": false,
  "updateTitle": "Version 1.1 patch notes",
  "updateUrl": "https://sample-dev.itch.io/sample-game/devlog/1/version-1-1-patch-notes",
  "updatePublishedAt": "2026-04-16T22:23:00Z",
  "files": [
    {
      "name": "sample-game-win.zip",
      "sizeText": "120 MB",
      "platforms": [
        "Windows"
      ]
    }
  ],
  "jamName": "Sample Game Jam 2026",
  "jamSlug": "sample-game-jam",
  "jamUrl": "https://itch.io/jam/sample-game-jam",
  "jamEntryId": 1,
  "reviewCount": 210,
  "reviewsReturned": 2,
  "reviews": [
    {
      "reviewId": 1,
      "url": "https://itch.io/post/1",
      "authorName": "player-one",
      "authorUrl": "https://itch.io/profile/player-one",
      "authorSlug": "player-one",
      "authorId": 1,
      "postedAt": "2026-01-01T00:00:00Z",
      "postedAgo": "3 days ago",
      "body": "Loved the ending.",
      "isReply": false,
      "replyDepth": 0,
      "parentReviewId": null,
      "isDeveloperReply": false
    },
    {
      "reviewId": 2,
      "url": "https://itch.io/post/2",
      "authorName": "Sample Studio",
      "authorUrl": "https://itch.io/profile/sample-studio",
      "authorSlug": "sample-studio",
      "authorId": 2,
      "postedAt": "2026-01-01T00:00:00Z",
      "postedAgo": "3 days ago",
      "body": "Thank you, a sequel is in the works.",
      "isReply": true,
      "replyDepth": 1,
      "parentReviewId": 1,
      "isDeveloperReply": true
    }
  ],
  "scrapedAt": "2026-01-01T00:00:00Z",
  "sourceUrl": "https://itch.io/games/genre-puzzle"
}

Ways to use this data

  • Indie game researchers and journalists: build genre or tag datasets with price, rating and platform coverage for market reports.
  • Community managers and developers: pull a game's full review thread, creator replies included, to audit community sentiment over time.
  • Game jam organizers and analysts: turn a jam's ranked result table into a leaderboard, or a breakdown by individual judging criterion.
  • Price and sales trackers: watch a genre or tag for pay-what-you-want floors, discounts and price-band changes.
  • Talent scouts and publishers: read a creator's whole catalogue plus their public follower count to gauge an indie studio's reach.
  • Curation and newsletter teams: schedule incremental runs over a tag or genre to surface new releases automatically.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does itch.io Game, Review, Creator and Jam Scraper return?

The documented output for itch.io Game, Review, Creator and Jam Scraper includes cover, game, creator or jam, record type, change type (incremental mode), record id, game id and url. Availability of each field depends on the source page and the selected mode.

How much does itch.io Game, Review, Creator and Jam Scraper cost?

It costs $2.00 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Can I get only new or changed games on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only NEW, UPDATED and REAPPEARED records for the same search, and unchanged ones are not billed unless Emit unchanged is on. EXPIRED rows for games that disappeared are produced only once a run has fully scanned the tracked search, never after a capped run, a resumed run, or a browse scope that hit the site's own 200-page depth limit.

What's the most common point of confusion?

The site itself serves at most two filter slots on a browse address, and a chosen ordering other than Popularity uses one of them. Asking for genre, tag, platform, price, jam entry and a non-default ordering all at once needs more slots than the site will serve, so the run stops before spending any requests and names exactly which filters to drop.

Why is a game missing, or the count short, when I searched several keywords or pasted several links?

Max results is split across targets, and when a list is cut short to fit a target's share, the actor still marks every game it read on that page as already scanned, not only the ones it returned. A later keyword or pasted search or browse link that lists one of those unreturned games skips it too, so it is never returned at all. Example: two keywords, Max results 6 (3 each). The first keyword's page has 36 games and returns 3. The second keyword's page has 2 games: one of the first keyword's 33 unreturned games, and one new game. The run returns 4 records instead of 6, and the skipped game is missing from the output. A platform restart part-way through the run carries the same "already scanned" list forward, so it does not bring those games back; Resume from a previous run is not affected. Browse mode, a single keyword, creator mode and jam mode are not affected. Run one keyword or one link per call, or set Max results to 0 (or high enough that every target's share covers everything it returns).

Why did my run fail instead of returning an empty dataset?

If no results page can be loaded, the run stops with the message "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search.", so "no games matched" is never confused with "nothing could be read". Run it again in a few minutes. If only some pages could be read, you still get what was found, and the run's status message says how many requests were rejected.

Ready to collect with itch.io Game, Review, Creator and Jam Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.