Skip to main content

Unofficial Renpho Health API client for Python — pull body composition data from Renpho smart scales.

Project description

renpho-py — Renpho Health API client for Python

PyPI CI Python

Unofficial Renpho Health API client for Python. Pull body composition measurements from Renpho smart scales programmatically.

Unofficial. Not affiliated with, endorsed by, or supported by Renpho. Use at your own risk and in line with Renpho's terms of service.

renpho-py is an independently maintained continuation of the abandoned renpho-api (MIT). The import name is unchanged, so migrating is a one-line swap — pip install renpho-py and your existing from renpho import ... code keeps working. The underlying API was reverse-engineered; protocol details are based on RenphoGarminSync-CLI.

Installation

pip install renpho-py

For .env file support (recommended for CLI usage):

pip install "renpho-py[dotenv]"

Migrating from renpho-api? pip uninstall renpho-api && pip install renpho-py. No code changes — you still from renpho import RenphoClient.

CLI Usage

  1. Create a .env file (or export the variables):
RENPHO_EMAIL=your@email.com
RENPHO_PASSWORD=your_plain_text_password
  1. Run the CLI:
renpho

This will log in, discover your scales, fetch all measurements, print the 5 most recent, and save everything to renpho_data/ as JSON and CSV.

Environment variables

Variable Required Description
RENPHO_EMAIL Yes Your Renpho account email
RENPHO_PASSWORD Yes Your Renpho account password
RENPHO_DEBUG No Set to 1 to print API request/response details
RENPHO_OUTPUT_DIR No Output directory (default: renpho_data)

Library Usage

from renpho import RenphoClient

client = RenphoClient("user@example.com", "password")
client.login()

# Fetch all measurements in one call
measurements = client.get_all_measurements()

for m in measurements:
    print(m["weight"], m.get("bodyfat"), m.get("muscle"))

Step-by-step control

from renpho import RenphoClient, save_json, save_csv

client = RenphoClient("user@example.com", "password")
client.login()

# Get device/scale info
device_info = client.get_device_info()
scales = device_info["scale"]

# Fetch from a specific scale table
# Use get_body_composition_measurements() for scales with impedance sensors
# (body fat, muscle, etc.) — the server-side count is unreliable for these.
# Fall back to get_measurements() for weight-only scales.
table = scales[0]
measurements = client.get_body_composition_measurements(
    table_name=table["tableName"],
    user_id=client.user_id,
)
if not measurements:
    measurements = client.get_measurements(
        table_name=table["tableName"],
        user_id=client.user_id,
        total_count=table["count"],
    )

# Export
save_json(measurements, "my_data.json")
save_csv(measurements, "my_data.csv")

Multiple Renpho accounts on one email

Some users end up with two Renpho accounts under the same email — for example after the Google SSO migration created an orphan account, or after re-registering. Each account has its own user ID and its own measurement table, so the default get_all_measurements() will only return data from the account you log in to.

If you know the other account's user ID, pass it in:

measurements = client.get_all_measurements(
    extra_user_ids=["5975813831868809088"],
)

The library will probe every measurement table for that user ID, fetch matching records, and dedupe by record id so you get a single combined timeline.

How to find your other user ID:

Unfortunately there is no first-party API endpoint that lists "all accounts associated with this email" — Renpho treats accounts as independent even when emails collide. Options:

  1. Renpho support — email them and ask for your user ID(s) on file
  2. Inspect the iOS / Android app — sign in to the other account in the official app and look in Settings / Account / Help → Feedback pages (the user ID is sometimes visible there)
  3. Capture network traffic — proxy the official app through mitmproxy, sign in, and look at any request body containing userId (decrypt with the published AES-128 key — see the reverse-engineering write-up linked at the top of this README)

Once you have the ID, save it alongside your credentials and you won't need to discover it again.

Error handling

from renpho import RenphoClient, RenphoAPIError

client = RenphoClient("user@example.com", "wrong_password")
try:
    client.login()
except RenphoAPIError as e:
    print(f"API error: {e}")

Available Metrics

Each measurement dict can contain these fields (availability depends on your scale model):

Key Description Unit
weight Weight kg
bmi BMI
bodyfat Body Fat %
water Body Water %
muscle Muscle Mass %
bone Bone Mass %
bmr Basal Metabolic Rate kcal/day
visfat Visceral Fat level
subfat Subcutaneous Fat %
protein Protein %
bodyage Body Age years
sinew Lean Body Mass kg
fatFreeWeight Fat Free Weight kg
heartRate Heart Rate bpm
cardiacIndex Cardiac Index
bodyShape Body Shape

Project Structure

renpho-py/
├── pyproject.toml        # Package config & dependencies (dist name: renpho-py)
├── README.md
├── CHANGELOG.md
├── LICENSE               # MIT (original + current attribution)
├── NOTICE
├── renpho/               # import name — unchanged for drop-in migration
│   ├── __init__.py       # Public API exports
│   ├── py.typed          # PEP 561 typing marker
│   ├── client.py         # RenphoClient class
│   ├── cli.py            # CLI entry point
│   ├── constants.py      # API endpoints, device types, metrics
│   ├── crypto.py         # AES encryption/decryption
│   └── export.py         # JSON/CSV export helpers
├── tests/                # Unit tests
└── .github/workflows/    # CI + PyPI release automation (trusted publishing)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

renpho_py-1.1.0.tar.gz (20.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

renpho_py-1.1.0-py3-none-any.whl (16.1 kB view details)

Uploaded Python 3

File details

Details for the file renpho_py-1.1.0.tar.gz.

File metadata

  • Download URL: renpho_py-1.1.0.tar.gz
  • Upload date:
  • Size: 20.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for renpho_py-1.1.0.tar.gz
Algorithm Hash digest
SHA256 3dc959cd2d635921f27a227228ebc2d93562dd00f3d43fa02731eae03bd429d3
MD5 579b2fddcdebf6c718ba2d58bb2f5266
BLAKE2b-256 feff91f30912551e13245a19eb9503d7561e0bd0fc047e2ffbfad9015314dfcf

See more details on using hashes here.

Provenance

The following attestation bundles were made for renpho_py-1.1.0.tar.gz:

Publisher: release.yml on ChocoTonic/renpho-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file renpho_py-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: renpho_py-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 16.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for renpho_py-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 bfc5821f397c13ce4817b3cce088dd2f98a0bcc64b2010f4b538020c3398d16b
MD5 b7cb3d01d39b05334ddaab96aad1f378
BLAKE2b-256 e69ae18306910e88fa60c8262523edde955bad0b767af0471470b201f6751ea3

See more details on using hashes here.

Provenance

The following attestation bundles were made for renpho_py-1.1.0-py3-none-any.whl:

Publisher: release.yml on ChocoTonic/renpho-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page