Skip to content

Python SDK

Official Python SDK for QR Code API.

Installation

bash
pip install qrcodeapi

Quick Start

python
from qrcodeapi import QRCodeAPI

client = QRCodeAPI(api_key="your-api-key")

# Generate a QR code
qr = client.generate(
    data="https://example.com",
    size=400,
    color="22c55e"
)

# Save to file
with open("qr.png", "wb") as f:
    f.write(qr)

Configuration

python
from qrcodeapi import QRCodeAPI

client = QRCodeAPI(
    api_key="your-api-key",
    
    # Optional: Custom base URL
    base_url="https://www.qrcodeapi.io/api",
    
    # Optional: Request timeout in seconds
    timeout=30,
    
    # Optional: Retry configuration
    max_retries=3,
    retry_delay=1.0
)

API Reference

generate()

Generate a QR code image.

python
qr = client.generate(
    data="https://example.com",  # Required
    size=300,                    # 50-2000 (default: 300)
    format="png",                # "png" or "svg" (default: "png")
    color="000000",              # Hex without # (default: "000000")
    background="ffffff",         # Hex without # (default: "ffffff")
    error_correction="M",        # "L", "M", "Q", or "H" (default: "M")
    margin=4,                    # 0-10 (default: 4)
    logo="https://...",          # Logo URL (Pro plan)
    logo_size=20                 # 10-40 as % (default: 20)
)

Returns bytes (the image data).

Create a dynamic link.

python
link = client.links.create(
    name="My Campaign",
    target_url="https://example.com"
)

print(link.id)         # UUID
print(link.short_code) # e.g., "abc123"
print(link.scan_count) # 0

Get all dynamic links.

python
links = client.links.list()

for link in links:
    print(f"{link.name}: {link.short_code} ({link.scan_count} scans)")

Get a single link by ID.

python
link = client.links.get("link-id")

Update a dynamic link.

python
link = client.links.update(
    link_id="link-id",
    name="New Name",
    target_url="https://new-url.com"
)

Delete a dynamic link.

python
client.links.delete("link-id")

analytics.get()

Get scan analytics for a dynamic link.

python
from datetime import datetime, timedelta

analytics = client.analytics.get(
    link_id="link-id",
    start_date=datetime.now() - timedelta(days=30),
    end_date=datetime.now()
)

print(f"Total scans: {analytics.total_scans}")
print(f"Unique scans: {analytics.unique_scans}")

for country in analytics.by_country[:5]:
    print(f"  {country.country}: {country.scans}")

batch.generate()

Generate multiple QR codes (Pro plan).

python
items = [
    {"data": "https://example.com/1", "filename": "qr1.png"},
    {"data": "https://example.com/2", "filename": "qr2.png"},
]

zip_content = client.batch.generate(
    items=items,
    defaults={"size": 400, "color": "4f46e5"}
)

# Save ZIP file
with open("qrcodes.zip", "wb") as f:
    f.write(zip_content)

# Or extract directly
import zipfile
import io

with zipfile.ZipFile(io.BytesIO(zip_content)) as z:
    z.extractall("qrcodes/")

Complete Example

python
from qrcodeapi import QRCodeAPI
import os

def main():
    client = QRCodeAPI(api_key=os.environ["QRCODE_API_KEY"])
    
    # 1. Create a dynamic link
    link = client.links.create(
        name="Product Launch",
        target_url="https://company.com/launch"
    )
    print(f"Created link: {link.short_code}")
    
    # 2. Generate QR code
    qr = client.generate(
        data=f"https://www.qrcodeapi.io/r/{link.short_code}",
        size=500,
        color="1e40af",
        error_correction="H"
    )
    
    with open("launch-qr.png", "wb") as f:
        f.write(qr)
    print("Saved launch-qr.png")
    
    # 3. Update target URL
    client.links.update(
        link.id,
        target_url="https://company.com/launch-v2"
    )
    print("Updated link target")
    
    # 4. Check analytics
    analytics = client.analytics.get(link_id=link.id)
    print(f"Total scans: {analytics.total_scans}")

if __name__ == "__main__":
    main()

Error Handling

python
from qrcodeapi import QRCodeAPI
from qrcodeapi.exceptions import (
    QRCodeAPIError,
    AuthenticationError,
    RateLimitError,
    ValidationError
)

client = QRCodeAPI(api_key="your-key")

try:
    qr = client.generate(data="test")
except AuthenticationError:
    print("Invalid API key")
except RateLimitError as e:
    print(f"Rate limited. Retry after {e.retry_after} seconds")
except ValidationError as e:
    print(f"Invalid input: {e.message}")
except QRCodeAPIError as e:
    print(f"API error: {e.message} (status: {e.status})")

Async Support

python
from qrcodeapi import AsyncQRCodeAPI
import asyncio

async def main():
    client = AsyncQRCodeAPI(api_key="your-key")
    
    # Generate multiple QR codes concurrently
    urls = ["https://example.com/1", "https://example.com/2", "https://example.com/3"]
    
    tasks = [client.generate(data=url) for url in urls]
    results = await asyncio.gather(*tasks)
    
    for i, qr in enumerate(results):
        with open(f"qr{i}.png", "wb") as f:
            f.write(qr)

asyncio.run(main())

Django Integration

python
# views.py
from django.http import HttpResponse
from qrcodeapi import QRCodeAPI
from django.conf import settings

client = QRCodeAPI(api_key=settings.QRCODE_API_KEY)

def generate_qr(request):
    data = request.GET.get("data", "")
    if not data:
        return HttpResponse("data required", status=400)
    
    qr = client.generate(
        data=data,
        size=int(request.GET.get("size", 300)),
        color=request.GET.get("color", "000000")
    )
    
    return HttpResponse(qr, content_type="image/png")

Flask Integration

python
from flask import Flask, request, Response
from qrcodeapi import QRCodeAPI
import os

app = Flask(__name__)
client = QRCodeAPI(api_key=os.environ["QRCODE_API_KEY"])

@app.route("/qr")
def generate_qr():
    data = request.args.get("data")
    if not data:
        return {"error": "data required"}, 400
    
    qr = client.generate(
        data=data,
        size=int(request.args.get("size", 300)),
        color=request.args.get("color", "000000")
    )
    
    return Response(qr, mimetype="image/png")

Type Hints

The SDK includes full type hints for IDE support:

python
from qrcodeapi import QRCodeAPI
from qrcodeapi.types import (
    GenerateOptions,
    DynamicLink,
    Analytics,
    BatchItem
)

client: QRCodeAPI = QRCodeAPI(api_key="key")
link: DynamicLink = client.links.create(name="Test", target_url="https://test.com")