Free games API
Every listing on this site is available as JSON. No key, no signup, no rate limit you are likely to hit. Use it for a Discord bot, a dashboard, or anything else. The archive endpoint carries historical giveaways, which is data you will not find elsewhere.
Base URL
https://playfreeunblocked.com/api/v1/
Endpoints
| Endpoint | Returns |
|---|---|
giveaways | Claimable offers — free to keep and free weekends. |
giveaways/{slug} | One offer. Falls back to the archive if it has ended. |
demos | Playable demos from Steam and GOG. No expiry. |
dlc | Free add-on content. Requires the base game. |
free-to-play | Permanently free games. |
archive | Expired giveaways, kept permanently. |
platforms | Platforms with live counts. |
stats | Totals, coverage and per-source freshness. |
Try it
curl https://playfreeunblocked.com/api/v1/giveaways
Filters
All listing endpoints accept the same parameters.
| Parameter | Example | Meaning |
|---|---|---|
platform | steam | Filter by store. See /platforms for slugs. |
type | keep | One of keep, weekend, demo, dlc, f2p. |
sort | ending | ending, newest, title or worth. |
limit | 50 | 1–200. Defaults to 50. |
offset | 0 | For paging. |
ends_before | 2026-10-01 | Only offers ending before this date. |
ends_after | 2026-09-25 | Only offers ending after this date. |
curl "https://playfreeunblocked.com/api/v1/giveaways?platform=steam&sort=ending&limit=10"
Response shape
Every endpoint returns the same envelope, errors included.
{
"data": [
{
"slug": "crystal-crisis",
"title": "Crystal Crisis",
"type": "keep",
"platforms": ["Steam"],
"worth_usd": 19.99,
"claim_url": "https://...",
"ends_at": "2026-09-22T23:59:00+00:00",
"seconds_left": 342501,
"confirmed": true,
"sources": ["gamerpower", "reddit"]
}
],
"meta": { "count": 1, "total": 85, "fetched_at": "...", "stale": false }
}
In JavaScript
const res = await fetch("https://playfreeunblocked.com/api/v1/giveaways?type=keep");
const { data } = await res.json();
for (const game of data) {
console.log(game.title, "on", game.platforms.join(", "));
}
In Python
import requests
r = requests.get("https://playfreeunblocked.com/api/v1/giveaways",
params={"platform": "epic", "limit": 10})
for game in r.json()["data"]:
print(game["title"], game["ends_at"])
Things worth knowing
Check meta.stale. If our checker has not reached the
stores recently it flips to true, which means offers may have ended
since. We would rather tell you than pretend the data is fresh.
confirmed: false means one source. Some offers are
spotted by the community before any store API lists them. They are usually right,
but treat them as a lead rather than a fact.
Responses carry an ETag. Send
If-None-Match and you will get a 304 when nothing has changed. The
cache only updates when our job runs, so polling more than a few times an hour
gains you nothing.
Terms
Free for personal and commercial use. Please credit this site and GamerPower, whose data this partly aggregates. Do not resell the data — their licence forbids it and so do we. If you build something with it, we would like to see it.
Current coverage
| Source | Status | Records | Last checked |
|---|---|---|---|
gamerpower |
ok | 101 | 19 Sep 00:53 UTC |
epic |
ok | 4 | 19 Sep 00:53 UTC |
reddit |
ok | 65 | 19 Sep 00:53 UTC |
gog |
ok | 48 | 19 Sep 00:53 UTC |
steam |
ok | 100 | 19 Sep 00:53 UTC |