Developers and agents
The ResidualPlay API
Everything on this site is available as JSON, CSV and Markdown. It is free, needs no key and no account. All we ask is a link back when you publish something built on it.
Quick start
The top ten opportunities on the radar right now:
curl "https://residualplay.com/api/v1/radar?per=10" One game's full case file, by Steam appid:
curl "https://residualplay.com/api/v1/game/1113120" What the numbers mean
Every money figure is net to the developer and per month, unless the field name says lifetime. Net means VAT, refunds and Steam's cut are already removed, so roughly 55% of gross. Estimates carry a ±30–50% error range per title and are tighter in aggregate.
residual_low_usd,residual_mid_usd,residual_high_usd: estimated net revenue per month.opportunity_usd: that revenue weighted by how dormant the title is. It is the default sort and the honest answer to "where is the most money with the least attention on it".neglect: the dormancy multiplier, 1.0 to 3.0, fused from developer silence, discount history and build age.reviews_per_month: reviews posted, six-month average. Not units sold.sales_12m: number of discount promotions in the last year. Not units sold.studio_status:operating(active),fading(quiet) orghost(inactive, no public activity in three years).
Endpoints
| Endpoint | What it returns |
|---|---|
GET /api/v1/radar | The screener, with every filter below |
GET /api/v1/radar.csv | The same query as CSV, up to 2000 rows |
GET /api/v1/game/{appid} | Full case file, including the analyst brief |
GET /api/v1/game/{appid}/history | How the estimates moved over time |
GET /api/v1/game/{appid}/comps | Comparable deals, same genre and era |
POST /api/v1/game/{appid}/analyze | Queue an unanalyzed game, ready in about a minute |
GET /api/v1/game/{appid}/status | Analysis state of that game |
GET /api/v1/studio/{slug} | A developer's whole tracked catalog |
GET /api/v1/events | Recent changes: wake-ups, first discounts, new grade A |
GET /api/v1/report/{YYYY-MM} | The monthly Residual Report |
GET /api/v1/kpis | Aggregates across the whole radar |
GET /api/v1/health | Service health |
Filters
All of these combine on /api/v1/radar and /api/v1/radar.csv:
q,genre,grade(A|B|C|D),status(ghost|fading|operating),dormant=1- Ranges:
opp_min,opp_max,year_min,year_max,sent_min,owners_min - Signals:
no_discount=1(nothing in 24 months),proven=1(proven price elasticity),stale_build=1(no build in 36 months),loc_gap=1(10%+ of reviews in unsupported languages) sort(opportunity|residual|rpm|silence),page,per
A worked example, strategy games from 2018 or earlier with at least $1k/month of opportunity:
curl "https://residualplay.com/api/v1/radar?genre=Strategy&year_max=2018&opp_min=1000" Narrow it further with any signal, for instance only those whose players review in languages the game never shipped in:
curl "https://residualplay.com/api/v1/radar?opp_min=1000&year_max=2018&loc_gap=1" Markdown for agents
Send Accept: text/markdown to any page and you get clean Markdown instead of
HTML, with an X-Markdown-Tokens header so you can budget context before reading:
curl -H "Accept: text/markdown" https://residualplay.com/game/1113120 Case files also live at /game/{appid}.md without any header. The machine index
is /llms.txt, the OpenAPI description is
/openapi.json and the API catalog is at
/.well-known/api-catalog.
Rate limits and fair use
120 requests per minute per IP on reads, 10 on CSV exports and 5 on on-demand analysis. No key needed. If you need a bulk extract for research, write to contact@residualplay.com instead of hammering the endpoint, and we will help.
Attribution
Cite ResidualPlay with a link to the page you took the figure from. The data and its selection and arrangement are protected; see the terms. If you are a developer and want your game corrected or removed, write to us and we will handle it.