Steam review analysis for game developers

Steam has no review export button, so the route is the public appreviews endpoint: no API key, up to 100 reviews per request, paged with a cursor. Three defaults quietly drop reviews unless you change them. Once the reviews are in a CSV, read them by topic and by the share that do not recommend the game, because a Steam review is a thumbs up or down, not a star rating.

What this comes down to

  • There is no download button for Steam reviews, not even in Steamworks; the public appreviews endpoint is the documented route and needs no API key.
  • Set purchase_type=all, decide on filter_offtopic_activity, and page with filter=recent, or the file will be missing reviews without saying so.
  • Check the app ID before pulling anything: one name on Steam can belong to several games, and each has its own reviews.
  • A Steam review is a recommendation, not a score, so the useful number is the share of not-recommended reviews per topic.
  • Playtime at review, early access and free copies are in the data; keeping them lets you tell a first-hour complaint from a veteran’s.

SellerSort Team · Updated

Getting the reviews out of Steam

Steamworks shows your reviews but has no download for them. The documented route is one public URL:

store.steampowered.com/appreviews/<app id>?json=1

It needs no API key and returns at most 100 reviews per request. Each response carries a cursor; send it back, URL-encoded, to get the next batch, and stop when a batch comes back empty. Then write the fields you need to a CSV. The exact request and the columns to keep are on the Steam export page.

On Steam there is no average rating to watch. There is only who stopped recommending you, and why.

Three defaults that quietly drop reviews

A file can look complete and still be missing reviews. Steam’s documentation lists why:

Steam review request parameters that change what you get
ParameterDefaultWhat to set
purchase_typesteam: only players who bought on Steamall, if you sell keys elsewhere or the game is free
filter_offtopic_activityReview bombs filtered out0 to keep them; decide on purpose, then say which you chose
filterall: sorted by helpfulness within a day rangerecent or updated, so paging reaches the end

Add language=all as well, unless you only want one language. A player base that reviews in several languages is common, and the complaint that matters may be written in the one you did not request.

Check the app ID before you pull anything

The app ID is the number in the store URL, and it is the only thing the endpoint looks at. Names are not unique. Search Steam for Delta Force and you get the current free-to-play shooter, app 2507950, next to the older NovaLogic games that share the name, such as 32610 and 32630, and the Black Hawk Down DLC at 2918370, which has a store page of its own.

Pull the wrong one and the analysis is about a different game. For your own title the ID is in Steamworks; for anything else, copy it from the store page you meant.

Thumbs, not stars: what to count instead

Each review has voted_up, true or false. There is no 1 to 5 score, so an average rating does not exist and should not be invented by turning thumbs into fives and ones. Leave the rating column unmapped in the Review Analyzer, which only reads a 1 to 5 scale.

Count this instead: for each topic, how many reviews raise it, and what share of those do not recommend the game. A topic mentioned often by players who still recommend it is an irritation. A topic that shows up mostly in not-recommended reviews is the one costing you players.

timestamp_created is Unix time. Convert it to an ISO date such as 2026-09-27 when you write the CSV, or the analyzer will not read it as a date.

The fields other stores do not give you

Steam’s reviews carry context worth keeping as extra columns:

  • playtime_at_review: a complaint after twenty minutes is about onboarding or performance on first launch; the same complaint after two hundred hours is about the endgame.
  • written_during_early_access: separates reviews of a game that has since changed from reviews of the release.
  • received_for_free and steam_purchase: tell you who got a key rather than buying one.
  • primarily_steam_deck: isolates Steam Deck performance complaints from desktop ones.

Only players with recorded playtime on Steam can review, so every review comes from someone who ran the game. Map the text and the date; your other columns come back untouched, so you can filter the results by playtime or platform afterwards.

Labels that fit a game

The analyzer’s Mobile app preset already covers most of what players raise: bugs and crashes, performance, UI and usability, pricing, feature requests, login and account, ads, and support. What it cannot know is the vocabulary of your genre. Add up to 10 labels of your own, for example for an online shooter:

  • cheaters and anti-cheat
  • matchmaking
  • servers and connection
  • balance

Each review then gets topics, sentiment, a severity from 1 to 5 and a needs-a-reply flag. Run 10 reviews free to check the mapping, then the full file at one credit per review.

Reading reviews after a patch

Because every review has a creation time, a patch gives you a natural before and after. Split the file on the patch date, run the same labels on both halves, and compare each topic’s share of not-recommended reviews. If the topic you patched fell and nothing else rose, the patch did what you meant. The guide to when to analyse reviews covers how to keep that comparison fair.

A review edited after the patch keeps its original timestamp_created; only timestamp_updated moves. Use the creation date to place a review in time, and page with filter=updated if you want to see which reviews were rewritten.

Questions

Can I export Steam reviews to CSV?

Not with a button. Steamworks has no review download. Request the public appreviews endpoint page by page, up to 100 reviews at a time, and write the fields you need to a CSV yourself.

Do I need an API key to get Steam reviews?

No. The appreviews endpoint is public and takes the app ID in the URL. Valve’s API terms still apply, including not presenting the data as endorsed by or affiliated with Valve or Steam.

Why are there fewer reviews in my file than on the store page?

Usually the defaults: purchase_type is steam unless you set it to all, review bombs are filtered unless you pass filter_offtopic_activity=0, and filter=all does not page through everything. Set all three, plus language=all.