Steam data API
Read Steam's own data for every game: store pages, prices in every region, reviews, followers, players, tags, client records, news, achievements and store page changes. Free, no sign-up to start, JSON or XML.
Quick start
Every address starts with https://launchrivals.com/api/user. Ask for any game by its Steam app id; no key needed:
curl 'https://launchrivals.com/api/user/steam/1145360' \
-H 'Authorization: Bearer lrs_…' # optionalconst res = await fetch('https://launchrivals.com/api/user/steam/1145360', {
headers: { Authorization: 'Bearer ' + KEY }, // optional
});
const data = await res.json();import requests
data = requests.get(
'https://launchrivals.com/api/user/steam/1145360',
headers={'Authorization': f'Bearer {KEY}'}, # optional
).json()$ctx = stream_context_create(['http' => [
'header' => 'Authorization: Bearer ' . $key, // optional
]]);
$data = json_decode(file_get_contents('https://launchrivals.com/api/user/steam/1145360', false, $ctx), true);The answer is the full record of the game. Add /xml to the end of any address for XML.
Keys
A key is free and makes everything five times faster. Any LaunchRivals account can create up to 3 in Settings → Steam data once a Steam account is linked. Send it in any one of three ways:
| How | Example | Good for |
|---|---|---|
| Bearer header | Authorization: Bearer lrs_… | Servers, bots, scripts |
| Key header | X-Api-Key: lrs_… | Tools that set custom headers |
| Query string | ?key=lrs_… | Spreadsheets, quick tests (it shows up in logs, so keep it out of public pages) |
- A key that is sent but does not work answers
401; it never quietly falls back to the slower limit. - A key stops working when it is revoked, when the Steam account is unlinked, or when the account is closed.
- With a key, a game's record also includes the studio's support email.
Rate limits
| Requests per second | Counted per | |
|---|---|---|
| No key | 1 | IP address |
| Free key | 5 | Key |
Every answer carries X-RateLimit-Limit and X-RateLimit-Remaining. Past the limit you get 429 with Retry-After (seconds); wait that long and try again. Answers may be cached for 60 seconds, so there is no need to ask for the same game twice in a minute.
Formats
- JSON (default):
…/steam/1145360or…/steam/1145360/json. - XML:
…/steam/1145360/xmlor?format=xml. Object keys become elements, list items repeat the singular of their parent (<tags><tag>, otherwise<item>), booleans aretrue/false, empty values carrynil="true". - UTF-8 throughout. Cross-origin requests are allowed from any site, so the API works straight from the browser.
Errors
Errors come in the format you asked for, with the HTTP status repeated in the body:
{
"error": "We have no game with that id.",
"status": 404
}| Status | Meaning |
|---|---|
| 200 | Here you go. |
| 401 | The key is unknown or revoked, or its Steam account is no longer linked. |
| 404 | No game or studio with that id, or no such address. |
| 429 | Too many requests this second; see Retry-After. |
Conventions
- Money is in the smallest unit of the currency:
2499in USD is $24.99; currencies without cents (JPY, KRW …) are whole units. - Times are ISO 8601 in UTC (
2026-10-23T19:08:53Z), dates areYYYY-MM-DD. - Release dates come with a
precision:day,month,quarter,yearor none; the date of a month or quarter is its last day, as on Steam. - null means we do not know yet; an empty list means there is nothing.
- Everything is read from Steam's public pages and services;
updatedin a game's record says when each part was last read. Popular, upcoming and new games are refreshed daily, the rest of the catalogue regularly.
OpenAPI
The whole API as an OpenAPI 3.1 document, for Postman, Insomnia, Swagger UI or a client generator:
https://launchrivals.com/api/user/openapi.json
A game
GET /api/user/steam/{app_id} · /xml for XML
Everything we hold for one game: store page details, developer and publisher with their studio pages, release date, US price and the price in every region, purchase options, reviews, followers, players right now, tags with player votes, features, platforms, Steam Deck status, languages, links, screenshots, DLC, and the client record (depots, branches, latest builds).
| Parameter | In | Type | Description |
|---|---|---|---|
| app_id required | path | integer | The Steam app id, as in store.steampowered.com/app/1145360. |
support.emailis included only when you send a key.updatedtells you when each part was last read from Steam.- Prices are in the smallest unit of the currency (
2499= $24.99).
Request
curl 'https://launchrivals.com/api/user/steam/1145360' \
-H 'Authorization: Bearer lrs_…' # optionalconst res = await fetch('https://launchrivals.com/api/user/steam/1145360', {
headers: { Authorization: 'Bearer ' + KEY }, // optional
});
const data = await res.json();import requests
data = requests.get(
'https://launchrivals.com/api/user/steam/1145360',
headers={'Authorization': f'Bearer {KEY}'}, # optional
).json()$ctx = stream_context_create(['http' => [
'header' => 'Authorization: Bearer ' . $key, // optional
]]);
$data = json_decode(file_get_contents('https://launchrivals.com/api/user/steam/1145360', false, $ctx), true);Example answer
{
"app_id": 1145360,
"name": "Hades",
"type": "game",
"store_url": "https://store.steampowered.com/app/1145360/hades/",
"visible": true,
"is_free": false,
"early_access": false,
"adult": false,
"description": "Defy the god of the dead as you hack and slash out of the Underworld in this rogue-like dungeon crawler from the creators of Bastion, Transistor, and Pyre.",
"developer": "Supergiant Games",
"publisher": "Supergiant Games",
"studios": [
{
"clan_id": 3584665,
"name": "Supergiant Games",
"role": "developer",
"followers": 164810,
"avatar": "https://avatars.fastly.steamstatic.com/a2ac03c229b9dd346495c1efdd7e7c37f910a22f_full.jpg",
"url": "https://store.steampowered.com/curator/3584665/"
}
],
"release": {
"date": "2020-09-17",
"precision": "day",
"text": "Sep 17, 2020",
"coming_soon": false,
"early_access_date": null
},
"price": {
"currency": "USD",
"final_cents": 2499,
"discount_pct": 0,
"initial_cents": 2499
},
"regional_prices": [
{
"cc": "AE",
"currency": "AED",
"final_cents": 6600,
"initial_cents": 6600,
"discount_pct": 0,
"formatted": "66.00 AED",
"checked": "2026-10-23T11:47:13Z"
},
{
"cc": "AR",
"currency": "USD",
"final_cents": 499,
"initial_cents": 499,
"discount_pct": 0,
"formatted": "$4.99",
"checked": "2026-10-23T11:46:49Z"
}
],
"purchase_options": [
{
"type": "package",
"id": 415372,
"name": "Hades",
"final_cents": 2499,
"games": 1
},
{
"type": "bundle",
"id": 61368,
"name": "Hades + Hades II",
"final_cents": 4497,
"games": 1
}
],
"reviews": {
"total": 310472,
"positive": 304222,
"negative": 6250,
"percent_positive": 98,
"label": "Overwhelmingly Positive"
},
"followers": 308820,
"players_now": 3900,
"counts_on_profile": true,
"tags": [
{
"id": 42804,
"name": "Action Roguelike",
"rank": 1,
"votes": 1463
},
{
"id": 3959,
"name": "Roguelite",
"rank": 2,
"votes": 1066
}
],
"features": [
"Single-player",
"Steam Achievements"
],
"platforms": {
"windows": true,
"mac": true,
"linux": false,
"vr": false,
"deck": "Verified"
},
"languages": [
{
"name": "English",
"audio": true,
"subtitles": true
},
{
"name": "French",
"audio": false,
"subtitles": true
}
],
"links": [
{
"type": "Website",
"url": "http://www.supergiantgames.com"
},
{
"type": "Facebook",
"url": "https://www.facebook.com/supergiantgames/"
}
],
"support": {
"url": "https://www.supergiantgames.com/contact/"
},
"media": {
"header": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1145360/header.jpg?t=1758127023",
"capsule": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1145360/capsule_616x353.jpg?t=1758127023",
"screenshots": [
"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1145360/ss_c0fed447426b69981cf1721756acf75369801b31.jpg?t=1758127023",
"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1145360/ss_8a9f0953e8a014bd3df2789c2835cb787cd3764d.jpg?t=1758127023"
],
"screenshot_count": 11,
"trailer_count": 3
},
"parent_app_id": null,
"demo_app_ids": [],
"dlc_app_ids": [],
"client": {
"change_number": 39319305,
"record": {
"name": "Hades",
"type": "Game",
"oslist": [
"windows",
"macos"
],
"controller_support": "full",
"deck": 3,
"metacritic": {
"score": 93,
"url": "https://www.metacritic.com/game/pc/hades?ftag=MCD-06-10aaa1f"
},
"release_state": "released"
},
"depots": [
{
"id": 228988,
"name": null,
"os": "windows",
"arch": null,
"language": null,
"size": null,
"download_size": null,
"manifest": null,
"dlc_app_id": null
},
{
"id": 229006,
"name": null,
"os": "windows",
"arch": null,
"language": null,
"size": null,
"download_size": null,
"manifest": null,
"dlc_app_id": null
}
],
"branches": [
{
"name": "public",
"build_id": 10929685,
"updated": "2023-04-12T14:20:17Z",
"description": null,
"password": false
}
],
"builds": [
{
"branch": "public",
"build_id": 10929685,
"updated": "2023-04-12T14:20:17Z",
"seen": "2026-10-23T11:49:39Z"
}
]
},
"achievement_count": 49,
"updated": {
"store": "2026-10-23T11:46:10Z",
"reviews": "2026-10-23T19:59:11Z",
"followers": "2026-10-23T19:59:11Z",
"players": "2026-10-22T13:00:18Z",
"prices": "2026-10-23T11:47:15Z",
"client": "2026-10-23T11:49:39Z",
"news": "2026-10-23T11:46:40Z"
},
"more": {
"prices": "https://launchrivals.com/api/user/steam/1145360/prices",
"history": "https://launchrivals.com/api/user/steam/1145360/history",
"news": "https://launchrivals.com/api/user/steam/1145360/news",
"changes": "https://launchrivals.com/api/user/steam/1145360/changes",
"achievements": "https://launchrivals.com/api/user/steam/1145360/achievements"
}
}Prices in every region
GET /api/user/steam/{app_id}/prices · /xml for XML
The current price in every Steam region we read (country code, currency, final and list price, discount, Steam's own formatting), plus every price change we have recorded.
| Parameter | In | Type | Description |
|---|---|---|---|
| app_id required | path | integer | The Steam app id, as in store.steampowered.com/app/1145360. |
history[].fromis when that price was first seen.
Request
curl 'https://launchrivals.com/api/user/steam/1145360/prices' \
-H 'Authorization: Bearer lrs_…' # optionalconst res = await fetch('https://launchrivals.com/api/user/steam/1145360/prices', {
headers: { Authorization: 'Bearer ' + KEY }, // optional
});
const data = await res.json();import requests
data = requests.get(
'https://launchrivals.com/api/user/steam/1145360/prices',
headers={'Authorization': f'Bearer {KEY}'}, # optional
).json()$ctx = stream_context_create(['http' => [
'header' => 'Authorization: Bearer ' . $key, // optional
]]);
$data = json_decode(file_get_contents('https://launchrivals.com/api/user/steam/1145360/prices', false, $ctx), true);Example answer (trimmed)
{
"app_id": 1145360,
"regions": [
{
"cc": "AE",
"currency": "AED",
"final_cents": 6600,
"initial_cents": 6600,
"discount_pct": 0,
"formatted": "66.00 AED",
"checked": "2026-10-23T11:47:13Z"
},
{
"cc": "AR",
"currency": "USD",
"final_cents": 499,
"initial_cents": 499,
"discount_pct": 0,
"formatted": "$4.99",
"checked": "2026-10-23T11:46:49Z"
}
],
"history": [
{
"cc": "AE",
"from": "2026-10-23T11:47:13Z",
"final_cents": 6600,
"initial_cents": 6600,
"discount_pct": 0,
"formatted": "66.00 AED"
},
{
"cc": "AR",
"from": "2026-10-23T11:46:49Z",
"final_cents": 499,
"initial_cents": 499,
"discount_pct": 0,
"formatted": "$4.99"
}
]
}History
GET /api/user/steam/{app_id}/history · /xml for XML
Followers, reviews and the US price day by day, and concurrent players every hour.
| Parameter | In | Type | Description |
|---|---|---|---|
| app_id required | path | integer | The Steam app id, as in store.steampowered.com/app/1145360. |
| days | query | integer | How far back, 1–730 days. Players reach back at most 30 days. |
Request
curl 'https://launchrivals.com/api/user/steam/1145360/history?days=30' \
-H 'Authorization: Bearer lrs_…' # optionalconst res = await fetch('https://launchrivals.com/api/user/steam/1145360/history?days=30', {
headers: { Authorization: 'Bearer ' + KEY }, // optional
});
const data = await res.json();import requests
data = requests.get(
'https://launchrivals.com/api/user/steam/1145360/history?days=30',
headers={'Authorization': f'Bearer {KEY}'}, # optional
).json()$ctx = stream_context_create(['http' => [
'header' => 'Authorization: Bearer ' . $key, // optional
]]);
$data = json_decode(file_get_contents('https://launchrivals.com/api/user/steam/1145360/history?days=30', false, $ctx), true);Example answer (trimmed)
{
"app_id": 1145360,
"days": 30,
"daily": [
{
"date": "2026-10-21",
"followers": null,
"reviews_total": null,
"reviews_positive": null,
"price_cents": null,
"discount_pct": null
},
{
"date": "2026-10-22",
"followers": 308821,
"reviews_total": 287359,
"reviews_positive": 278738,
"price_cents": 2499,
"discount_pct": 0
}
],
"players": [
{
"at": "2026-10-23T12:00:00Z",
"players": 4810
},
{
"at": "2026-10-23T13:00:00Z",
"players": 5122
}
]
}News and patch notes
GET /api/user/steam/{app_id}/news · /xml for XML
News posts and patch notes, newest first, with their full text.
| Parameter | In | Type | Description |
|---|---|---|---|
| app_id required | path | integer | The Steam app id, as in store.steampowered.com/app/1145360. |
| limit | query | integer | 1–100. |
| patches | query | integer | 1 for patch notes only. |
Request
curl 'https://launchrivals.com/api/user/steam/1145360/news?limit=3' \
-H 'Authorization: Bearer lrs_…' # optionalconst res = await fetch('https://launchrivals.com/api/user/steam/1145360/news?limit=3', {
headers: { Authorization: 'Bearer ' + KEY }, // optional
});
const data = await res.json();import requests
data = requests.get(
'https://launchrivals.com/api/user/steam/1145360/news?limit=3',
headers={'Authorization': f'Bearer {KEY}'}, # optional
).json()$ctx = stream_context_create(['http' => [
'header' => 'Authorization: Bearer ' . $key, // optional
]]);
$data = json_decode(file_get_contents('https://launchrivals.com/api/user/steam/1145360/news?limit=3', false, $ctx), true);Example answer (trimmed)
{
"app_id": 1145360,
"news": [
{
"id": "1835236783574995",
"title": "Watch the Hades Orchestral Concert, Live from London!",
"url": "https://steamstore-a.akamaihd.net/news/externalpost/steam_community_announcements/1835236783574995",
"author": "kid_zomb",
"feed": "Community Announcements",
"patch_notes": false,
"tags": [],
"published": "2026-06-16T16:55:06Z",
"contents": "On June 27 at London's Royal Festival Hall, our composer and audio director Darren Korb will be joined by his fellow Hades vocalists and conductor Austin Win…"
},
{
"id": "1811772772248756",
"title": "Hades II v1.0 Is Now Available!",
"url": "https://steamstore-a.akamaihd.net/news/externalpost/steam_community_announcements/1811772772248756",
"author": "kid_zomb",
"feed": "Community Announcements",
"patch_notes": true,
"tags": [],
"published": "2025-09-25T16:11:33Z",
"contents": "We couldn't possibly be more excited to announce that we've completed the Early Access development of Hades II, and officially launched v1.0 of the game!! Wh…"
}
]
}Store page changes
GET /api/user/steam/{app_id}/changes · /xml for XML
Every change we spotted on the store page: price, release date, name, tags, description, images and more, with the old and the new value.
| Parameter | In | Type | Description |
|---|---|---|---|
| app_id required | path | integer | The Steam app id, as in store.steampowered.com/app/1145360. |
| limit | query | integer | 1–200. |
Request
curl 'https://launchrivals.com/api/user/steam/1145360/changes?limit=50' \
-H 'Authorization: Bearer lrs_…' # optionalconst res = await fetch('https://launchrivals.com/api/user/steam/1145360/changes?limit=50', {
headers: { Authorization: 'Bearer ' + KEY }, // optional
});
const data = await res.json();import requests
data = requests.get(
'https://launchrivals.com/api/user/steam/1145360/changes?limit=50',
headers={'Authorization': f'Bearer {KEY}'}, # optional
).json()$ctx = stream_context_create(['http' => [
'header' => 'Authorization: Bearer ' . $key, // optional
]]);
$data = json_decode(file_get_contents('https://launchrivals.com/api/user/steam/1145360/changes?limit=50', false, $ctx), true);Example answer (trimmed)
{
"app_id": 1145360,
"changes": [
{
"field": "price",
"old": "2499",
"new": "1249",
"detected": "2026-10-21T17:04:11Z"
},
{
"field": "tags",
"old": "Action Roguelike, Roguelite, Hack and Slash",
"new": "Action Roguelike, Roguelite, Indie",
"detected": "2026-10-18T09:12:40Z"
}
]
}Achievements
GET /api/user/steam/{app_id}/achievements · /xml for XML
Every achievement with its title, description, icons and the share of players who unlocked it, most unlocked first.
| Parameter | In | Type | Description |
|---|---|---|---|
| app_id required | path | integer | The Steam app id, as in store.steampowered.com/app/1145360. |
Request
curl 'https://launchrivals.com/api/user/steam/1145360/achievements' \
-H 'Authorization: Bearer lrs_…' # optionalconst res = await fetch('https://launchrivals.com/api/user/steam/1145360/achievements', {
headers: { Authorization: 'Bearer ' + KEY }, // optional
});
const data = await res.json();import requests
data = requests.get(
'https://launchrivals.com/api/user/steam/1145360/achievements',
headers={'Authorization': f'Bearer {KEY}'}, # optional
).json()$ctx = stream_context_create(['http' => [
'header' => 'Authorization: Bearer ' . $key, // optional
]]);
$data = json_decode(file_get_contents('https://launchrivals.com/api/user/steam/1145360/achievements', false, $ctx), true);Example answer (trimmed)
{
"app_id": 1145360,
"achievements": [
{
"name": "AchClearTartarus",
"title": "Escaped Tartarus",
"description": "Clear Tartarus",
"hidden": false,
"percent": 81.8,
"icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1145360/062a2b7bdc156af9438bdc440a19833addd2ae38.jpg",
"icon_gray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1145360/4c936bef605fe82e00145c7b37287a13cd690af3.jpg"
},
{
"name": "AchClearAsphodel",
"title": "Escaped Asphodel",
"description": "Clear Asphodel",
"hidden": false,
"percent": 72.2,
"icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1145360/202d5cd97dd3b727e0eaa8ffc02a62dcf67cd5d7.jpg",
"icon_gray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1145360/dd8b6056196f8b7e209ef9323c81bbf48aba094b.jpg"
}
]
}Search
GET /api/user/steam/search · /xml for XML
Find games by name (names that start with your words first, then the most followed) or by app id.
| Parameter | In | Type | Description |
|---|---|---|---|
| q required | query | string | A name, part of a name, or an app id. |
| limit | query | integer | 1–50. |
Request
curl 'https://launchrivals.com/api/user/steam/search?q=hades' \
-H 'Authorization: Bearer lrs_…' # optionalconst res = await fetch('https://launchrivals.com/api/user/steam/search?q=hades', {
headers: { Authorization: 'Bearer ' + KEY }, // optional
});
const data = await res.json();import requests
data = requests.get(
'https://launchrivals.com/api/user/steam/search?q=hades',
headers={'Authorization': f'Bearer {KEY}'}, # optional
).json()$ctx = stream_context_create(['http' => [
'header' => 'Authorization: Bearer ' . $key, // optional
]]);
$data = json_decode(file_get_contents('https://launchrivals.com/api/user/steam/search?q=hades', false, $ctx), true);Example answer (trimmed)
{
"query": "hades",
"results": [
{
"app_id": 1145360,
"name": "Hades",
"type": "game",
"release": {
"date": "2020-09-17",
"precision": "day",
"text": "Sep 17, 2020",
"coming_soon": false
},
"price_cents": 2499,
"is_free": false,
"followers": 308820,
"reviews_total": 310472,
"header": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1145360/header.jpg?t=1758127023",
"url": "https://launchrivals.com/api/user/steam/1145360"
},
{
"app_id": 1145350,
"name": "Hades II",
"type": "game",
"release": {
"date": null,
"precision": "unknown",
"text": null,
"coming_soon": false
},
"price_cents": null,
"is_free": false,
"followers": null,
"reviews_total": null,
"header": null,
"url": "https://launchrivals.com/api/user/steam/1145350"
}
]
}Release calendar
GET /api/user/steam/releases · /xml for XML
Games with a release day in a window of up to three months, most followed first, optionally with one tag.
| Parameter | In | Type | Description |
|---|---|---|---|
| from | query | string | First day, YYYY-MM-DD. Default: today. |
| to | query | string | Last day, YYYY-MM-DD. Default: 30 days on. |
| tag | query | integer | A tag id from Tags. |
| limit | query | integer | 1–500. |
- Only games with an exact day; month, quarter and "coming soon" dates are left out.
Request
curl 'https://launchrivals.com/api/user/steam/releases?from=2026-10-26&to=2026-11-25&tag=492' \
-H 'Authorization: Bearer lrs_…' # optionalconst res = await fetch('https://launchrivals.com/api/user/steam/releases?from=2026-10-26&to=2026-11-25&tag=492', {
headers: { Authorization: 'Bearer ' + KEY }, // optional
});
const data = await res.json();import requests
data = requests.get(
'https://launchrivals.com/api/user/steam/releases?from=2026-10-26&to=2026-11-25&tag=492',
headers={'Authorization': f'Bearer {KEY}'}, # optional
).json()$ctx = stream_context_create(['http' => [
'header' => 'Authorization: Bearer ' . $key, // optional
]]);
$data = json_decode(file_get_contents('https://launchrivals.com/api/user/steam/releases?from=2026-10-26&to=2026-11-25&tag=492', false, $ctx), true);Example answer (trimmed)
{
"from": "2026-10-23",
"to": "2026-11-22",
"tag_id": null,
"games": [
{
"app_id": 4540280,
"name": "Sinful Survivors",
"type": "game",
"release": {
"date": "2026-11-04",
"precision": "day",
"text": "Nov 4, 2026",
"coming_soon": true
},
"price_cents": null,
"is_free": false,
"followers": 1342,
"reviews_total": 0,
"header": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/4540280/f7ce08a736273d52680900a9299502c45f4eaea6/header.jpg?t=1792527175",
"url": "https://launchrivals.com/api/user/steam/4540280"
},
{
"app_id": 4542120,
"name": "Neurospasm",
"type": "game",
"release": {
"date": "2026-10-29",
"precision": "day",
"text": "Oct 29, 2026",
"coming_soon": true
},
"price_cents": null,
"is_free": false,
"followers": 92,
"reviews_total": 0,
"header": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/4542120/ee3a608693644473cf4d7e61274d0ec528976b79/header.jpg?t=1792668433",
"url": "https://launchrivals.com/api/user/steam/4542120"
}
]
}Tags
GET /api/user/steam/tags · /xml for XML
Every Steam tag with its id, A to Z.
Request
curl 'https://launchrivals.com/api/user/steam/tags' \
-H 'Authorization: Bearer lrs_…' # optionalconst res = await fetch('https://launchrivals.com/api/user/steam/tags', {
headers: { Authorization: 'Bearer ' + KEY }, // optional
});
const data = await res.json();import requests
data = requests.get(
'https://launchrivals.com/api/user/steam/tags',
headers={'Authorization': f'Bearer {KEY}'}, # optional
).json()$ctx = stream_context_create(['http' => [
'header' => 'Authorization: Bearer ' . $key, // optional
]]);
$data = json_decode(file_get_contents('https://launchrivals.com/api/user/steam/tags', false, $ctx), true);Example answer (trimmed)
{
"tags": [
{
"id": 7743,
"name": "1980s"
},
{
"id": 6691,
"name": "1990's"
}
]
}Steam events
GET /api/user/steam/events · /xml for XML
Steam's seasonal sales, Next Fests and themed festivals from a year back on, with sign-up deadlines and the tags a themed festival is about.
confirmed: falsemarks dates Valve has not announced yet.
Request
curl 'https://launchrivals.com/api/user/steam/events' \
-H 'Authorization: Bearer lrs_…' # optionalconst res = await fetch('https://launchrivals.com/api/user/steam/events', {
headers: { Authorization: 'Bearer ' + KEY }, // optional
});
const data = await res.json();import requests
data = requests.get(
'https://launchrivals.com/api/user/steam/events',
headers={'Authorization': f'Bearer {KEY}'}, # optional
).json()$ctx = stream_context_create(['http' => [
'header' => 'Authorization: Bearer ' . $key, // optional
]]);
$data = json_decode(file_get_contents('https://launchrivals.com/api/user/steam/events', false, $ctx), true);Example answer (trimmed)
{
"events": [
{
"name": "Steam Scream V",
"slug": "steam-scream-v-2026",
"kind": "theme_fest",
"starts": "2026-10-26",
"ends": "2026-11-02",
"registration_deadline": null,
"confirmed": true,
"tags": [
{
"id": 1667,
"name": "Horror"
},
{
"id": 1721,
"name": "Psychological Horror"
}
]
},
{
"name": "Auto Battler RPG Fest 2026",
"slug": "auto-battler-rpg-fest-2026",
"kind": "theme_fest",
"starts": "2026-11-16",
"ends": "2026-11-23",
"registration_deadline": null,
"confirmed": true,
"tags": [
{
"id": 1084988,
"name": "Auto Battler"
}
]
}
]
}Studio page
GET /api/user/steam/studios/{clan_id} · /xml for XML
A developer or publisher page on Steam: its followers over time, website, social links and its games.
| Parameter | In | Type | Description |
|---|---|---|---|
| clan_id required | path | integer | The studio id, as in store.steampowered.com/curator/3584665; also in studios[].clan_id of a game. |
Request
curl 'https://launchrivals.com/api/user/steam/studios/3584665' \
-H 'Authorization: Bearer lrs_…' # optionalconst res = await fetch('https://launchrivals.com/api/user/steam/studios/3584665', {
headers: { Authorization: 'Bearer ' + KEY }, // optional
});
const data = await res.json();import requests
data = requests.get(
'https://launchrivals.com/api/user/steam/studios/3584665',
headers={'Authorization': f'Bearer {KEY}'}, # optional
).json()$ctx = stream_context_create(['http' => [
'header' => 'Authorization: Bearer ' . $key, // optional
]]);
$data = json_decode(file_get_contents('https://launchrivals.com/api/user/steam/studios/3584665', false, $ctx), true);Example answer (trimmed)
{
"clan_id": 3584665,
"name": "Supergiant Games",
"url": "https://store.steampowered.com/curator/3584665/",
"avatar": "https://avatars.fastly.steamstatic.com/a2ac03c229b9dd346495c1efdd7e7c37f910a22f_full.jpg",
"website": "https://www.supergiantgames.com",
"socials": [
{
"type": "Discord",
"url": "https://discord.com/invite/Supergiant"
},
{
"type": "YouTube",
"url": "https://www.youtube.com/@supergiantgames"
}
],
"followers": 164810,
"updated": "2026-10-23T13:20:02Z",
"history": [
{
"date": "2026-10-23",
"followers": 164810
}
],
"games": [
{
"app_id": 1145360,
"name": "Hades",
"type": "game",
"release": {
"date": "2020-09-17",
"precision": "day",
"text": "Sep 17, 2020",
"coming_soon": false
},
"price_cents": 2499,
"is_free": false,
"followers": 308820,
"reviews_total": 310472,
"header": "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1145360/header.jpg?t=1758127023",
"url": "https://launchrivals.com/api/user/steam/1145360",
"role": "developer"
}
]
}Your key and limits
GET /api/user · /xml for XML
Which key you are calling with (if any), your rate limit and a list of every endpoint. Handy to check that your key works.
Request
curl 'https://launchrivals.com/api/user' \
-H 'Authorization: Bearer lrs_…' # optionalconst res = await fetch('https://launchrivals.com/api/user', {
headers: { Authorization: 'Bearer ' + KEY }, // optional
});
const data = await res.json();import requests
data = requests.get(
'https://launchrivals.com/api/user',
headers={'Authorization': f'Bearer {KEY}'}, # optional
).json()$ctx = stream_context_create(['http' => [
'header' => 'Authorization: Bearer ' . $key, // optional
]]);
$data = json_decode(file_get_contents('https://launchrivals.com/api/user', false, $ctx), true);Example answer (trimmed)
{
"key": {
"name": "My Discord bot",
"prefix": "lrs_3f9c2a71"
},
"rate_limit": {
"per_second": 5,
"by": "key"
},
"get_a_key": "https://launchrivals.com/settings/steam-data",
"docs": "https://launchrivals.com/steam-data",
"formats": [
"json",
"xml"
],
"endpoints": {
"game": "https://launchrivals.com/api/user/steam/{app_id}",
"…": "…"
}
}Changelog
- v1 · October 23, 2026 · First release: games, prices, history, news, store changes, achievements, search, releases, tags, events, studios; keys; JSON and XML; OpenAPI.
Questions or ideas? Write to us. LaunchRivals is not affiliated with Valve or Steam.