{
  "sample": true,
  "not_current": "EVERY offer in this document has ALREADY ENDED. This is a frozen test fixture for building and testing an integration. It is NOT the live feed and must never be presented to a user as games that are currently free. The live feed is GET /v1/free-games.",
  "frozen_at": "2026-08-03T13:15:18.575Z",
  "version": "5a70164327596b76fdd0d6c85c00b453ce870e5881a4b55dc09242645d230d4a",
  "updated_at": "2026-08-03T13:15:18.575Z",
  "free_games": [
    {
      "title": "Follower",
      "store": "itch",
      "igdb_id": null,
      "claim_url": "https://grantrimi.itch.io/follower",
      "starts_at": null,
      "ends_at": "2026-08-01T00:21:00.000Z",
      "original_price_cents": 200,
      "currency": "USD",
      "source": "itch:on-sale.xml (discountpercent === 100, fullPrice > 0)",
      "first_seen": "2026-07-31T18:35:05.218Z"
    },
    {
      "title": "Late Stops",
      "store": "itch",
      "igdb_id": null,
      "claim_url": "https://grantrimi.itch.io/late-stops",
      "starts_at": null,
      "ends_at": "2026-08-01T00:21:00.000Z",
      "original_price_cents": 200,
      "currency": "USD",
      "source": "itch:on-sale.xml (discountpercent === 100, fullPrice > 0)",
      "first_seen": "2026-07-31T00:20:01.987Z"
    },
    {
      "title": "Liminal Lane",
      "store": "itch",
      "igdb_id": null,
      "claim_url": "https://ravenhome.itch.io/liminal-lane",
      "starts_at": null,
      "ends_at": "2026-07-31T20:45:00.000Z",
      "original_price_cents": 100,
      "currency": "USD",
      "source": "itch:on-sale.xml (discountpercent === 100, fullPrice > 0)",
      "first_seen": "2026-07-31T00:20:01.987Z"
    },
    {
      "title": "Night Clerk",
      "store": "itch",
      "igdb_id": null,
      "claim_url": "https://grantrimi.itch.io/night-clerk",
      "starts_at": null,
      "ends_at": "2026-08-01T00:21:00.000Z",
      "original_price_cents": 200,
      "currency": "USD",
      "source": "itch:on-sale.xml (discountpercent === 100, fullPrice > 0)",
      "first_seen": "2026-07-31T00:20:01.987Z"
    },
    {
      "title": "No Way Out",
      "store": "itch",
      "igdb_id": null,
      "claim_url": "https://inside-games.itch.io/no-way-out",
      "starts_at": null,
      "ends_at": "2026-07-31T09:05:00.000Z",
      "original_price_cents": 100,
      "currency": "USD",
      "source": "itch:on-sale.xml (discountpercent === 100, fullPrice > 0)",
      "first_seen": "2026-07-31T01:49:05.215Z"
    },
    {
      "title": "Storefront",
      "store": "itch",
      "igdb_id": null,
      "claim_url": "https://grantrimi.itch.io/storefront",
      "starts_at": null,
      "ends_at": "2026-08-01T00:21:00.000Z",
      "original_price_cents": 200,
      "currency": "USD",
      "source": "itch:on-sale.xml (discountpercent === 100, fullPrice > 0)",
      "first_seen": "2026-07-31T22:35:31.725Z"
    },
    {
      "title": "The Bigfoot: Snow Massacre",
      "store": "itch",
      "igdb_id": null,
      "claim_url": "https://deaddove-studio.itch.io/the-bigfoot-snow-massacre",
      "starts_at": null,
      "ends_at": "2026-07-31T05:50:00.000Z",
      "original_price_cents": 150,
      "currency": "USD",
      "source": "itch:on-sale.xml (discountpercent === 100, fullPrice > 0)",
      "first_seen": "2026-07-31T00:20:01.987Z"
    }
  ],
  "stores": {
    "itch": {
      "status": "ok",
      "free_count": 7,
      "verified_at": "2026-08-01T00:35:34.979Z",
      "note": "historical snapshot: 7 offers that were free during this window"
    }
  },
  "contract": {
    "see": "https://soren.com/contract.md"
  },
  "signature": {
    "algorithm": "Ed25519",
    "signs": "version",
    "value": "bojGxNJjoYSIgo4Vkso0HXXFFT3vhBLSpHUUF8VzbAVc916EsjczMH7Znyu5zYC/Mpvrlu580JEURcd2j5Z/AQ==",
    "public_key_url": "https://soren.com/signing-key.json",
    "note": "Verify over the ASCII bytes of the `version` string. Recompute `version` from the payload as well — the signature proves origin, the hash proves the content matches."
  },
  "verification": {
    "algorithm": "sha256",
    "encoding": "hex",
    "covers": [
      "free_games",
      "stores[].status",
      "stores[].free_count"
    ],
    "excludes": [
      "sample",
      "not_current",
      "frozen_at",
      "updated_at",
      "verification",
      "contract",
      "signature"
    ],
    "canonical_form": "JSON of {\"offers\":<free_games exactly as published>,\"coverage\":<[[store,status,free_count],...] sorted by store name>} with no whitespace, then sha256, hex-encoded.",
    "offer_key_order": [
      "title",
      "store",
      "igdb_id",
      "claim_url",
      "starts_at",
      "ends_at",
      "original_price_cents",
      "currency",
      "source",
      "first_seen"
    ],
    "note": "Identical canonical form to the live feed, and really signed with the real key — so verification code tested against this fixture works unchanged against paid data. Reference implementation: https://soren.com/verify.js",
    "reference_implementation": "https://soren.com/verify.js"
  },
  "fixture_notes": {
    "determinism": "This document is frozen. It does not change with the live feed, so assertions written against it keep passing. Regenerating is a deliberate act by the operator.",
    "what_differs_from_live": "Only the `sample`, `not_current`, `frozen_at` and `fixture_notes` keys, and the fact that every ends_at is in the past. Field names, types, ordering and the hash canonicalisation are identical.",
    "why_real_titles": "Every offer here has ended, so publishing the names gives nothing away. The live feed withholds them because the names ARE the product — knowing which game is free is the thing being sold."
  }
}
