PlayFreeUnblocked

Checked 00:53 UTC

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

EndpointReturns
giveawaysClaimable offers — free to keep and free weekends.
giveaways/{slug}One offer. Falls back to the archive if it has ended.
demosPlayable demos from Steam and GOG. No expiry.
dlcFree add-on content. Requires the base game.
free-to-playPermanently free games.
archiveExpired giveaways, kept permanently.
platformsPlatforms with live counts.
statsTotals, coverage and per-source freshness.

Try it

curl https://playfreeunblocked.com/api/v1/giveaways

Filters

All listing endpoints accept the same parameters.

ParameterExampleMeaning
platformsteamFilter by store. See /platforms for slugs.
typekeepOne of keep, weekend, demo, dlc, f2p.
sortendingending, newest, title or worth.
limit501–200. Defaults to 50.
offset0For paging.
ends_before2026-10-01Only offers ending before this date.
ends_after2026-09-25Only 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

SourceStatusRecordsLast 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