I’ve been using DeviantArt for over a decade to find wallpapers, icons, Rainmeter setups, vector graphics, and generally as a source of inspiration. It definitely deserves its name, and if you're not careful, you will find yourself in the weirdest rabbit holes of people's fantasies. User, be warned.
In addition to that issue, there is one other that is currently a plague on the site. AI-generated content is everywhere, and there is no easy way to filter it out.
DeviantArt was founded in 2000 and is one of the oldest homes for illustrators, photographers, digital painters, and all manner of creatives. It has reached 100 million users in 2025, so it’s not dead yet, but it did try to die. There was a bit of an exodus of users some 2 years ago when they decided unanimously to take users’ content for AI generation. After predictable backlash from users, they added a NoAI option when uploading that is set as default, but the site has still seen the loss of trust and started its slide towards obscurity. Hopefully, they will bring back filtering and categories and stop the bleed out. As it sits now, it is a hard site to recommend for daily usage, except that it allows for large image sizes, which is what I needed.
DeviantArt’s “Sta.sh” stash feature lets you draft, annotate, and store multimedia works in progress. It also offers API so you could automate the whole process.
Soooo I did.
Regardless of whether you’re uploading chapters of a webcomic or variations on an illustration, manually clicking through the “Submit” flow dozens of times can quickly eat into your time. That’s precisely why I built a Bulk Uploader for DeviantArt.
Python script automates the entire process of submitting images to Sta.sh, publishing them as deviations, and organizing them into folders—all in one go.
It obtains and stores your access token (so you don’t have to log in every time). But you will need to delete access_token.txt if you don’t use it for a day or so. That will make the script re-login and regenerate the tokens.
It will scan the root folder of the script for all .jpg, .jpeg, .png, and .gif files. The file name will be used as a template for generating Image titles and tags for e.g. illustration-Sun-lit-Forest_131_1_resized.jpg will be extracted, and a clean title (“Sun Lit forest”) with a number of source images (“131”) will be formatted as a caption, description, and tags automatically. This can be changed in the code.
It uses tqdm
to show you exactly how much of each file you have uploaded—no more wondering if your 20 MB PNG is stuck or just slow.
Once uploaded to Sta.sh, each image is immediately published to your gallery, optionally sorted into a specific folder.
Before starting, we need to get the API ID and key. To do so, log in to your DeviantArt Account and then go to https://www.deviantart.com/developers/apps. This is where you can register a new application.
Click "Register Your Application"
On the Applications & Keys page, locate and click the "Register Your Application" button or link. This will open a form to configure your application.
Title (Required): Enter a name for your application, e.g., "Image Uploader" or "Mosaic Uploader". This is a descriptive name for your app.
Description: Optionally, provide a brief description of your application, e.g., "Uploads mosaic images to DeviantArt Stash and publishes to gallery."
OAuth2 Grant Type: Select Authorization Code from the dropdown, as the script uses the Authorization Code Grant Type (grant_type=authorization_code in the script).
OAuth2 Redirect URI Whitelist (Required): Enter the exact redirect URI used in the script: http://localhost:3000/callback. Ensure it is entered exactly as shown, with no trailing slashes or additional paths. DeviantArt will verify the redirect_uri parameter against this whitelist during OAuth2 calls.
Download URL: Optionally, provide a link to your application’s download page or leave it blank if not applicable.
Original URLs Whitelist: Leave this blank unless your application uses the original_url API parameter (not used in the provided script).
Gallery Settings: Configure optional settings like "Featured," "Submit to Group," or "Disable comments" as desired. These are not directly relevant to the script but can be set based on your preferences.
Upload Preview: Optionally, upload a preview image for your application if required by DeviantArt.
Quick Start
Clone or copy the script into your working directory.
Fill in your credentials
CLIENT_ID = "YOUR_CLIENT_ID"
CLIENT_SECRET = "YOUR_CLIENT_SECRET"
FOLDER_ID = "YOUR_FOLDER_ID" # or None for default gallery
Install needed Python packages
pip install requests tqdm requests-toolbelt
Drop your images into the same folder as the script.
Run it
python bulk_uploader.py
The script will open your browser for the first-time OAuth grant. After that, it reuses the saved access token. If you get a failed upload, delete the access_token.txt and try again.