---
title: "Frozen test fixture — free, real shape, every offer already ended"
method: GET
path: "/v1/sample"
tags: ["Free"]
---

# Frozen test fixture — free, real shape, every offer already ended

`GET /v1/sample`

## Request

- Base URL: `https://soren.com`
- URL: `https://soren.com/v1/sample`
- Auth: none required

A free, immutable sample of the /v1/free-games payload so you can build and test an integration before paying for anything. Identical field names, types and hash canonicalisation to the live feed, and really signed with the production key — so verification code tested against this works unchanged against paid data.

Every offer in it has already ended. The titles and claim URLs are real, but following one reaches a store page where the game costs money again, so there is nothing to claim and nothing to gain by using this instead of the live feed.

Frozen on purpose: it does not roll forward, so assertions written against it keep passing. Do NOT present its contents to a user as currently-free games — the `sample` and `not_current` fields, and the X-Soren-Sample response header, all say so.

## Response `200`

The frozen fixture.

- object
  - `version` string, required: SHA-256 of the canonical form {"offers":<free_games as published>,"coverage":[[store,status,free_count],...] sorted by store}, hex-encoded. Changes only when content changes, never on a mere refresh — so an unchanged version means nothing to do, and a mismatch means the payload was modified after publication.
  - `updated_at` string, date-time, required
  - `free_games` Offer[], required
    - `title` string, required
    - `store` 'steam' | 'epic' | 'gog' | 'itch', required
    - `igdb_id` integer, nullable
    - `claim_url` string, uri, required
    - `starts_at` string, date-time, nullable: Null where the store does not publish a start time. Never substituted with our detection time.
    - `ends_at` string, date-time, nullable
    - `original_price_cents` integer, nullable: What the game normally costs, in minor units of `currency` (1999 = $19.99). Lets you rank by value rather than by row count — "3 games worth $60 are free" is a more useful answer than "20 games are free", and this catalogue is dominated by low-priced indie titles. null means the store does not publish a price, which is NOT the same as zero: a permanently free-to-play title would be 0.
    - `currency` string, nullable: ISO 4217 code for original_price_cents. null when the price is unknown.
    - `source` string: The exact endpoint and test that confirmed this entry, e.g. 'epic:freeGamesPromotions (discountPercentage === 0, active window)'. Static per store, so it is included in the version hash.
    - `first_seen` string, date-time, nullable: When this offer was first observed. Set once and stable thereafter. There is deliberately no per-offer verified_at: every offer from a store is confirmed in the same pass, so it would duplicate stores[].verified_at exactly, and being a per-run timestamp it would change the version on every pass and bill every conditional poll.
  - `stores` object, required
  - `verification` object: How to recompute `version` yourself. Present so integrity can be checked rather than trusted.
  - `signature` object, nullable: Ed25519 signature over the `version` string. Public key at https://soren.com/signing-key.json. Proves the payload originated from Soren; combine with recomputing the hash, which proves the content matches what was signed.
  - `contract` object: Machine-readable statement of what is guaranteed within this major version: fields never removed or retyped, additions possible without notice, meanings never silently changed, canonical hash form fixed, 180 days' deprecation notice. Full text at https://soren.com/contract.md.
  - `sample` true
  - `not_current` string: Human-readable warning that every offer has ended.
  - `frozen_at` string, date-time

---

[API](https://skmtc.dev/soren/apis/soren-free-games-api.md) · [All operations](https://skmtc.dev/soren/apis/soren-free-games-api/llms.txt) · [OpenAPI document](https://skmtc.dev/soren/apis/soren-free-games-api/revisions/00402cfcf30d?raw)
