Python SDK
The official Python SDK for img-src provides a simple, Pythonic interface to the API.Installation
Copy
pip install img-src
Quick Start
Copy
from img_src import ImgSrc
client = ImgSrc(api_key="imgsrc_YOUR_API_KEY")
# Upload an image
with open("photo.jpg", "rb") as f:
image = client.images.upload(file=f, path="photos/vacation.jpg")
print(image.url)
# https://img-src.io/i/username/photos/vacation.jpg
Configuration
Copy
client = ImgSrc(
# Required
api_key="imgsrc_YOUR_API_KEY",
# Optional
base_url="https://api.img-src.io", # Default
timeout=30.0, # Request timeout in seconds
max_retries=3, # Number of retries
)
Environment Variables
Copy
import os
from img_src import ImgSrc
# Automatically reads IMGSRC_API_KEY from environment
client = ImgSrc(api_key=os.environ["IMGSRC_API_KEY"])
Images
Upload
Copy
# From file path
with open("photo.jpg", "rb") as f:
image = client.images.upload(file=f, path="photos/vacation.jpg")
# From bytes
image_bytes = Path("photo.jpg").read_bytes()
image = client.images.upload(
file=image_bytes,
path="photos/vacation.jpg",
content_type="image/jpeg"
)
# From URL
image = client.images.upload(
url="https://example.com/photo.jpg",
path="photos/external.jpg"
)
List
Copy
# List all images
result = client.images.list()
for image in result.images:
print(image.url)
# With pagination
result = client.images.list(limit=20, offset=40)
# Filter by path prefix
result = client.images.list(prefix="photos/")
Search
Copy
result = client.images.search(query="vacation", limit=10)
for image in result.images:
print(image.paths)
Get
Copy
image = client.images.get("img_abc123")
print(f"Dimensions: {image.width}x{image.height}")
Delete
Copy
client.images.delete("img_abc123")
Create Signed URL (Pro)
Copy
result = client.images.create_signed_url(
"img_abc123",
expires_in=3600, # 1 hour
transform={"w": 800, "h": 600, "fit": "cover"}
)
print(result.signed_url)
URL Builder
Build transformation URLs without API calls:Copy
# Simple resize
url = client.url("username/photo.jpg").width(800).build()
# https://img-src.io/i/username/photo.jpg?w=800
# Full transformation
# Output format is determined by file extension
url = (
client.url("username/photo.webp")
.width(800)
.height(600)
.fit("cover")
.quality(85)
.build()
)
# https://img-src.io/i/username/photo.webp?w=800&h=600&fit=cover&q=85
# Using a preset (Pro)
url = client.url("username/photo.jpg").preset("thumbnail").build()
# https://img-src.io/i/username/photo.jpg?p:thumbnail
Settings
Copy
# Get settings
settings = client.settings.get()
print(settings.default_quality)
# Update settings
client.settings.update(
default_quality=85,
default_fit_mode="cover"
)
API Keys
Copy
# List keys
result = client.api_keys.list()
for key in result.api_keys:
print(f"{key.name}: {key.key_prefix}...")
# Create key
new_key = client.api_keys.create(
name="Production",
scopes=["read", "write"],
expires_in_days=90
)
print(f"Save this key: {new_key.key}")
# Delete key
client.api_keys.delete("key_id")
Presets (Pro)
Copy
# List presets
result = client.presets.list()
# Create preset
preset = client.presets.create(
name="thumbnail",
params={"w": 200, "h": 200, "fit": "cover"}
)
# Update preset
client.presets.update(
"preset_id",
params={"w": 250, "h": 250, "fit": "cover"}
)
# Delete preset
client.presets.delete("thumbnail")
Usage
Copy
usage = client.usage.get()
print(f"Transformations: {usage.transformations.used}/{usage.transformations.limit}")
print(f"Storage: {usage.storage.used_bytes} bytes")
print(f"Plan: {usage.plan}")
Error Handling
Copy
from img_src import ImgSrc
from img_src.errors import ImgSrcError, RateLimitError, NotFoundError
try:
client.images.get("nonexistent")
except NotFoundError:
print("Image not found")
except RateLimitError as e:
print(f"Rate limited. Retry after {e.retry_after}s")
except ImgSrcError as e:
print(f"API error: {e.code} - {e.message}")
Async Support
The SDK supports async/await:Copy
import asyncio
from img_src import AsyncImgSrc
async def main():
client = AsyncImgSrc(api_key="imgsrc_YOUR_API_KEY")
# Upload
with open("photo.jpg", "rb") as f:
image = await client.images.upload(file=f, path="photos/vacation.jpg")
# List
result = await client.images.list()
await client.close()
asyncio.run(main())
Async Context Manager
Copy
async with AsyncImgSrc(api_key="imgsrc_YOUR_API_KEY") as client:
image = await client.images.get("img_abc123")
Framework Examples
FastAPI
Copy
from fastapi import FastAPI, UploadFile
from img_src import AsyncImgSrc
app = FastAPI()
client = AsyncImgSrc(api_key="imgsrc_YOUR_API_KEY")
@app.post("/upload")
async def upload(file: UploadFile):
content = await file.read()
image = await client.images.upload(
file=content,
path=f"uploads/{file.filename}",
content_type=file.content_type
)
return {"url": image.url}
@app.on_event("shutdown")
async def shutdown():
await client.close()
Django
Copy
# views.py
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from img_src import ImgSrc
client = ImgSrc(api_key=settings.IMGSRC_API_KEY)
@csrf_exempt
def upload(request):
if request.method == "POST":
file = request.FILES["file"]
image = client.images.upload(
file=file.read(),
path=f"uploads/{file.name}",
content_type=file.content_type
)
return JsonResponse({"url": image.url})
Flask
Copy
from flask import Flask, request, jsonify
from img_src import ImgSrc
app = Flask(__name__)
client = ImgSrc(api_key="imgsrc_YOUR_API_KEY")
@app.route("/upload", methods=["POST"])
def upload():
file = request.files["file"]
image = client.images.upload(
file=file.read(),
path=f"uploads/{file.filename}",
content_type=file.content_type
)
return jsonify({"url": image.url})
Type Hints
The SDK includes full type hints for IDE support:Copy
from img_src import ImgSrc
from img_src.types import Image, Settings, Preset
def process_image(image: Image) -> str:
return image.url
Related
- API Reference - Full API documentation
- Image Transformation Guide - Transformation parameters
- Authentication Guide - API key management