Skip to main content

GPMC

Google Photos Mobile Client based on the reverse-engineered mobile API. “Mobile” refers to the API it uses, not the platforms it runs on—GPMC is a cross-platform Python library and CLI.


CLI Demo

cli demo

Features

  • Unlimited uploads in original quality (can be disabled).
  • Use as a CLI tool or Python library.
  • Skips files already present in your account (based on hash check).
  • Optional filename-based duplicate check (--skip-existing-filenames) to prevent re-uploading files with modified EXIF metadata if the filename already exists in the destination.
  • Upload individual files or entire directories, with optional recursive scanning.
  • Album creation based on directory structure or custom album name.
  • Real-time progress tracking.
  • Configurable threads for faster uploads (default: 1).

If you'd prefer a GUI client, use https://github.com/xob0t/gotohp

Installation

Run the command:

pip install --upgrade gpmc

Example Usage

Python Client

from gpmc import Client

path = "/path/to/media_file.jpg" # file or dir path
auth_data = "androidId=216e583113f43c75&app=com.google.android.app..."


client = Client(auth_data=auth_data)
output = client.upload(target=path, show_progress=True)

print(output)

# {"/absolute/path/to/media_file.jpg": "google_photos_media_key"}

CLI

gpmc "/path/to/media_file.jpg" --progress --auth_data "androidId=216e583113f43c75&app=com.google.android.app..."

For programmatic consumers, --json-progress writes one versioned JSON object per line (NDJSON) to stderr while keeping the final result on stdout:

gpmc "/path/to/media_file.jpg" --json-progress 2>progress.ndjson

Each event has a stable discriminator and version, for example:

{"version":1,"type":"progress","operation":"upload","phase":"uploading","path":"/path/to/media_file.jpg","filename":"media_file.jpg","bytes_completed":1048576,"bytes_total":8388608}
usage: gpmc [-h] [--auth_data AUTH_DATA] [--album ALBUM] [--proxy PROXY] [--progress] [--recursive] [--threads THREADS] [--force-upload] [--delete-from-host] [--use-quota] [--saver] [--timeout TIMEOUT]
            [--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}] [--filter FILTER] [--exclude] [--regex] [--ignore-case] [--match-path]
            path

Google Photos mobile client.

positional arguments:
  path                  Path to the file or directory to upload.

options:
  -h, --help            show this help message and exit
  --auth_data AUTH_DATA
                        Google auth data for authentication. If not provided, `GP_AUTH_DATA` env variable will be used.
  --album ALBUM         Add uploaded media to an album with given name. If set to 'AUTO', albums will be created based on the immediate parent directory of each file.
                        Example for using 'AUTO':
                        When uploading '/foo':
                        '/foo/image1.jpg' goes to 'foo'
                        '/foo/bar/image2.jpg' goes to 'bar'
                        '/foo/bar/foo/image3.jpg' goes to 'foo' (distinct from the first 'foo' album)
  --proxy PROXY         Proxy to use. Format: `protocol://username:password@host:port`
  --progress            Display upload progress.
  --recursive           Scan the directory recursively.
  --threads THREADS     Number of threads to run uploads with. Defaults to 1.
  --force-upload        Upload files regardless of their presence in Google Photos (determined by hash).
  --delete-from-host    Delete uploaded files from source path.
  --use-quota           Uploaded files will count against your Google Photos storage quota.
  --saver               Upload files in storage saver quality.
  --timeout TIMEOUT     Requests timeout, seconds. Defaults to 60.
  --skip-existing-filenames
                        Synchronize local media cache and skip uploading files
                        with duplicate filenames.
  --log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}
                        Set the logging level (default: INFO)


File Filter Options:
  --filter FILTER       Filter expression.
  --exclude             Exclude files matching the filter.
  --regex               Use regex for filtering.
  --ignore-case         Perform case-insensitive matching.
  --match-path          Check for matches in the path, not just the filename.

auth_data? Where Do I Get Mine?

You only need to do this once.

Option 1 - ReVanced. No root required

  1. Install Google Photos ReVanced on your device.

  2. Connect the device to your PC via ADB.

  3. Open the terminal on your PC and execute

    Windows

    adb logcat | FINDSTR "auth%2Fphotos.native"
    

    Linux/Mac

    adb logcat | grep "auth%2Fphotos.native"
    
  4. If you are already using ReVanced - remove Google Account from GmsCore.

  5. Open Google Photos ReVanced on your device and log into your account.

  6. One or more identical GmsCore logs should appear in the terminal.

  7. Copy text from androidId= to the end of the line from any log.

  8. That's it! 🎉

Option 2 - Official apk. Root required

Click to expand
  1. Get a rooted android device or an emulator. Recommended Android versions 9-13

  2. Connect the device to your PC via ADB.

  3. Install HTTP Toolkit

  4. In HTTP Toolkit, select Intercept - Android Device via ADB. Filter traffic with

    contains(https://www.googleapis.com/auth/photos.native)
    

    Or if you have an older version of Google Photos, try

    contains(www.googleapis.com%2Fauth%2Fplus.photos.readwrite)
    
  5. Open Google Photos app and login with your account.

  6. A single request should appear.
    Copy request body as text.
    http_toolkit_tip

  7. Now you've got yourself your auth_data! 🎉

Troubleshooting

  • No Auth Request Intercepted
    1. Log out of your Google account.
    2. Log in again.
    3. Try Android App via Frida interception method in HTTP Toolkit.

Tools based on gpmc

My Other Google Photos Scripts And Tools

Metadata

Release files for gpmc 0.9.0

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

Source distribution (sdist)

Source distribution for gpmc 0.9.0
File Size Uploaded Provenance
gpmc-0.9.0.tar.gz 40.4 kB With provenance Details

Built distribution (wheel)

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

Total release size: 81.0 kB

Release files / gpmc-0.9.0.tar.gz

Download URL gpmc-0.9.0.tar.gz
Size 40.4 kB
Tags Source
SHA-256 checksum
How to use checksums
f5014b8bba5f6ec4085fc05b81102a0f538b1b7b78d4c495937203ca4b0080c5
BLAKE2b-256 checksum
How to use checksums
aeaea57b8a604ed55998f647c1fef61c9fa8312839b5c9745f6d86050cae1e29
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

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 Jul 16, 2026.

Transparency log

Release files / gpmc-0.9.0-py3-none-any.whl

Download URL gpmc-0.9.0-py3-none-any.whl
Size 40.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
19c148d41cab331115575854c1b5c2236f62d2619bfb08b34c5cb0a48bdca79c
BLAKE2b-256 checksum
How to use checksums
731efb1d2f07399a4d0322897f9aaf2b85f69e197b754e4032339876278918e4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

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 Jul 16, 2026.

Transparency log

Security for gpmc 0.9.0

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.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for gpmc-0.9.0.tar.gz

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 Jul 16, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.9.0 This release

2 release files Full provenance

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