HighGrabber
Bulk-download from Hightail Spaces receive
links. Give it a URL, a list of URLs, or a messy document with links buried
in prose — HighGrabber finds them, logs you in once via your browser, and
pulls every file to a destination you choose (auto-unzipping by default).
Works on macOS, Windows, and Linux.
Why
Hightail's web UI lets you download files one space at a time, serially, through the browser. If a friend shares fifty concert archives, clicking through fifty tabs and drag-extracting fifty ZIPs is a long afternoon. HighGrabber does it in one command.
It handles the two annoying parts of automating Hightail:
- Login is gated by a WAF + CAPTCHA, so scripted HTTP login won't work. HighGrabber opens a real Chromium window the first time, you sign in once, and it reuses the session cookie on every run afterward.
- Hightail rate-limits aggressive clients by returning
HTTP 200with an empty body. HighGrabber detects this, backs off exponentially, and resumes partial downloads viaRangeheaders.
Install
Requires Python 3.10+.
With pipx (recommended)
pipx install highgrabber
highgrabber doctor # downloads the browser used for login
Prefer to pin to a specific version? pipx install highgrabber==0.1.1.
With uv
uv tool install highgrabber
highgrabber doctor
From source (or a branch)
pipx install git+https://github.com/auxren/HighGrabber.git
highgrabber doctor
highgrabber doctor installs Playwright's Chromium into the right virtual
environment and verifies your session is good. Run it once after install
and any time you see a browser-related error.
Quickstart
# One URL
highgrabber https://spaces.hightail.com/receive/u3l28vnWZd -d ~/Downloads/show
# Many URLs from a file (prose is fine; it finds the links)
highgrabber message.txt -d ~/Downloads/shows
# Piped in
pbpaste | highgrabber -d ~/Downloads/shows
# Multiple inputs at once
highgrabber url1 url2 file.txt -d ~/Downloads/shows
The first run opens a Chromium window for you to log in to Hightail. Once
the session is saved (~/.config/HighGrabber/storage_state.json on Linux,
~/Library/Application Support/HighGrabber/ on macOS,
%APPDATA%\HighGrabber\ on Windows), subsequent runs are fully silent.
Usage
highgrabber [download] [INPUTS...] [options]
highgrabber login [--email EMAIL] [--save-password]
highgrabber logout [--forget-password --email EMAIL]
Inputs
Each input is one of:
- a full Hightail URL (
https://spaces.hightail.com/receive/<slug>) - a path to any text file — HighGrabber extracts every Hightail link found anywhere in it, so forwarded emails, chat exports, and Notes pages all work
-to read from stdin
Slugs are de-duplicated across all inputs in order.
Options (download)
| flag | default | description |
|---|---|---|
-d, --dest PATH |
cwd | where to save files |
-c, --concurrency N |
2 |
parallel file downloads. Higher than 3 is usually rate-limited. |
--email EMAIL |
prompt | Hightail email (used for keychain lookup) |
--save-password |
off | save password to the system keychain on first login |
--no-extract |
off | keep ZIPs intact instead of auto-extracting |
--delete-zips-after |
off | delete each ZIP after successful extraction |
Authentication
By default, HighGrabber uses the system keychain (macOS Keychain, Windows
Credential Manager, or Secret Service on Linux) via the keyring package.
highgrabber login --email you@example.com --save-passwordstores your password once. Subsequent logins auto-fill the form; you only touch the browser if Hightail shows a CAPTCHA.highgrabber logoutremoves the cached session; add--forget-passwordto also delete the keychain entry.- A valid session lasts as long as Hightail's cookie does (usually weeks). If it expires mid-run, HighGrabber opens the browser again automatically and resumes.
How it works
HighGrabber hits three internal Hightail endpoints that the Spaces web app uses:
| endpoint | purpose |
|---|---|
GET api.spaces.hightail.com/api/v1/spaces/url/<slug>?status=SEND |
resolve a receive/ slug to an internal space id |
GET api.spaces.hightail.com/api/v1/files/<space_id>/untagged |
list files in that space |
GET download.spaces.hightail.com/api/v1/download/<sp>/<fi>/<fv>/<name> |
stream one file (supports Range resume) |
Authentication is a sessionId cookie on .hightail.com. HighGrabber gets
it by letting you log in through a real browser (Playwright-managed
Chromium), then snapshots the cookie jar to disk.
Concurrency is 2 by default. Push it higher only if you have fewer, smaller
files; Hightail's rate limiter triggers reliably around 3+ parallel streams
of large archives, and the symptom is HTTP 200 with an empty body.
Troubleshooting
no valid cached session / session expired prompts — run
highgrabber login. Normal on a fresh install or after a long break. If
you've been signed out because you logged in to Hightail from somewhere
else (including another HighGrabber machine), Hightail rotates your
session cookie server-side, so running login again is the fix.
The browser window closes immediately / login times out — the window
waits 5 minutes for a successful login. If Hightail shows a CAPTCHA, solve
it and click Sign In; the window closes as soon as the session cookie
lands. If nothing appears at all, run highgrabber doctor to check that
Chromium is installed.
Executable doesn't exist / Playwright browser errors — run
highgrabber doctor. It installs Chromium into the right environment.
The older python -m playwright install chromium pattern only works if
you installed HighGrabber into your system Python, not via pipx/uv.
Downloads fail with got=0 of N or HTTP 307 redirects — you're
being rate-limited by Hightail. HighGrabber already backs off
(15 s / 60 s / 3 min / 5 min), but if it gives up:
- Lower
--concurrencyto1. - Wait 10–15 minutes, then re-run the same command. Partial downloads
resume via HTTP
Rangeso nothing's lost. - If it persists for hours, your IP may be temporarily flagged; switching network (e.g. VPN on/off) usually clears it.
Wrong keychain password / authentication loop — the keyring has a stale password. Fix:
highgrabber logout --forget-password --email you@example.com
highgrabber login --email you@example.com --save-password
macOS: keychain access denied — the macOS Keychain prompt defaults
to "Allow Always" once you approve. If you clicked Deny, follow the
keychain-reset recipe above.
Disk full mid-batch — partial files stay on disk; free space, re-run the same command, and downloads resume from the last byte.
Corporate proxy — HighGrabber uses httpx, which respects standard env vars:
HTTPS_PROXY=http://proxy.corp:8080 highgrabber <urls>
Windows: Chromium blocked by antivirus — some AV products quarantine
Playwright's bundled Chrome Headless Shell. Allow
%LOCALAPPDATA%\ms-playwright\ in your AV, then run
highgrabber doctor again.
A space returns 404 / "unavailable" — Hightail expired or removed that upload. It's per-space; other links in the same run continue.
I want to see what would happen without actually downloading —
highgrabber --dry-run <urls> prints every file and its size, then exits.
Ethics & Terms
HighGrabber only fetches files you already have legitimate access to via
receive/<slug> links you were sent. It authenticates as you with your
credentials and respects Hightail's per-session cookie model. You are
responsible for your usage under Hightail's Terms of Service.
License
MIT. See LICENSE.
Metadata
Release files for highgrabber 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| highgrabber-0.1.2.tar.gz | 17.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| highgrabber-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 36.6 kB
Release files / highgrabber-0.1.2.tar.gz
| Download URL | highgrabber-0.1.2.tar.gz |
|---|---|
| Size | 17.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2bd216275843fe443db148710e484139e76921c872565edea79f695013742a4a
|
|
BLAKE2b-256 checksum How to use checksums |
5fc453f9f0ef3eae3d3b87ec995d42323ddda0f308eed9af032048ec0d6adbf8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Apr 19, 2026.
Transparency logRelease files / highgrabber-0.1.2-py3-none-any.whl
| Download URL | highgrabber-0.1.2-py3-none-any.whl |
|---|---|
| Size | 19.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
45e9d2ab559f5a6a771b1680740d716df5d2575c9b77b84b150618231777ec8a
|
|
BLAKE2b-256 checksum How to use checksums |
ec9c8a96873fc2df43776958c15a1d145818816a793694996d92f352b0d38f21
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Apr 19, 2026.
Transparency log