Python client for the uploadthing API - The easiest way to add file uploads to your Python application.
pip install upyloadthingfrom upyloadthing import UTApi, UTApiOptions
# Initialize with token
api = UTApi(UTApiOptions(token="your-token"))
# Upload a file
with open("example.png", "rb") as f:
result = api.upload_files(f)
print(f"File uploaded: {result.url}")The SDK can be configured using environment variables:
UPLOADTHING_TOKEN- Your uploadthing API token (required if not passed to UTApiOptions)UPLOADTHING_REGION- Preferred upload region (optional, defaults to first available region found in the decoded token)
files = [
open("image1.jpg", "rb"),
open("image2.jpg", "rb")
]
results = api.upload_files(files)
for result in results:
print(f"Uploaded: {result.url}")# Delete by file key
response = api.delete_files("file_key_123")
# Delete multiple files
response = api.delete_files(["key1", "key2"])
# Delete by custom ID
response = api.delete_files("custom_123", key_type="custom_id")# Rename files using new names
response = api.rename_files([
{"fileKey": "file_key_123", "newName": "new_name.jpg"},
{"fileKey": "file_key_456", "newName": "other_name.png"}
])
# Update files with custom IDs
response = api.rename_files([
{"customId": "custom_123", "newName": "new_name.jpg"},
{"customId": "custom_456", "newName": "other_name.png"}
])
# Mix of new names and custom IDs
response = api.rename_files([
{"fileKey": "file_key_123", "newName": "new_name.jpg"},
{"customId": "custom_456", "newName": "other_name.png"}
])# Update ACL for specific files using file keys
response = api.update_acl([
{"fileKey": "file_key_123", "acl": "private"},
{"fileKey": "file_key_456", "acl": "public-read"}
])
# Update ACL using custom IDs
response = api.update_acl([
{"customId": "custom_123", "acl": "private"},
{"customId": "custom_456", "acl": "public-read"}
])
# Mix of file keys and custom IDs
response = api.update_acl([
{"fileKey": "file_key_123", "acl": "private"},
{"customId": "custom_456", "acl": "public-read"}
])# Get first 10 files
files = api.list_files(limit=10)
for file in files.files:
print(f"{file.name}: {file.url}")
# Pagination
files = api.list_files(limit=10, offset=10)usage = api.get_usage_info()
print(f"Total storage used: {usage.total_bytes / 1024 / 1024:.2f} MB")
print(f"Files uploaded: {usage.files_uploaded}")The SDK uses standard Python exceptions:
from requests.exceptions import HTTPError
try:
api.upload_files(file)
except HTTPError as e:
if e.response.status_code == 413:
print("File too large")
else:
print(f"Upload failed: {e}")
except Exception as e:
print(f"Unexpected error: {e}")Both clients provide the same methods with identical parameters, but different execution patterns:
from upyloadthing import UTApi
api = UTApi(UTApiOptions(token="your-token"))
result = api.upload_files(file)from upyloadthing import AsyncUTApi
api = AsyncUTApi(UTApiOptions(token="your-token"))
result = await api.upload_files(file)Both clients provide these methods:
-
upload_files(files: BinaryIO | List[BinaryIO], content_disposition: str = "inline", acl: str | None = "public-read") -> List[UploadResult]- Upload one or more files
- Returns list of upload results
-
delete_files(keys: str | List[str], key_type: str = "file_key") -> DeleteFileResponse- Delete one or more files by key or custom ID
- Returns deletion result
-
list_files(limit: int | None = None, offset: int | None = None) -> ListFileResponse- List uploaded files with optional pagination
- Returns file listing
-
rename_files(updates: List[dict[str, str]]) -> RenameFilesResponse- Rename files or update their custom IDs
- Updates list should contain dicts with:
- Either
fileKeyorcustomId(one is required) newName(required)
- Either
- Returns rename operation result
-
update_acl(updates: List[dict[str, str]]) -> UpdateACLResponse- Update ACL settings for one or more files
- Updates list should contain dicts with:
- Either
fileKeyorcustomId(one is required) acl(required, either 'public-read' or 'private')
- Either
- Returns ACL update operation result
-
get_usage_info() -> UsageInfoResponse- Get account usage statistics
- Returns usage information
All response models are defined in upyloadthing/schemas.py:
UploadResult- File upload result containing:file_key: strname: strsize: inttype: strurl: strufs_url: strapp_url: strfile_hash: strserver_data: Dict | None
DeleteFileResponse- File deletion result containing:success: booldeleted_count: int
ListFileResponse- File listing result containing:has_more: boolfiles: List[FileData]
RenameFilesResponse- File rename result containing:success: boolrenamed_count: int
UpdateACLResponse- ACL update result containing:success: boolupdated_count: int
UsageInfoResponse- Usage statistics containing:total_bytes: intapp_total_bytes: intfiles_uploaded: intlimit_bytes: int
MIT