{"name":"AppTierList API","schema_version":"1.0","base_url":"https://apptierlist.com/api/v1","description":"Ranked iOS app lists, one per product type, computed from public App Store data and a model judging each app against the type's definition. Read-only. Nothing is purchasable.","endpoints":{"GET /api/v1/lists":"every active list (add ?status=draft|archived|all)","GET /api/v1/lists/{slug}":"one list: members in tier order with score components, status, confidence, per-store ranks; scoring method; subtypes","GET /api/v1/apps/{slug|app_store_id}":"one app: App Store facts, editorial summary, every membership with tier/score/status/confidence, claim status, recent history","GET /api/v1/apps/{slug|app_store_id}/explain":"why an app sits where it does: components, ranks, every judge verdict (current and historical), history","GET /api/v1/search?q=":"lists (by name/definition) and apps (by name) matching q; ?limit= up to 50","GET /api/v1/changes?since=&list=&kind=&limit=&cursor=":"append-only history of memberships, tiers, lists and apps; newest first; page with next_cursor","GET /api/v1/health":"job state, provider cool-downs, invariant status, counts; not cached","GET /api/v1/openapi.json":"OpenAPI 3.1 description of the above","POST /mcp":"the same records as MCP tools (Streamable HTTP, JSON-RPC 2.0)","GET /llms.txt":"human/LLM-readable map of the site; /llms-full.txt has every active list with its members"},"identifiers":{"list_slug":"immutable; the URL and API path of a list never change, including after archive","app_slug":"immutable; derived from the App Store name at discovery plus the app_store_id","app_store_id":"Apple's numeric id; accepted wherever an app slug is"},"semantics":{"timestamps":"ISO-8601 UTC","null":"unknown or not applicable; keys are never omitted","list.status":"draft = being searched and judged, no page yet; active = published; archived = kept for reference, no longer recommended (the page still serves the last ranking)","membership.status":"active = the judge kept the app at its current listing; contested = the judge's evaluation budget ran out without a settled verdict, the app stays with this flag","membership.confidence":"normal = at least 10 App Store ratings and at least one search-rank observation for this list; provisional otherwise","app.stale":"true when the app's last successful refresh is older than 30 days or the App Store no longer returns it","score":"plain average of four 0-100 components (rating, votes, rank, recency); see list.scoring; the same app has an independent score and position in every list it belongs to","tier":"S/A/B/C/D/F over the top 40 of a list by score; null beyond the top 40","data_as_of":"the newest underlying timestamp behind the record; generated_at is when the record was built","freshness":"apps are re-read from the App Store on a 15-day rotation; each list's search ranks every ~14 days; scores daily; the judge daily"},"caching":"records carry Cache-Control max-age=3600; health is no-store; an ETag-free design, poll /api/v1/changes?since= instead of re-reading lists","rate_limits":"none enforced; be reasonable, prefer /changes over polling every list","source":"https://github.com/ekremustun/apptierlist"}