A Python script to download and archive your Things from Thingiverse, including all files, images, metadata, comments, and license information.
- Download a single Thing by ID
- Download all published Things by a user
- Incremental updates - only downloads new/changed content
- Creates organized directory structure for each Thing:
files/- All downloadable STL, SCAD, and other filesimages/- All images (display/large size preferred)README.md- Formatted metadata, description, instructions, ancestors, and remixesCOMMENTS.md- All user commentsLICENSE.md- License information with summarymetadata.json- Raw API response data
- Throttling to avoid API rate limits
- Force re-download option
Clone the repository and install:
git clone https://github.com/tbuser/archiveallthethings.git
cd archiveallthethings
pip install -e .This installs the archiveallthethings command.
- Python 3.6+
requestslibrary (installed automatically)
To use this script, you need an API token from Thingiverse.
- Go to https://www.thingiverse.com/developers
- Log in with your Thingiverse account
- Click "Create an App" or go to https://www.thingiverse.com/apps/create
- Fill in the application details:
- App Name: Choose any name (e.g., "My Thing Downloader")
- Description: Brief description of your use case
- App URL: Can be
http://localhostfor personal use - Callback URL: Can be
http://localhost/callbackfor personal use
- Click "Create App"
After creating your app:
- Go to your app's settings page
- Find the "App Token" (also called Access Token)
- Copy this token - it's a long alphanumeric string
You can provide your token in two ways:
Option A: Environment Variable (Recommended)
export THINGIVERSE_TOKEN="your_token_here"Add this to your ~/.bashrc or ~/.zshrc to make it permanent.
Option B: Command-Line Argument
archiveallthethings --token your_token_here --thing 161161Important: Keep your token private. Never commit it to version control or share it publicly.
After installation, use the archiveallthethings command (or python archiveallthethings.py if running directly).
archiveallthethings --thing 161161archiveallthethings --user tbuserarchiveallthethings --thing 161161 --output ./my_downloadsBy default, the script skips Things that haven't changed since the last download. Use --force to re-download everything:
archiveallthethings --thing 161161 --forceWhen downloading multiple Things, adjust the delay between downloads (default: 1 second):
archiveallthethings --user tbuser --throttle 2.0usage: archiveallthethings [-h] (--thing ID | --user USERNAME) [--output DIR]
[--throttle SECONDS] [--force] [--token TOKEN]
Download Things from Thingiverse
options:
-h, --help show this help message and exit
--thing ID, -t ID Download a specific thing by ID
--user USERNAME, -u USERNAME
Download all published things by a user
--output DIR, -o DIR Output directory (default: current directory)
--throttle SECONDS Seconds to wait between downloads (default: 1.0)
--force, -f Force re-download even if thing is unchanged
--token TOKEN Thingiverse API token (or set THINGIVERSE_TOKEN env var)
For each Thing downloaded, the script creates a directory structure like:
thing_name/
├── README.md # Metadata, description, instructions, links
├── COMMENTS.md # User comments
├── LICENSE.md # License information
├── metadata.json # Raw API data
├── files/
│ ├── model.stl
│ ├── model.scad
│ └── ...
└── images/
├── main_image.jpg
├── detail_1.jpg
└── ...
- Thing name and ID
- Creator information
- Dates (added, modified)
- License
- Statistics (likes, downloads, views, makes, remixes, comments)
- Tags
- Description
- Instructions
- File list with sizes
- Image gallery
- Ancestors (things this was remixed from)
- Remixes (things remixed from this)
The script tracks what has been downloaded using the modified timestamp from Thingiverse:
- First run: Downloads everything
- Subsequent runs:
- Checks if Thing has been modified since last download
- Skips unchanged Things entirely
- For changed Things, skips files/images that already exist locally
- With
--force: Re-downloads everything regardless of timestamps
This makes it efficient to periodically sync your local archive with Thingiverse.
Download a specific Thing:
archiveallthethings -t 161161 -o ./archiveArchive all Things from a user:
archiveallthethings -u tbuser -o ./tbuser_archive --throttle 1.5Update existing archive (only downloads changes):
archiveallthethings -u tbuser -o ./tbuser_archiveForce full re-download:
archiveallthethings -t 161161 -o ./archive --forceThingiverse has API rate limits. The script includes:
- Configurable throttle delay between Thing downloads (default: 1 second)
- Automatic throttling during user thing list pagination
If you encounter rate limit errors (HTTP 429), increase the --throttle value.
Please respect Thingiverse's Terms of Service and the licenses of the Things you download. DBAD.