Retrieve user reviews for a given Steam application.

  • get_app_reviews retrieves up to 100 reviews.

  • get_all_app_reviews has the ability to return much more reviews depending on input parameters.

stf_app_reviews(
  appid,
  day_range = NULL,
  start_date = NULL,
  end_date = NULL,
  date_range_type = "all",
  filter = "recent",
  language = "all",
  review_type = "all",
  purchase_type = "steam",
  playtime = c(0, 0),
  filter_offtopic_activity = TRUE,
  paginate = FALSE,
  max_pages = 10,
  num_per_page = 20,
  cursor = NULL
)

wba_app_review(steamid, appid)

stf_review_histogram(appid, language = "english", review_score_preference = 2)

Arguments

appid

Application ID referencing a Steam application. There are generally two ways of retrieving an appID:

  • Inspect or parse the store URL of an application, e.g. https://store.steampowered.com/app/10/CounterStrike/

  • Query appIDs programmatically, e.g. using search_apps

day_range

Number of days from now to n days ago to look for reviews, e.g. day_range = 5 looks for reviews in the last 5 days.

start_date

Date-time object describing the earliest time to look for reviews. Ignored if date_range_type = "all".

end_date

Date-time object describing the latest time to look for reviews. Ignored if date_range_type = "all".

date_range_type

Specifies what to do with reviews within the date range set by start_date and end_date. Options include include, exclude, and all. If all, ignores end_date and start_date.

filter

Specifies the sort order. Can be one of summary, recent, updated, and all. summary returns a summary of 10 most helpful comments. all sorts by helpfulness and applies moving windows in order to always return reviews (see the Steam blog article). recent sorts by creation time and updated sorts by update time. For get_all_app_reviews, filter must be either updated or recent.

language

Which review language to include in the output. A full list of platform supported languages can be found in the Steamworks documentation. Defaults to "all", which removes the language filter.

review_type

Filters by the type of review. Can be either positive, negative, or all.

purchase_type

Filters by the type of purchase. Can be either steam, non_steam_purchase, or all.

playtime

Length-2 numeric vector specifying the minimum and maximum playtime in hours that the reviewer should have played the game. If 0, no required (minimum or maximum) play time is set.

filter_offtopic_activity

Whether to filter offtopic activity. This especially includes so-called "review bombs", i.e. many reviews written by users in a very short time to artificially alter the review score of a game. See the Steam blog entry for more information.

paginate

If TRUE, paginates through the results. Some methods provide data access in digestible chunks and do not return all available information at once. The paginate automatically retrieves all pages until max_pages is reached.

max_pages

Maximum number of pages to paginate. Ignored if paginate is FALSE. Defaults to Inf such that all available data are paginated.

num_per_page

By default, Steam only shows 20 reviews per query. By setting num_per_page, this number can go up to a maximum of 100. For larger queries, consider iterating using get_all_app_reviews.

cursor

For each review page query, get_app_reviews returns a cursor ID. This ID can be used to paginate and iterate through many review pages at once. This argument is probably useless for most use cases and is extensively used for iteration purposes by get_all_app_reviews.

steamid

SteamID of a user. The SteamID must be in a format that can be converted by convert_steamid. This includes vanity, Steam64, Steam2, and Steam3 IDs.

review_score_preference

Unknown. In my tests, changing this argument did not yield a measurable difference in the results.

Value

stf_app_reviews and wba_app_review return a dataframe containing IDs, texts, and metadata of application reviews on Steam. See the community docs for more info on the output of stf_app_reviews.

stf_review_histogram returns a named list containing rollups aggregated by month (rollups), and rollups of the last 30 days aggregated by day (recent). Each list element is a dataframe containing the corresponding date and the aggregated thumps up/down.

Authentication

The functions of this reference page do not need any kind of authentication to be used (Key = API key needed, Login = user login needed).

FunctionKeyLoginNote
stf_app_reviewsnono
wba_app_reviewnoyesCan only retrieve reviews of the authenticated user
stf_review_histogramnono

Examples

# reviews of counter-strike
stf_app_reviews(10)
#> # A tibble: 20 × 21
#>    recommendationid language  review     timestamp_created   timestamp_updated  
#>    <chr>            <chr>     <chr>      <dttm>              <dttm>             
#>  1 182527201        english   "I still … 2024-12-11 22:35:26 2024-12-11 22:35:26
#>  2 182524914        turkish   "güzel pi… 2024-12-11 21:54:43 2024-12-11 21:54:43
#>  3 182523668        latam     "Nada mej… 2024-12-11 21:33:10 2024-12-11 21:33:10
#>  4 182523418        english   "h"        2024-12-11 21:28:38 2024-12-11 21:28:38
#>  5 182523143        latam     "Un clasi… 2024-12-11 21:23:15 2024-12-11 21:23:15
#>  6 182521345        brazilian "bom"      2024-12-11 20:52:51 2024-12-11 20:52:51
#>  7 182521229        ukrainian " CS-2 NO… 2024-12-11 20:50:37 2024-12-11 20:50:37
#>  8 182518440        spanish   "asd"      2024-12-11 20:04:46 2024-12-11 20:04:46
#>  9 182517524        english   "I think … 2024-12-11 19:49:45 2024-12-11 19:49:45
#> 10 182513147        turkish   "seks"     2024-12-11 18:42:46 2024-12-11 18:42:46
#> 11 182511992        latam     "Hola, qu… 2024-12-11 18:24:26 2024-12-11 18:24:26
#> 12 182508919        russian   "Классная… 2024-12-11 17:36:12 2024-12-11 17:36:12
#> 13 182507966        russian   "[h2]Разд… 2024-12-11 17:20:45 2024-12-11 17:21:49
#> 14 182506619        russian   "Классика… 2024-12-11 16:59:22 2024-12-11 16:59:22
#> 15 182504120        russian   "имба игр… 2024-12-11 16:21:30 2024-12-11 16:21:30
#> 16 182499449        turkish   "Enemy Sp… 2024-12-11 15:09:41 2024-12-11 15:09:41
#> 17 182499138        brazilian "b1 e b2"  2024-12-11 15:04:27 2024-12-11 15:04:27
#> 18 182497664        brazilian "Counter … 2024-12-11 14:40:54 2024-12-11 14:40:54
#> 19 182491972        schinese  "好玩"     2024-12-11 13:01:45 2024-12-11 13:01:45
#> 20 182489087        russian   "лучше че… 2024-12-11 12:10:46 2024-12-11 12:10:46
#> # ℹ 16 more variables: voted_up <lgl>, votes_up <int>, votes_funny <int>,
#> #   weighted_vote_score <dbl>, comment_count <int>, steam_purchase <lgl>,
#> #   received_for_free <lgl>, written_during_early_access <lgl>,
#> #   primarily_steam_deck <lgl>, author.steamid <chr>,
#> #   author.num_games_owned <int>, author.num_reviews <int>,
#> #   author.playtime_forever <int>, author.playtime_last_two_weeks <int>,
#> #   author.playtime_at_review <int>, author.last_played <dttm>

# get all negative german reviews
stf_app_reviews(
  10,
  language = "german",
  review_type = "negative",
  paginate = TRUE,
  max_pages = Inf
)
#> # A tibble: 44 × 21
#>    recommendationid language review      timestamp_created   timestamp_updated  
#>    <chr>            <chr>    <chr>       <dttm>              <dttm>             
#>  1 170113218        german   "crasht we… 2024-07-17 21:18:21 2024-07-17 21:18:21
#>  2 131167004        german   "I can't s… 2023-01-19 20:40:47 2023-03-06 20:00:48
#>  3 111335072        german   "كنت أرغب … 2022-03-01 22:21:07 2022-03-01 22:21:07
#>  4 97061181         german   "das spiel… 2021-08-06 18:25:54 2021-08-06 18:25:54
#>  5 96281113         german   "Nicht mei… 2021-07-24 08:27:59 2021-07-24 08:27:59
#>  6 81452533         german   "имба"      2020-12-02 09:27:08 2023-09-22 20:05:24
#>  7 79601831         german   "keine lus… 2020-11-21 12:08:06 2020-11-21 12:08:06
#>  8 78492970         german   "To much c… 2020-10-31 23:37:44 2020-10-31 23:37:44
#>  9 67832956         german   "Trash Gam… 2020-04-22 18:57:46 2020-04-22 18:57:46
#> 10 64920573         german   "gaaaaaaaa… 2020-03-12 16:18:01 2020-03-12 16:18:01
#> # ℹ 34 more rows
#> # ℹ 16 more variables: voted_up <lgl>, votes_up <int>, votes_funny <int>,
#> #   weighted_vote_score <dbl>, comment_count <int>, steam_purchase <lgl>,
#> #   received_for_free <lgl>, written_during_early_access <lgl>,
#> #   primarily_steam_deck <lgl>, author.steamid <chr>,
#> #   author.num_games_owned <int>, author.num_reviews <int>,
#> #   author.playtime_forever <int>, author.playtime_last_two_weeks <int>, …

# get all recent reviews up to page 10
stf_app_reviews(10, filter = "recent", max_pages = 10)
#> # A tibble: 20 × 21
#>    recommendationid language  review     timestamp_created   timestamp_updated  
#>    <chr>            <chr>     <chr>      <dttm>              <dttm>             
#>  1 182527201        english   "I still … 2024-12-11 22:35:26 2024-12-11 22:35:26
#>  2 182524914        turkish   "güzel pi… 2024-12-11 21:54:43 2024-12-11 21:54:43
#>  3 182523668        latam     "Nada mej… 2024-12-11 21:33:10 2024-12-11 21:33:10
#>  4 182523418        english   "h"        2024-12-11 21:28:38 2024-12-11 21:28:38
#>  5 182523143        latam     "Un clasi… 2024-12-11 21:23:15 2024-12-11 21:23:15
#>  6 182521345        brazilian "bom"      2024-12-11 20:52:51 2024-12-11 20:52:51
#>  7 182521229        ukrainian " CS-2 NO… 2024-12-11 20:50:37 2024-12-11 20:50:37
#>  8 182518440        spanish   "asd"      2024-12-11 20:04:46 2024-12-11 20:04:46
#>  9 182517524        english   "I think … 2024-12-11 19:49:45 2024-12-11 19:49:45
#> 10 182513147        turkish   "seks"     2024-12-11 18:42:46 2024-12-11 18:42:46
#> 11 182511992        latam     "Hola, qu… 2024-12-11 18:24:26 2024-12-11 18:24:26
#> 12 182508919        russian   "Классная… 2024-12-11 17:36:12 2024-12-11 17:36:12
#> 13 182507966        russian   "[h2]Разд… 2024-12-11 17:20:45 2024-12-11 17:21:49
#> 14 182506619        russian   "Классика… 2024-12-11 16:59:22 2024-12-11 16:59:22
#> 15 182504120        russian   "имба игр… 2024-12-11 16:21:30 2024-12-11 16:21:30
#> 16 182499449        turkish   "Enemy Sp… 2024-12-11 15:09:41 2024-12-11 15:09:41
#> 17 182499138        brazilian "b1 e b2"  2024-12-11 15:04:27 2024-12-11 15:04:27
#> 18 182497664        brazilian "Counter … 2024-12-11 14:40:54 2024-12-11 14:40:54
#> 19 182491972        schinese  "好玩"     2024-12-11 13:01:45 2024-12-11 13:01:45
#> 20 182489087        russian   "лучше че… 2024-12-11 12:10:46 2024-12-11 12:10:46
#> # ℹ 16 more variables: voted_up <lgl>, votes_up <int>, votes_funny <int>,
#> #   weighted_vote_score <dbl>, comment_count <int>, steam_purchase <lgl>,
#> #   received_for_free <lgl>, written_during_early_access <lgl>,
#> #   primarily_steam_deck <lgl>, author.steamid <chr>,
#> #   author.num_games_owned <int>, author.num_reviews <int>,
#> #   author.playtime_forever <int>, author.playtime_last_two_weeks <int>,
#> #   author.playtime_at_review <int>, author.last_played <dttm>

(hist <- stf_review_histogram(10)$rollups)
#> # A tibble: 170 × 3
#>    date                recommendations_up recommendations_down
#>    <dttm>                           <int>                <int>
#>  1 2010-11-01 00:00:00                 25                    0
#>  2 2010-12-01 00:00:00                 33                    1
#>  3 2011-01-01 00:00:00                 26                    0
#>  4 2011-02-01 00:00:00                 21                    0
#>  5 2011-03-01 00:00:00                 26                    1
#>  6 2011-04-01 00:00:00                 15                    0
#>  7 2011-05-01 00:00:00                  8                    0
#>  8 2011-06-01 00:00:00                 22                    0
#>  9 2011-07-01 00:00:00                 66                    0
#> 10 2011-08-01 00:00:00                 32                    1
#> # ℹ 160 more rows

if (requireNamespace("ggplot2", quietly = TRUE)) {
  library(ggplot2)

  ggplot(hist) +
    geom_bar(
      aes(x = date, y = recommendations_up),
      stat = "identity",
      fill = "#66c0f4",
      color = NA,
      width = resolution(as.double(hist$date) * 0.5)
    ) +
    geom_bar(
      aes(x = date, y = recommendations_down * - 1),
      stat = "identity",
      fill = "#a34c25",
      color = NA,
      width = resolution(as.double(hist$date) * 0.5)
    ) +
    geom_hline(yintercept = 0, color = "#66c0f4") +
    labs(title = "Overall reviews: Counter-Strike", x = NULL, y = NULL) +
    theme_minimal() +
    theme(
      plot.background = element_rect(fill = "#2a475e"),
      text = element_text(color = "white"),
      panel.grid = element_blank(),
      axis.line = element_blank(),
      axis.text.y = element_text(color = "white"),
      axis.text.x = element_text(color = "#66c0f4")
    )
}