Soren

Is this game cheap right now, or should you wait?

Answering that needs one thing storefronts do not publish: what the game has cost before. Steam and GOG return a current price and nothing else — no history endpoint, no series, no past values. The record of what a game used to cost exists only for whoever wrote it down.

Soren has been writing it down. 7.8 million price observations across 145,931 games, the earliest from March 2012, priced across four storefronts and four regions, returned in one call.

The same game is rarely the same price

Cross-store spread is larger and more common than most buyers expect. A live example from the catalogue:

GameGOGSteamMicrosoft
Dex$0.89$1.99$19.99
A Plague Tale: Requiem$14.99$49.99$59.99

Finding that without Soren means four lookups against four APIs, having already resolved four different product ids for the same game. That resolution is the part nobody publishes: we hold 207,181 store mappings across 371,448 games.

Every low comes with the window it was observed in

We never say “all-time low”. A low computed from three weeks of data and one computed from fourteen years look identical unless you say which it is. Every figure carries observed_since, an observation count, and a coverage block stating exactly when we were — and were not — watching.

One call

# free: resolve a name to a slug before you pay
curl "https://soren.com/v1/lookup?q=forza+horizon"

# paid: the answer, by slug or by any id you already hold
curl -H "X-PAYMENT: <x402 proof>" \
  "https://soren.com/v1/game?game=forza-horizon-5"

/v1/game?steam=1551360
/v1/game?q=fallout+new+vegas&region=GB
{
  "game": { "slug": "forza-horizon-5", "title": "Forza Horizon 5",
            "type": "main_game", "released_at": "2021-11-09" },
  "prices": [
    { "store": "steam", "region": "US", "status": "ok",
      "currency": "USD", "price": 59.99, "regular_price": 59.99,
      "discount_pct": 0,
      "lowest_observed": 29.99, "lowest_observed_at": "2023-06-06",
      "pct_above_lowest_observed": 100,
      "observed_since": "2021-08-24", "observations": 89 }
  ],
  "subscriptions": [
    { "service": "Game Pass", "available": true, "leaving_at": null },
    { "service": "EA Play",   "available": false }
  ],
  "demand": { "waiting": 13493, "buy_at_any_price": 9758 },
  "coverage": [ { "store": "steam", "from": "2012-03-29", "to": null } ],
  "region": "US"
}

Related editions, expansions and DLC come back in family, whole and never truncated. Mods and updates are excluded unless you ask for them with ?include=mods.

What it does not do

It gives no buy-or-wait verdict. “Batman: Arkham Asylum is 3,898% above the lowest price we have observed, across 243 observations since November 2012” is a fact we can defend. “Wait for the summer sale” is a prediction we cannot. The numbers are sourced; the judgement is yours.

Non-US regions return a price but no observed low, and say why: the observation series is USD-only, and comparing a Brazilian real price against a US dollar low would be meaningless rather than merely imprecise.

How current is it?

Unevenly, on purpose — and every price says so itself. Each entry carries checked_at (when we last looked) and changed_at (when it last moved), kept separate so a price that has been stable for a month is distinguishable from a collector that stopped running.

WhatRefreshed
The games people actually ask aboutevery 4 hours
Epic and GOG, full cataloguedaily
The Steam tail (173,290 products)rotating, a few days end to end

We do not claim a single freshness figure across 207,181 store mappings, because it would not be true of all of them. The timestamp on each row is the honest version, and it is in every response whether you ask for it or not.

Free-game data is different. The free-to-keep feed is rechecked hourly across all four storefronts, because a giveaway that ended an hour ago is a wrong answer in a way that a price from yesterday is not.

Price

$0.01 per lookup, paid per request over HTTP 402 using x402 with USDC on Base. No signup, no API key, no account — an agent with a wallet can call it directly. Full contract at openapi.json, and llms.txt describes it for models.

This price is current, not fixed. It may change. The amount quoted in a request’s own HTTP 402 challenge is always the authoritative one, so a client should pay the price it is offered rather than a price read from this page. Nothing here is a commitment to a future rate.