APIREST API v1

OpenLyst API

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

✓100% Free
✓No Auth Required
JSON Responses
CORS Enabled

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

Repository metadata and basic statistics. Use for repo name, icon, featured apps, total counts, and tempDownloadsOff flag.

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", "docan", ...]
  }
}
GET/api/v1/apps

List all apps. Optionally filter by status or platform.

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

Full details for one app, including all versions.

Path Parameters

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

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

All versions of an app, ordered 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

The latest version of an app only. 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

News and announcements. Optionally 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 identifier. Query parameter q is required. 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

All platforms that have at least one app, with app counts. Sorted by count descending.

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.