Skip to main content

Python SDK

The official Python SDK for img-src provides a simple, Pythonic interface to the API.
Package: img-src | Runtime: Python 3.8+ | PyPI | GitHub

Installation

pip install img-src

Quick Start

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

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

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

# 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

# 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/")
result = client.images.search(query="vacation", limit=10)
for image in result.images:
    print(image.paths)

Get

image = client.images.get("img_abc123")
print(f"Dimensions: {image.width}x{image.height}")

Delete

client.images.delete("img_abc123")

Create Signed URL (Pro)

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:
# 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

# Get settings
settings = client.settings.get()
print(settings.default_quality)

# Update settings
client.settings.update(
    default_quality=85,
    default_fit_mode="cover"
)

API Keys

# 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)

# 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

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

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:
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

async with AsyncImgSrc(api_key="imgsrc_YOUR_API_KEY") as client:
    image = await client.images.get("img_abc123")

Framework Examples

FastAPI

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

# 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

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:
from img_src import ImgSrc
from img_src.types import Image, Settings, Preset

def process_image(image: Image) -> str:
    return image.url