Developers and agents
The ResidualPlay API
Everything on this site is available as JSON, CSV and Markdown. It is free and almost everything needs no key and no account; the exceptions: the bulk CSV export asks you to identify (free account or anonymous agent token), and the bulk data endpoints are paid over x402. All we ask is a link back when you publish something built on it.
MCP server (for agents)
Add https://residualplay.com/mcp as an MCP connector (Streamable HTTP, no
authentication) and your assistant gets five read-only tools: search_radar,
get_game, get_studio, get_insights and
get_report. Discovery card at /.well-known/mcp.json. Same data, same
rate limits, ready to answer questions like "find unclaimed strategy games earning over $1k/mo".
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.
Every estimated figure is rounded to three significant figures, because the model does not have more precision than that. A game shown at 67,300 units is not a claim about the last hundred copies; it is an estimate with a wide band around it. Review counts, prices and dates are exact, since those are measured rather than estimated.
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.
Paid bulk data (x402)
Individual queries stay free. Bulk extracts are paid, machine to machine, over the
x402 protocol (v2, scheme exact, USDC): request the
endpoint, read the PAYMENT-REQUIRED header, pay, retry with
PAYMENT-SIGNATURE. No account, no invoice dance.
GET /api/v1/bulk/orphans.csv every verified orphan + the evidence USDC 15.00
GET /api/v1/bulk/catalog.csv the full scored catalog, every column USDC 5.00
POST /api/v1/agent/credits 10,000 request credits for your token USDC 5.00
GET /api/v1/bulk/research.json decay, discounts, seasonality, cohorts USDC 2.00
GET /api/v1/bulk/radar.json?... any screener query, full result set USDC 1.00
GET /api/v1/bulk/game/{appid}.json deep dossier: history, players, comps USDC 0.05 Mainnet activation is in progress; the endpoint answers 404 until then. If you want a bulk extract meanwhile, write to contact@residualplay.com.
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.