Steam API endpoint
Returns a page of user reviews for an app with cursor pagination and an aggregate query_summary (score, positive/negative totals). Aggregate totals populate only on the first page (cursor=*). Pass the returned cursor back to page.
/steam/reviewsQuery parameters:
appid (required) — numeric Steam app id (e.g. 570).filter (optional, default recent) — sort order. Allowed values: recent, updated, all.language (optional, default english) — a Steam language name (e.g. english) or all.review_type (optional, default all) — sentiment filter. Allowed values: all, positive, negative.purchase_type (optional, default all) — purchase-source filter. Allowed values: all, steam, non_steam_purchase.day_range (optional, int, default 365) — look-back window in days; applies only when filter=all (max 365).num_per_page (optional, int, default 20) — reviews per page (max 100).cursor (optional, default *) — pagination cursor returned by the previous page.Aggregate totals (total_positive, total_negative, total_reviews, review_score, review_score_desc) populate only on the first page (cursor=*); paged requests carry only num_reviews. Pass the returned cursor back to fetch the next page; stop when the cursor repeats or reviews is empty.
Returns appid, query_summary, count, cursor, reviews[] (each: recommendation_id, author (steamid, num_games_owned, num_reviews, playtime_forever, playtime_last_two_weeks, playtime_at_review, last_played), language, review, timestamp_created, timestamp_updated, voted_up, votes_up, votes_funny, weighted_vote_score, comment_count, steam_purchase, received_for_free, written_during_early_access), and source_url.
| Field | Filled in, of 5 checked | Values in the sample |
|---|---|---|
| recommendation_id | 5 | |
| author | 5 | |
| language | 5 | |
| review | 5 | |
| timestamp_created | 5 | 2026-10-13 |
| timestamp_updated | 5 | 2026-10-13 |
| voted_up | 5 | true in 4 of 5 |
| votes_up | 5 | 0 to 1, median 0 |
| votes_funny | 5 | 0 |
| weighted_vote_score | 5 | 0.5 to 0.5, median 0.5 |
| comment_count | 5 | 0 |
| steam_purchase | 5 | true in 5 of 5 |
| received_for_free | 5 | true in 0 of 5 |
| written_during_early_access | 5 | true in 0 of 5 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| appid | string | Yes | Numeric Steam app id | 570 | |
| filter | string | No | Sort order Allowed values: recent, updated, all. | ||
| language | string | No | Steam language name or 'all' | ||
| review_type | string | No | Review sentiment filter Allowed values: all, positive, negative. | ||
| purchase_type | string | No | Purchase source filter Allowed values: all, steam, non_steam_purchase. | ||
| day_range | integer | No | Look-back window in days (filter=all only, max 365) | ||
| num_per_page | integer | No | Reviews per page (max 100) | ||
| cursor | string | No | Pagination cursor from the previous page | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/steam/reviews?appid=570&filter=recent&language=en&review_type=all&purchase_type=all" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"appid": "570",
"query_summary": {
"num_reviews": 1,
"review_score": 8,
"review_score_desc": "Very Positive",
"total_positive": 1600000,
"total_negative": 300000,
"total_reviews": 1900000
},
"count": 1,
"cursor": "AoJ4x...",
"reviews": [
{
"recommendation_id": "12345",
"author": {
"steamid": "7656119...",
"num_games_owned": 120,
"playtime_forever": 54000
},
"review": "great game",
"voted_up": true,
"votes_up": 42,
"comment_count": 1,
"steam_purchase": true
}
],
"source_url": "https://store.steampowered.com/appreviews/570?..."
}
}Request schema
No body schema
Response schema
#/definitions/steam.reviewsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | steam.ReviewsResponse | No | ||||
| data.appid | string | No | Steam app id the reviews belong to. | |||
| data.count | integer | No | Number of reviews returned. | |||
| data.cursor | string | No | Cursor to pass back to fetch the next page of reviews. | |||
| data.query_summary | object | No | Review totals and score for the query. | |||
| data.query_summary.num_reviews | integer | No | Number of reviews returned in this response. | |||
| data.query_summary.review_score | integer | No | Numeric review score Steam gives the app. Set on the first page only. | |||
| data.query_summary.review_score_desc | string | No | Review rating label, such as `Very Positive`. Set on the first page only. | |||
| data.query_summary.total_negative | integer | No | Total number of negative reviews. Set on the first page only. | |||
| data.query_summary.total_positive | integer | No | Total number of positive reviews. Set on the first page only. | |||
| data.query_summary.total_reviews | integer | No | Total number of reviews. Set on the first page only. | |||
| data.reviews | array | No | Reviews on this page. | |||
| data.reviews[].author | object | No | Author of the review. | |||
| data.reviews[].author.last_played | integer | No | Time the author last played the game. | |||
| data.reviews[].author.num_games_owned | integer | No | Number of games the author owns on Steam. | |||
| data.reviews[].author.num_reviews | integer | No | Number of reviews the author has written on Steam. | |||
| data.reviews[].author.playtime_at_review | integer | No | Author's playtime in the game when the review was written, in minutes. | |||
| data.reviews[].author.playtime_forever | integer | No | Author's total playtime in the game, in minutes. | |||
| data.reviews[].author.playtime_last_two_weeks | integer | No | Author's playtime in the game over the last two weeks, in minutes. | |||
| data.reviews[].author.steamid | string | No | Steam id of the review author. | |||
| data.reviews[].comment_count | integer | No | Number of comments on the review. | |||
| data.reviews[].language | string | No | Language the review is written in, as a Steam language name such as `english`. | |||
| data.reviews[].received_for_free | boolean | No | Whether the author received the game for free. | |||
| data.reviews[].recommendation_id | string | No | Steam id of the review. | |||
| data.reviews[].review | string | No | Full text of the review. | |||
| data.reviews[].steam_purchase | boolean | No | Whether the author bought the game on Steam. | |||
| data.reviews[].timestamp_created | integer | No | Time the review was posted, in Unix seconds. | |||
| data.reviews[].timestamp_updated | integer | No | Time the review was last edited, in Unix seconds. | |||
| data.reviews[].voted_up | boolean | No | Whether the review recommends the game. | |||
| data.reviews[].votes_funny | integer | No | Number of votes marking the review as funny. | |||
| data.reviews[].votes_up | integer | No | Number of votes marking the review as helpful. | |||
| data.reviews[].weighted_vote_score | string | No | Helpfulness score Steam gives the review, returned as a string such as `0.5`. | |||
| data.reviews[].written_during_early_access | boolean | No | Whether the review was written while the game was in Early Access. | |||
| data.source_url | string | No | URL the data was read from. | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/steam/reviews?appid=570&filter=recent&language=en&review_type=all&purchase_type=all" \
-H "x-api-key: $CRAWLORA_API_KEY"