{"openapi": "3.1.0", "info": {"title": "minradar", "version": "1.0.0", "description": "Public App Store opportunity data for agents. Rating volume is an install proxy; downloads are not published by Apple and are never estimated here.", "termsOfService": "https://minradar.com/"}, "servers": [{"url": "https://minradar.com"}], "paths": {"/api/stats": {"get": {"summary": "Data coverage, freshness per storefront, and the last ingest runs.", "operationId": "api_stats", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ObjectResponse"}}}}, "404": {"description": "Unknown app or lens"}}}}, "/api/lenses": {"get": {"summary": "The catalogue of opportunity views (lens keys + what each measures).", "operationId": "api_lenses", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ObjectResponse"}}}}, "404": {"description": "Unknown app or lens"}}}}, "/api/lens/{lens}": {"get": {"summary": "Rank apps through one lens. Start here.", "operationId": "api_lens_lens", "parameters": [{"name": "lens", "in": "path", "required": true, "schema": {"type": "string", "enum": ["unmet_demand", "loyal_niche", "abandoned", "single_pain", "paywall_anger", "onboarding_pain", "weak_category", "solo_buildable"]}, "description": "Opportunity view to rank."}, {"name": "storefront", "in": "query", "schema": {"type": "string", "default": "us"}, "description": "Two-letter App Store region. The value is region identity, never a label."}, {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 10, "maximum": 200}, "description": "Maximum number of results to return."}, {"name": "min_rating_count", "in": "query", "schema": {"type": "integer", "default": 5000}, "description": "Rating volume is the install proxy. On /api/lens this remains a legacy alias for the scaled value; /api/hotspots uses it literally."}, {"name": "min_rating_count_scaled", "in": "query", "schema": {"type": "integer", "default": 5000}, "description": "Pre-scaled rating volume filter. /api/lens applies max(300, floor(value / 3)); /api/paying applies max(200, floor(value / 5))."}, {"name": "max_rating_count", "in": "query", "schema": {"type": "integer", "default": 0}, "description": "Optional ceiling to exclude unassailable giants."}, {"name": "max_rating", "in": "query", "schema": {"type": "number"}, "description": "Only include apps at or below this average rating, e.g. 4.0."}, {"name": "genre", "in": "query", "schema": {"type": "string"}, "description": "Restrict to one App Store category, e.g. Productivity."}, {"name": "include_institutional", "in": "query", "schema": {"type": "boolean", "default": false}, "description": "Include institution-locked products that a solo dev cannot win."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LensResponse"}}}}, "404": {"description": "Unknown app or lens"}}}}, "/api/hotspots": {"get": {"summary": "The default opportunity ranking with a hard buildability gate.", "operationId": "api_hotspots", "parameters": [{"name": "storefront", "in": "query", "schema": {"type": "string", "default": "us"}, "description": "Two-letter App Store region. The value is region identity, never a label."}, {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 10, "maximum": 200}, "description": "Maximum number of results to return."}, {"name": "min_rating_count", "in": "query", "schema": {"type": "integer", "default": 5000}, "description": "Rating volume is the install proxy. On /api/lens this remains a legacy alias for the scaled value; /api/hotspots uses it literally."}, {"name": "max_rating_count", "in": "query", "schema": {"type": "integer", "default": 0}, "description": "Optional ceiling to exclude unassailable giants."}, {"name": "max_rating", "in": "query", "schema": {"type": "number"}, "description": "Only include apps at or below this average rating, e.g. 4.0."}, {"name": "genre", "in": "query", "schema": {"type": "string"}, "description": "Restrict to one App Store category, e.g. Productivity."}, {"name": "include_institutional", "in": "query", "schema": {"type": "boolean", "default": false}, "description": "Include institution-locked products that a solo dev cannot win."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LensResponse"}}}}, "404": {"description": "Unknown app or lens"}}}}, "/api/paying": {"get": {"summary": "Categories ranked by evidence that users already pay.", "operationId": "api_paying", "parameters": [{"name": "storefront", "in": "query", "schema": {"type": "string", "default": "us"}, "description": "Two-letter App Store region. The value is region identity, never a label."}, {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 10, "maximum": 200}, "description": "Maximum number of results to return."}, {"name": "min_rating_count_scaled", "in": "query", "schema": {"type": "integer", "default": 5000}, "description": "Pre-scaled rating volume filter. /api/lens applies max(300, floor(value / 3)); /api/paying applies max(200, floor(value / 5))."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PayingResponse"}}}}, "404": {"description": "Unknown app or lens"}}}}, "/api/app/{app_id}": {"get": {"summary": "Full evidence dossier for one app (score, themes, quotes).", "operationId": "api_app_app_id", "parameters": [{"name": "app_id", "in": "path", "required": true, "schema": {"type": "integer"}, "description": "App Store track id."}, {"name": "storefront", "in": "query", "schema": {"type": "string", "default": "us"}, "description": "Two-letter App Store region. The value is region identity, never a label."}, {"name": "with_github", "in": "query", "schema": {"type": "boolean", "default": true}, "description": "Also search GitHub for reusable open-source components."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BriefResponse"}}}}, "404": {"description": "Unknown app or lens"}}}}, "/api/app/{app_id}/prompt": {"get": {"summary": "A ready-to-paste build prompt for one app (markdown).", "operationId": "api_app_app_id_prompt", "parameters": [{"name": "app_id", "in": "path", "required": true, "schema": {"type": "integer"}, "description": "App Store track id."}, {"name": "storefront", "in": "query", "schema": {"type": "string", "default": "us"}, "description": "Two-letter App Store region. The value is region identity, never a label."}, {"name": "target", "in": "query", "schema": {"type": "string", "enum": ["codex", "claude", "cursor"], "default": "codex"}, "description": "AI coding agent that will receive the brief."}], "responses": {"200": {"description": "OK", "content": {"text/markdown": {"schema": {"type": "string"}}}}, "404": {"description": "Unknown app or lens"}}}}, "/api/app/{app_id}/history": {"get": {"summary": "Published score history for one app: the delta, the drivers and whether the two ends are comparable.", "operationId": "api_app_app_id_history", "parameters": [{"name": "app_id", "in": "path", "required": true, "schema": {"type": "integer"}, "description": "App Store track id."}, {"name": "storefront", "in": "query", "schema": {"type": "string", "default": "us"}, "description": "Two-letter App Store region. The value is region identity, never a label."}, {"name": "days", "in": "query", "schema": {"type": "integer", "default": 90}, "description": "How far back the score history is read."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HistoryResponse"}}}}, "404": {"description": "Unknown app or lens"}}}}, "/api/github": {"get": {"summary": "Maintained open-source accelerators for a theme or genre, with licence posture.", "operationId": "api_github", "parameters": [{"name": "genre", "in": "query", "schema": {"type": "string"}, "description": "Restrict to one App Store category, e.g. Productivity."}, {"name": "theme", "in": "query", "schema": {"type": "string"}, "description": "Complaint theme key, e.g. data_loss_sync, paywall_aggressive, ai_quality."}, {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 6, "maximum": 200}, "description": "Maximum number of results to return."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ObjectResponse"}}}}, "404": {"description": "Unknown app or lens"}}}}, "/api/methodology": {"get": {"summary": "Scoring formulas, weights and the dataset's honest limitations.", "operationId": "api_methodology", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ObjectResponse"}}}}, "404": {"description": "Unknown app or lens"}}}}, "/api/model": {"get": {"summary": "Machine-readable model card with versions, weights, gates and thresholds.", "operationId": "api_model", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ObjectResponse"}}}}, "404": {"description": "Unknown app or lens"}}}}}, "x-rate-limits": {"mcp": {"requests": 1200, "window_seconds": 3600}, "api": {"requests": 6000, "window_seconds": 3600}, "page": {"requests": 1200, "window_seconds": 3600}}, "components": {"schemas": {"VersionMetadata": {"type": "object", "properties": {"model_version": {"type": "string"}, "schema_version": {"type": "string"}, "model_config_hash": {"type": "string"}, "data_version": {"type": ["string", "null"]}, "data_version_kind": {"type": ["string", "null"]}, "data_version_status": {"type": ["string", "null"]}, "changelog": {"type": "array", "items": {"type": "object"}}}, "additionalProperties": true}, "DomainDecision": {"type": "object", "properties": {"capability": {"type": "string"}, "confidence": {"enum": ["high", "medium", "low"]}, "entities": {"type": "string"}, "evidence": {"type": "string"}, "target_user": {"type": "string"}, "capability_sentence": {"type": "string"}}, "additionalProperties": true}, "Dependency": {"type": "object", "properties": {"key": {"type": "string"}, "evidence": {"type": "string"}, "reason": {"type": "string"}}, "additionalProperties": true}, "SoloWedge": {"type": "object", "properties": {"found": {"type": "boolean"}, "evidence": {"type": "string"}}, "additionalProperties": true}, "DecisionRecord": {"type": "object", "properties": {"domain": {"$ref": "#/components/schemas/DomainDecision"}, "dependencies": {"type": "array", "items": {"$ref": "#/components/schemas/Dependency"}}, "solo_wedge": {"$ref": "#/components/schemas/SoloWedge"}, "verdict": {"enum": ["solo_ready", "conditional", "blocked", "insufficient_evidence"]}, "confidence": {"enum": ["high", "medium", "low"]}, "reasons": {"type": "array", "items": {"type": "string"}}}, "additionalProperties": true}, "Winnability": {"type": "object", "properties": {"verdict": {"type": "string"}, "blockers": {"type": "array", "items": {"type": "string"}}, "reasons": {"type": "array", "items": {"type": "string"}}, "evidence": {"type": "object"}, "multiplier": {"type": "number"}, "solo_buildable": {"type": "boolean"}, "solo_buildable_confidence": {"type": "string"}, "decision_verdict": {"type": "string"}, "domain": {"$ref": "#/components/schemas/DomainDecision"}, "dependencies": {"type": "array", "items": {"$ref": "#/components/schemas/Dependency"}}, "solo_wedge": {"$ref": "#/components/schemas/SoloWedge"}}, "additionalProperties": true}, "LensResult": {"type": "object", "properties": {"app_id": {"type": "integer"}, "name": {"type": "string"}, "developer": {"type": ["string", "null"]}, "genre": {"type": ["string", "null"]}, "rating": {"type": ["number", "null"]}, "rating_count": {"type": ["integer", "null"]}, "score": {"type": "number"}, "tier": {"type": "string"}, "breakdown": {"type": "object"}, "buildability": {"type": "object", "properties": {"winnability": {"$ref": "#/components/schemas/Winnability"}}, "additionalProperties": true}, "themes": {"type": "array", "items": {"type": "object"}}}, "additionalProperties": true, "required": ["app_id", "name", "score", "tier"]}, "LensResponse": {"type": "object", "properties": {"lens": {"type": "string"}, "storefront": {"type": "string"}, "pool": {"type": "integer"}, "pool_scored": {"type": "integer"}, "candidates": {"type": "integer"}, "filters_applied": {"type": "object"}, "results": {"type": "array", "items": {"$ref": "#/components/schemas/LensResult"}}, "model_version": {"type": "string"}, "schema_version": {"type": "string"}, "model_config_hash": {"type": "string"}, "data_version": {"type": ["string", "null"]}, "data_version_kind": {"type": ["string", "null"]}, "data_version_status": {"type": ["string", "null"]}, "changelog": {"type": "array", "items": {"type": "object"}}}, "additionalProperties": true, "required": ["lens", "storefront", "candidates", "results"]}, "BriefResponse": {"type": "object", "properties": {"app": {"type": "object"}, "decision": {"$ref": "#/components/schemas/DecisionRecord"}, "buildability": {"type": "object", "properties": {"decision": {"$ref": "#/components/schemas/DecisionRecord"}, "winnability": {"$ref": "#/components/schemas/Winnability"}}, "additionalProperties": true}, "themes": {"type": "array", "items": {"type": "object"}}, "review_provenance": {"type": "object"}, "low_hanging": {"type": "object"}, "paying": {"type": "object"}, "github": {"type": "array", "items": {"type": "object"}}, "summary": {"type": "string"}, "wedge": {"type": "string"}, "buildable": {"type": "boolean"}, "recommended_action": {"enum": ["build", "resolve_blockers", "do_not_build", "gather_evidence"]}, "model_version": {"type": "string"}, "schema_version": {"type": "string"}, "model_config_hash": {"type": "string"}, "data_version": {"type": ["string", "null"]}, "data_version_kind": {"type": ["string", "null"]}, "data_version_status": {"type": ["string", "null"]}, "changelog": {"type": "array", "items": {"type": "object"}}}, "additionalProperties": true, "required": ["app", "decision", "buildability", "themes"]}, "PayingResponse": {"type": "object", "properties": {"storefront": {"type": "string"}, "categories": {"type": "integer"}, "min_apps": {"type": "integer"}, "min_rating_count_scaled": {"type": "integer"}, "min_rating_count_effective": {"type": "integer"}, "results": {"type": "array", "items": {"type": "object"}}, "model_version": {"type": "string"}, "schema_version": {"type": "string"}, "model_config_hash": {"type": "string"}, "data_version": {"type": ["string", "null"]}, "data_version_kind": {"type": ["string", "null"]}, "data_version_status": {"type": ["string", "null"]}, "changelog": {"type": "array", "items": {"type": "object"}}}, "additionalProperties": true, "required": ["storefront", "results"]}, "HistoryResponse": {"type": "object", "properties": {"app_id": {"type": "integer"}, "storefront": {"type": "string"}, "days": {"type": "integer"}, "points": {"type": "integer"}, "first_seen": {"type": ["string", "null"]}, "latest": {"type": ["object", "null"]}, "change": {"type": "object", "properties": {"from": {"type": ["number", "null"]}, "to": {"type": ["number", "null"]}, "delta": {"type": ["number", "null"]}, "drivers": {"type": "array", "items": {"type": "object"}}, "comparable": {"type": "boolean"}, "model_versions": {"type": "array"}}, "additionalProperties": true}, "series": {"type": "array", "items": {"type": "object"}}}, "additionalProperties": true, "required": ["app_id", "storefront", "change"]}, "ObjectResponse": {"type": "object", "additionalProperties": true}}}}