OpenLyst API

Access OpenLyst app and release data programmatically. Free to use, no authentication required.

Base URL

All API requests should be made to this URL

https://openlyst.ink/api/v1

How the API Works

Response format, parameters, and error codes

Response format

Successful responses are JSON with success: true, a data field (array or object), and often language and count. Add ?lang=en|zh|ru to any request for localized strings (default: en).

// Success
{ "success": true, "language": "en", "data": ... }

// Error (400, 404, 500)
{ "success": false, "error": "message" }

Error Handling

Understanding API error responses

  • 400 — Returned when required parameters are missing.
  • 404 — Returned when the requested resource doesn't exist.
  • 500 — Returned when an internal error occurs.

Quick Start

Get started with a simple example

const response = await fetch('https://openlyst.ink/api/v1/apps');
const data = await response.json();
console.log(data.data);

API Endpoints

Complete reference for all available endpoints

GET/api/v1/repo

Get repository info: name, icon, featured apps, total counts, and download status.

Query Parameters

NamerequiredDescription
langDefaultContent language (en | zh | ru)

Example Response

{
  "success": true,
  "language": "en",
  "data": {
    "name": "OpenLyst",
    "subtitle": "...",
    "totalApps": 6,
    "totalNews": 5,
    "tempDownloadsOff": false,
    "featuredApps": ["doudou", "finar", ...]
  }
}
GET/api/v1/apps

List all apps. Filter by status or platform if needed.

Query Parameters

NamerequiredDescription
filterDefaultLimit to active or deprecated apps (active | deprecated)
platformDefaultOnly apps that support this platform (e.g. iOS, Android, macOS)
langDefaultContent language (en | zh | ru)

Example Response

{
  "success": true,
  "count": 6,
  "language": "en",
  "data": [
    {
      "name": "Doudou",
      "slug": "doudou",
      "subtitle": "Music player for self-hosted services",
      "platforms": ["iOS", "macOS", "Windows", "Linux", "Android"],
      "versions": [...]
    }
  ]
}
GET/api/v1/apps/:slug

Get full app details including all versions.

Path Parameters

NamerequiredDescription
slugrequiredApp slug or bundle identifier (e.g. doudou, finar)

Query Parameters

NamerequiredDescription
langDefaultContent language (en | zh | ru)

Example Response

{
  "success": true,
  "language": "en",
  "data": {
    "name": "Doudou",
    "slug": "doudou",
    "bundleIdentifier": "doudou",
    "applicationId": "gitlab.openlyst.doudou",
    "subtitle": "Music player for self-hosted services",
    "localizedDescription": "...",
    "iconURL": "https://...",
    "platforms": ["iOS", "macOS", ...],
    "versions": [{ "version": "14.0.0", "date": "2026-02-16", ... }]
  }
}
GET/api/v1/apps/:slug/versions

Get all versions of an app, newest first.

Path Parameters

NamerequiredDescription
slugrequiredApp slug or bundle identifier (e.g. doudou)

Query Parameters

NamerequiredDescription
langDefaultContent language (en | zh | ru)

Example Response

{
  "success": true,
  "language": "en",
  "appName": "Doudou",
  "count": 12,
  "data": [
    { "version": "14.0.0", "date": "2026-02-16", "platforms": [...], "downloads": {...} },
    { "version": "13.0.0", ... }
  ]
}
GET/api/v1/apps/:slug/latest

Get the latest version of an app. Returns 404 if no versions exist.

Path Parameters

NamerequiredDescription
slugrequiredApp slug or bundle identifier (e.g. doudou)

Query Parameters

NamerequiredDescription
langDefaultContent language (en | zh | ru)

Example Response

{
  "success": true,
  "language": "en",
  "appName": "Doudou",
  "appSlug": "doudou",
  "data": {
    "version": "14.0.0",
    "date": "2026-02-16",
    "platforms": ["iOS", "macOS", "Windows", "Linux", "Android"],
    "downloads": { "iOS": "https://...", "Android": { "apk": "https://..." }, ... }
  }
}
GET/api/v1/news

Get news and announcements. Filter by app or limit count.

Query Parameters

NamerequiredDescription
limitDefaultMax number of items to return (positive integer)
appIdDefaultOnly news for this app (bundle ID) (e.g. doudou)
langDefaultContent language (en | zh | ru)

Example Response

{
  "success": true,
  "language": "en",
  "count": 5,
  "data": [
    {
      "identifier": "...",
      "title": "New release",
      "caption": "...",
      "date": "2026-02-16",
      "appID": "doudou"
    }
  ]
}
GET/api/v1/search

Search apps by name, subtitle, description, or bundle ID. Results include relevanceScore.

Query Parameters

NamerequiredDescription
qrequiredSearch term (any string)
langDefaultContent language (en | zh | ru)

Example Response

{
  "success": true,
  "query": "music",
  "language": "en",
  "count": 1,
  "data": [
    {
      "name": "Doudou",
      "slug": "doudou",
      "subtitle": "Music player for self-hosted services",
      "relevanceScore": 11
    }
  ]
}
GET/api/v1/platforms

Get all platforms with at least one app, sorted by app count.

Query Parameters

NamerequiredDescription
langDefaultContent language (en | zh | ru)

Example Response

{
  "success": true,
  "language": "en",
  "count": 6,
  "data": [
    { "name": "Android", "appCount": 6 },
    { "name": "iOS", "appCount": 5 },
    { "name": "macOS", "appCount": 5 }
  ]
}

Download Structure

Understanding the platform-specific download formats

The downloads field in version objects contains platform-specific download URLs. Different platforms support different installer types and architectures.

Repository flag: tempDownloadsOffThe repo endpoint (GET /api/v1/repo) may include tempDownloadsOff: true. When true, clients should hide or disable download UI and show an appropriate message (e.g. that hosted builds are temporarily unavailable).

Rate Limits & Usage

Fair usage guidelines

Currently no rate limits are enforced. Please use responsibly.

No authentication or API keys required to access any endpoint.