@nekosuneprojects/free-games-checker fetches free or currently claimable games from multiple sources.
npm i @nekosuneprojects/free-games-checker
Primary sources:
- Epic Games Store
- Steam
- Humble Bundle
- Ubisoft Connect
- GOG
- Amazon Games (stub, currently returns
[])
Fallback sources:
- GamerPower API
- FreeToGame API
getFreeGames(country) behavior:
- Fetch primary sources.
- If primary sources return at least one game, return those results.
- If primary sources return zero games, fallback to GamerPower + FreeToGame.
import {
getFreeGames,
getFreeGamesWithFallbackOptions,
getGamerPowerGames,
getFreeToGameGames,
clearRequestCache,
getEpicGames,
getSteamGames,
getUbisoftGames,
getHumbleGames,
getGogGames
} from "@nekosuneprojects/free-games-checker";
async function main() {
const all = await getFreeGames("US");
console.log("getFreeGames", all.length);
const repulled = await getFreeGames("US", { forceRefresh: true });
console.log("getFreeGames forceRefresh", repulled.length);
const fallbackFiltered = await getFreeGamesWithFallbackOptions("US", {
gamerPowerPlatforms: ["pc", "steam", "epic-games-store"],
gamerPowerCategories: ["game", "dlc", "software", "game-code"],
freeToGamePlatforms: ["pc", "browser"],
freeToGameCategory: "shooter",
freeToGameSortBy: "release-date"
}, {
forceRefresh: true
});
console.log("getFreeGamesWithFallbackOptions", fallbackFiltered.length);
const gamerPowerSteam = await getGamerPowerGames(["steam"], {
categories: ["giveaway", "game", "dlc"]
});
console.log("getGamerPowerGames(steam)", gamerPowerSteam.length);
const gamerPowerSteamRepull = await getGamerPowerGames(["steam"], {
categories: ["giveaway", "game", "dlc"],
forceRefresh: true
});
console.log("getGamerPowerGames(steam) forceRefresh", gamerPowerSteamRepull.length);
const freeToGame = await getFreeToGameGames({
platforms: ["pc", "browser"],
category: "mmorpg",
sortBy: "alphabetical",
forceRefresh: true
});
console.log("getFreeToGameGames", freeToGame.length);
console.log("epic", (await getEpicGames("US")).length);
console.log("steam", (await getSteamGames()).length);
console.log("ubisoft", (await getUbisoftGames()).length);
console.log("humble", (await getHumbleGames()).length);
console.log("gog", (await getGogGames()).length);
// Optional: clear in-memory request cache
clearRequestCache();
}const checker = require("@nekosuneprojects/free-games-checker");
(async () => {
const data = await checker.getFreeGames("US");
console.log(data.length);
})();getFreeGames(country: string, options?: { forceRefresh?: boolean })getFreeGamesWithFallbackOptions(country: string, fallbackOptions: { gamerPowerPlatforms?: string[]; gamerPowerCategories?: string[]; freeToGamePlatforms?: string[]; freeToGameCategory?: string; freeToGameSortBy?: "release-date" | "alphabetical" | "relevance" }, options?: { forceRefresh?: boolean })getEpicGames(country: string, options?: { forceRefresh?: boolean })getSteamGames(options?: { forceRefresh?: boolean })getHumbleGames(options?: { forceRefresh?: boolean })getAmazonGames()getUbisoftGames(options?: { forceRefresh?: boolean })getGogGames(options?: { forceRefresh?: boolean })getGamerPowerGames(platforms?: string[], options?: { categories?: string[]; forceRefresh?: boolean })getFreeToGameGames(options?: { platforms?: string[]; category?: string; sortBy?: "release-date" | "alphabetical" | "relevance"; forceRefresh?: boolean })clearRequestCache()
- All outgoing GET requests go through a shared safety layer with:
- In-memory response cache (default TTL: 5 minutes)
- Longer Steam app-page TTL cache (30 minutes)
- Request de-duplication for identical in-flight calls
- Per-service request pacing to avoid API spam
- Rate-limit-aware pacing includes:
- FreeToGame: max 10 req/s (100ms spacing)
- GamerPower: max 4 req/s (250ms spacing)
- Other providers also paced conservatively to reduce bursts
- To bypass cache and repull fresh data immediately, use
forceRefresh: true.
getGamerPowerGames(platforms) and getFreeGamesWithFallbackOptions(..., { gamerPowerPlatforms }) support values like:
pcsteamepic-games-storeubisoftgogitchiops4ps5xbox-onexbox-series-xsswitchandroidiosvrbattlenetorigindrm-freexbox-360
getGamerPowerGames(..., { categories }) and getFreeGamesWithFallbackOptions(..., { gamerPowerCategories }) support:
giveaway(all active giveaway items)gamedlcsoftwaregame-codelootbetaother
getFreeToGameGames(options) and fallback options support:
platforms:pc,browser,allcategory: genre/category values supported by FreeToGame API (for exampleshooter,mmorpg,strategy)sortBy:release-date,alphabetical,relevance
[
{
"id": 3511,
"title": "Just Move:Clean City Messy Battle (Steam) Giveaway",
"description": "...",
"mainImage": "https://www.gamerpower.com/offers/1b/69a1debbeb619.jpg",
"url": "https://www.gamerpower.com/open/just-move-clean-city-messy-battle-steam-giveaway",
"platform": "gamerpower",
"startDate": "2026-02-27T13:13:16.000Z",
"endDate": "2026-03-04T23:59:00.000Z"
}
]- Ubisoft parser uses news entries with
type = freegameand non-nullexpirationDate. - Steam parser uses search results + per-app DLC check (matches your requested Python behavior).
- GOG parser combines homepage giveaway + discounted store page + GOG promotions API, then dedupes.
- If a source request fails, that source safely returns
[].
A GitHub star helps.