Skip to content

Instantly share code, notes, and snippets.

@oldnomad
Last active July 16, 2026 20:25
Show Gist options
  • Select an option

  • Save oldnomad/5d38a9ea9b1daf9d82fa4f655b9aebe8 to your computer and use it in GitHub Desktop.

Select an option

Save oldnomad/5d38a9ea9b1daf9d82fa4f655b9aebe8 to your computer and use it in GitHub Desktop.
RuStore API

RuStore API for application installation

  • URL for human-readable application info page has format https://www.rustore.ru/catalog/app/{packageName}.
  • Application info as a JSON object is available at URL https://backapi.rustore.ru/applicationData/overallInfo/{packageName}.
  • APK reference URL is https://backapi.rustore.ru/applicationData/download-link (version 1) or https://backapi.rustore.ru/applicationData/v2/download-link (version 2). It accepts only POST requests (see below).

Typical workflow is:

  1. Retrieve application info. This is necessary to determine application ID (appId).
  2. Retrieve download URLs. As far as I can see, only the latest version can be retrieved.
  3. Use download URL to download the APK.

Common request headers

  • Starting from July 2026, all requests fail unless non-standard request header ruStoreVerCode is specified. Expected value is a RuStore application version (number). Currently minimal number that works is 247, however, it's possible that in future API will require higher numbers. Real version numbers are at the moment in the 11000-12000 range.
  • Some requests fail unless Content-Type header is properly specified.

Application info

Application info JSON object has following fields:

  • code: contains string OK (on success).
  • message: contains string OK (on success).
  • timestamp: ISO-8601 timestamp (seems to be time of object retrieval).
  • body: application info subobject, containing:
    • appId: numeric application ID (required for APK retrieval).
    • packageName: package name, as in the URL.
    • appName: human-readable application name.
    • category, categories: main application category and an array of all application categories.
    • companyName: human-readable company name.
    • shortDescription: human-readable short application description (one line).
    • fullDescription: human-readable application description (may contain "\n").
    • fileSize: expected APK size?
    • versionName: human-readable version string.
    • versionCode: numeric version number (sequential?).
    • minSdkVersion, targetSdkVersion, maxSdkVersion: numeric Android SDK version limitations.
    • whatsNew: human-readable "What's New?" section (may contain "\n").
    • iconUrl: full URL to application icon (PNG?).
    • fileUrls: an array of screenshots (and other references?). Each element is an object containing:
      • fileUrl: full URL to screenshot (PNG?).
      • ordinal: numeric ordinal number.
      • type: resource type ("SCREENSHOT" for screenshots).
      • orientation: image orientation ("PORTRAIT" for portrait).
    • appType: ??? (I've seen "MAIN").
    • website: full URL to application home page.
    • signature: ??? (some sort of hash).
    • privacyDataCategories: ??? (an array).
    • adaptedToTablets: boolean flag (?).
    • companyLegalForm: ??? (I've seen "ENTITY").
    • downloads: numeric ??? (seems to be an approximate number of downloads).
    • price: numeric (?).
    • purchased: ??? (I've seen null).
    • appVerUpdatedAt: ISO-8601 timestamp.
    • inAppUpdatePriority: numeric (?).
    • banner: ??? (I've seen null).
    • aggregatorInfo: ??? (I've seen null).
    • video: ??? (I've seen null).
    • publicCompanyId: ??? (string).
    • createdAt: ISO-8601 timestamp (no timezone).
    • updatedAt: ISO-8601 timestamp (no timezone).
    • activeVerCode: numeric (seems to be the same as versionCode).
    • migrationGuideLink: ??? (I've seen null).
    • labelIds: ??? (array).
    • ageRestriction: an object containing:
      • category: string (I've seen "0+").
      • name: human-readable string corresponding to category.
      • description: human-readable string containing category description.
      • imageUrl: full URL to category icon (SVG).
    • markings: ??? (array).
    • seoTags: ??? (array).

APK URL retrieval (version 1)

Request

  • The request must use method POST to URL https://backapi.rustore.ru/applicationData/download-link.
  • The request must include header Content-Type: application/json; charset=utf-8.
  • The request body is a JSON object containing:
    • appId: numeric application ID (see application info above).
    • firstInstall: boolean true.

Response

  • The response is a JSON object containing:
    • code: contains string OK (on success).
    • message: contains string OK (on success).
    • timestamp: ISO-8601 timestamp (seems to be time of object retrieval).
    • body: APK reference subobject, containing:
      • appId: numeric application ID.
      • apkUrl: full URL to the APK.
      • versionCode: numeric version number (see application info above).

The APK can be downloaded from the URL provided in body.apkUrl.

APK URL retrieval (version 2)

It seems that the main reason for version 2 is to allow split APKs.

Request

  • The request must use method POST to URL https://backapi.rustore.ru/applicationData/v2/download-link.
  • The request must include header Content-Type: application/json; charset=utf-8.
  • The request body is a JSON object containing:
    • appId: numeric application ID (see application info above).
    • firstInstall: boolean true.
    • screenDensity: integer (is it DPI?).
    • sdkVersion: integer (is it android.os.Build.VERSION.SDK_INT or android.os.Build.VERSION.SDK_INT_FULL?).
    • withoutSplits: boolean flag forbidding split APK. If true, you get only plain APK, otherwise you can get a split APK if there's one.
    • supportedAbis: array of supported ABIs (see android.os.Build.SUPPORTED_ABIS).

Response

  • The response is a JSON object containing:
    • code: contains string OK (on success).
    • message: contains error string, or null on success.
    • timestamp: ISO-8601 timestamp (seems to be time of object retrieval).
    • body: APK reference subobject, containing:
      • appId: numeric application ID.
      • versionCode: numeric version number (see application info above).
      • versionId: numeric version ID ???.
      • downloadUrls: array containing URL subobjects:
        • url: APK download URL.
        • size: APK size in bytes.
        • hash: hash of some kind, hexadecimal 8 bytes ???.
      • preApproveInfo: subobject:
        • label: string ???
        • locale: locale string ???
      • signature: string hash of some kind, hexadecimal 32 bytes ???.

The APK (or APKs in case of split APK) can be downloaded from URLs provided in body.downloadUrl[*].url. For split APK there may be more than one URL.

@oldnomad

oldnomad commented Jun 8, 2026

Copy link
Copy Markdown
Author

does API support downloading any arbitrary version of the application?

As far as I understand, this method allows only the latest version. Perhaps there is some other route, but this is not an official public API, so the only way to find is to experiment.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment