Skip to main content

gplaydl

Download APKs from Google Play right from your terminal. One command gets you the base APK, split APKs (App Bundles), OBB expansion files and Play Asset Delivery packs.

gplaydl downloads through a Google account you add yourself in the Authenticator app. Your account stays private to you, and setup takes about two minutes.

Prefer a browser? Use gplaydl web, or view its source code.

Important: This project uses unofficial Google Play access. Google may flag, lock, or restrict accounts used with it. Please use a separate account and continue at your own risk.

  • Base APK, splits, OBB files and asset packs downloaded together by default
  • arm64, armv7, x86, x86_64 and Android TV builds, several in one command
  • Signs in with your own account, kept private to you and never shared
  • Device profiles rotated automatically, both for authentication and for old versions Google only serves to certain devices
  • Compressed transfers when Google Play offers them (often 30-40% smaller)
  • Every APK verified against the SHA-256 Google Play declares for it
  • Language splits on demand, and re-runs fetch only what is missing
  • Pure-Python protobuf decoding, no gpapi dependency
  • Live progress bars, plus search, info and list-splits for browsing

Installation

Requires Python 3.9 or newer.

pip install gplaydl

Or from source:

git clone https://github.com/rehmatworks/gplaydl.git && cd gplaydl
pip install .

First-time setup

You will need any Android phone for a couple of minutes, and a spare Google account to add.

  1. Install the gplaydl Authenticator app (source) on the phone. It is not on Google Play, so Android will ask you to allow the install.
  2. Sign in with a spare Google account. Prefer a throwaway over your main one: Google sometimes restricts accounts it sees on unofficial clients. The account stays private to you and is never shared with anyone.
  3. Open Link gplaydl in the app, then run this on your computer and type in the code it shows:
gplaydl link

Done. Every download now goes through your own account:

gplaydl download com.whatsapp

Your Google password and 2FA codes never leave the phone; the app uploads only the resulting Play token. You can remove an account in the app whenever you like, and if you skip gplaydl link, the first command that needs it will walk you through the same steps.

Quick start

gplaydl link                    # once, with the code from the app
gplaydl download com.whatsapp   # base APK + splits + OBB/asset packs

Commands

Every command takes -d/--dispenser to pick a dispenser and --arch for the device architecture.

link

Pairs this machine with the dispenser. Run it once, or again to re-link.

gplaydl link                              # asks for the code interactively
gplaydl link --code ABCD-EFGH             # or pass it directly
gplaydl link -d https://your.dispenser    # link to a self-hosted dispenser

The key lands in ~/.config/gplaydl/config.json. For containers and CI, set GPLAYDL_API_KEY instead of linking interactively.

If you added more than one account in the app, pass --email you@gmail.com on auth or download to use a specific one. Without it, gplaydl rotates through the accounts you added.

auth

Gets a Play token and caches it. You rarely need to run this yourself; the other commands fetch and refresh tokens on their own.

gplaydl auth                              # default (arm64)
gplaydl auth --arch armv7                 # older 32-bit devices
gplaydl auth --arch x86_64                # emulators / desktop
gplaydl auth --clear                      # forget all cached tokens

Tokens live in ~/.config/gplaydl/auth-{arch}.json and refresh automatically before they expire.

download

Fetches the base APK, every split APK, and any extra files unless you opt out.

gplaydl download com.whatsapp                # everything
gplaydl download com.whatsapp -o ./apks      # custom output directory
gplaydl download com.whatsapp -a armv7       # ARMv7 build
gplaydl download com.whatsapp -a arm64,armv7 # several architectures at once
gplaydl download org.videolan.vlc -a x86_64  # emulator / desktop build
gplaydl download com.google.android.katniss -a tv  # Android TV build
gplaydl download com.whatsapp -v 231205015   # specific version code
gplaydl download com.whatsapp -l de,fr,zh-CN # extra language splits
gplaydl download com.whatsapp --no-splits    # skip split APKs
gplaydl download com.whatsapp --no-extras    # skip OBB / asset packs
gplaydl download com.whatsapp --dm           # also fetch the .dm metadata

Downloads are verified: the base APK and every split are hashed while they stream in and checked against the SHA-256 that Google Play declares in the delivery response, so a truncated or corrupted file fails loudly instead of failing later at install time.

Re-runs are incremental. A file that already exists and matches its declared hash is skipped, so running the same command again with an extra architecture (-a arm64,armv7) or more languages (-l de,fr) downloads only the missing splits into the same directory. A corrupted file is noticed and fetched again.

--dm additionally fetches the DEX metadata file ({package}-{vc}.dm, a baseline profile plus vdex) that the Play Store installs alongside the base APK to speed up first launch. It is optional; append it to adb install-multiple after the APKs if you want it.

Old version codes are served by Google only to devices it considers compatible: 32-bit-only APKs are refused for 64-bit-only profiles, and Android 14+ profiles are not served APKs targeting very old SDKs. When that happens, gplaydl retries automatically with low-SDK multi-ABI device profiles until Google agrees to deliver.

Apps that are invisible to phone profiles altogether (Android TV exclusives like com.google.android.katniss, or apps limited to one ABI family) are found the same way: gplaydl rotates through one device of each kind, starting with TV and then each ABI family. Pass -a tv to skip straight to a TV profile, or run gplaydl auth --arch tv if you just want a TV token (~/.config/gplaydl/auth-tv.json).

Type Naming Example
Base APK {package}-{vc}.apk com.whatsapp-231205015.apk
Split APK {package}-{vc}-{split}.apk com.whatsapp-231205015-config.arm64_v8a.apk
OBB (main/patch) {type}.{vc}.{package}.obb main.20925.com.tencent.ig.obb
Asset pack {package}-{vc}-asset.apk com.tencent.ig-20925-asset.apk

Install a split build on a device by naming the app's own files, e.g. adb install-multiple com.whatsapp-231205015*.apk. (Avoid a bare *.apk when other APKs sit in the same directory: adb refuses sessions that mix packages or contain the same split twice.)

Want a single APK instead of splits? Google Play has no universal APK for App Bundle apps. Every client, including the Play Store itself, receives the base plus config splits and installs them as one session. The base APK alone will not run (its native libraries live in the config.<abi> split). If you truly need one file, merge the splits with a tool like APKEditor (APKEditor m -i ./apks); note the merged APK must be re-signed, so it will not receive updates on top of the Play-signed install.

info, search and list-splits

gplaydl info com.whatsapp                 # version, developer, rating, downloads
gplaydl search "file manager" --limit 5   # find apps by name
gplaydl list-splits com.whatsapp          # see splits without downloading

Multiple accounts and purchased apps

You can add several accounts in the app. By default gplaydl rotates through them; pass --email to pick one, which is also how you download apps tied to a specific account:

gplaydl download com.example.paid --email you@gmail.com

A word of caution before adding an account you care about: Google can rate-limit, lock, or restrict accounts it sees on unofficial clients. It is uncommon, but it happens, which is why a throwaway account is the safer choice.

Self-hosting

The dispenser is open source and runs anywhere Go and Postgres do. Host your own for a team or just for yourself:

  1. Follow the dispenser deployment guide.
  2. In the Authenticator app, point Settings → Server at your instance and add accounts.
  3. Link gplaydl against it: gplaydl link -d https://your.dispenser

Architecture support

Flag ABI Devices
arm64 (default) arm64-v8a Modern phones (2017+)
armv7 armeabi-v7a Older 32-bit phones
x86_64 x86_64 Emulators, Chromebooks, desktop
x86 x86 Older 32-bit emulators
tv armeabi-v7a Android TV / Google TV devices

Pass several at once to download with a comma: -a arm64,armv7. The base APK is shared where possible and per-architecture splits (or separate builds, for apps that publish one APK per ABI) land next to each other.

How it works

  1. Authenticate. The dispenser mints a Play token from one of your own accounts and hands it back, trying device profiles in turn until one is accepted.
  2. Look up. App metadata (version, size, split list) comes from Google Play's protobuf API.
  3. Purchase. Free apps are "purchased" to authorise the download; the delivery token Google returns is passed along to the delivery endpoint.
  4. Download. Base APK, splits, OBB files and asset packs stream in parallel from Google's CDN, using gzip-compressed transfers when offered.

Upgrading from 3.x

gplaydl 4 drops the shared community pool: downloads now go through a Google account you add yourself, kept private to you. Add an account in the Authenticator app and run gplaydl link once after upgrading. (Older 2.x releases borrowed anonymous tokens from Aurora Store; that path is gone.)

Related projects

License

MIT. See LICENSE.

Metadata

Release files for gplaydl 4.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for gplaydl 4.2.1
File Size Uploaded
gplaydl-4.2.1.tar.gz 68.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for gplaydl 4.2.1
File Interpreter ABI Platform
gplaydl-4.2.1-py3-none-any.whl Python 3 none any Details

Total release size: 193.0 kB

Release files / gplaydl-4.2.1.tar.gz

Download URL gplaydl-4.2.1.tar.gz
Size 68.2 kB
Tags Source
SHA-256 checksum
How to use checksums
fd773919f5b69669daa233f89aea4ad62964bd55593e3008a4836a433c232e14
BLAKE2b-256 checksum
How to use checksums
e7f8b9b6efeb72b6777a56e1c3030e63ba3c7ffa929466a93ac54e32951e29fa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 1, 2026.

Transparency log

Release files / gplaydl-4.2.1-py3-none-any.whl

Download URL gplaydl-4.2.1-py3-none-any.whl
Size 124.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8779f9cf7d6e6c90528d5e7b03e502447cea8fec4c869f23b55d721ccbac7145
BLAKE2b-256 checksum
How to use checksums
4429e22eb66481a862b178ef564bd1f9a972fe31e3357eebb2a5ce912afd01fc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 1, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

4.2.1 This release

2 release files

4.2.0

2 release files

4.1.0

2 release files

4.0.2

2 release files

4.0.1

2 release files

4.0.0

2 release files

3.0.1

2 release files

3.0.0

2 release files

2.1.7

2 release files

2.1.6

2 release files

2.1.5

2 release files

2.1.4

2 release files

2.1.3

2 release files

2.1.2

2 release files

2.1.0

2 release files

1.3.5

1 release file

1.3.4

2 release files

1.3.3

2 release files

1.3.2

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.0

1 release file

1.0.3

2 release files

1.0.2

1 release file

1.0.1

1 release file

1.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page