Skip to main content

Overview

Integrate QrX into your Python applications using the popular requests library. These examples are suitable for web applications, automation scripts, and data processing pipelines.

Installation

First, install the requests library if you haven’t already:
pip install requests

Basic Usage

Simple Request

import requests

response = requests.get(
    'https://qrgen.maybesurya.live/api/qrgen',
    params={'data': 'Hello World'}
)

if response.status_code == 200:
    with open('qrcode.png', 'wb') as f:
        f.write(response.content)
    print('QR code saved successfully!')
else:
    print(f'Error: {response.status_code}')

Authenticated Requests

Using API Key in Header

import requests
import os

# Store API key in environment variable
api_key = os.environ.get('QRX_API_KEY')

response = requests.get(
    'https://qrgen.maybesurya.live/api/qrgen',
    params={'data': 'Hello World'},
    headers={'x-api-key': api_key}
)

if response.status_code == 200:
    with open('qrcode.png', 'wb') as f:
        f.write(response.content)
    print('✓ QR code generated successfully!')
else:
    print(f'✗ Error: HTTP {response.status_code}')
Store your API key in an environment variable for security: bash export QRX_API_KEY="sk_YOUR_API_KEY"

Complete Examples

QR Code Generator Function

import requests
import os
from pathlib import Path

def generate_qr_code(data: str, output_path: str = 'qrcode.png', api_key: str = None) -> bool:
    """
    Generate a QR code from the given data.

    Args:
        data: The text or URL to encode
        output_path: Path where the QR code will be saved
        api_key: Optional API key for higher rate limits

    Returns:
        True if successful, False otherwise
    """
    url = 'https://qrgen.maybesurya.live/api/qrgen'
    params = {'data': data}
    headers = {}

    if api_key:
        headers['x-api-key'] = api_key

    try:
        response = requests.get(url, params=params, headers=headers, timeout=10)

        if response.status_code == 200:
            with open(output_path, 'wb') as f:
                f.write(response.content)
            print(f'✓ QR code saved to {output_path}')
            return True
        elif response.status_code == 429:
            print('✗ Rate limit exceeded. Please wait and try again.')
        elif response.status_code == 401:
            print('✗ Invalid API key.')
        else:
            print(f'✗ Error: HTTP {response.status_code}')

        return False

    except requests.exceptions.RequestException as e:
        print(f'✗ Network error: {e}')
        return False

# Usage
api_key = os.environ.get('QRX_API_KEY')
generate_qr_code('https://maybesurya.dev', 'website.png', api_key)

Batch Processing

import requests
import os
import time
from typing import List, Dict

class QRXClient:
    def __init__(self, api_key: str = None):
        self.base_url = 'https://qrgen.maybesurya.live/api/qrgen'
        self.api_key = api_key or os.environ.get('QRX_API_KEY')
        self.session = requests.Session()

        if self.api_key:
            self.session.headers.update({'x-api-key': self.api_key})

    def generate(self, data: str, output_path: str) -> Dict:
        """Generate a single QR code."""
        try:
            response = self.session.get(
                self.base_url,
                params={'data': data},
                timeout=10
            )

            if response.status_code == 200:
                with open(output_path, 'wb') as f:
                    f.write(response.content)
                return {
                    'success': True,
                    'data': data,
                    'output': output_path
                }
            else:
                return {
                    'success': False,
                    'data': data,
                    'error': f'HTTP {response.status_code}'
                }

        except Exception as e:
            return {
                'success': False,
                'data': data,
                'error': str(e)
            }

    def batch_generate(self, items: List[Dict], delay: float = 0.6) -> List[Dict]:
        """
        Generate multiple QR codes with rate limiting.

        Args:
            items: List of dicts with 'data' and 'output' keys
            delay: Delay between requests in seconds (default: 0.6 for 100/min limit)

        Returns:
            List of result dictionaries
        """
        results = []

        for i, item in enumerate(items):
            print(f'Processing {i+1}/{len(items)}: {item["data"]}')

            result = self.generate(item['data'], item['output'])
            results.append(result)

            if result['success']:
                print(f'  ✓ Saved to {result["output"]}')
            else:
                print(f'  ✗ Error: {result["error"]}')

            # Don't delay after the last item
            if i < len(items) - 1:
                time.sleep(delay)

        return results

# Usage
client = QRXClient(api_key=os.environ.get('QRX_API_KEY'))

# Batch generate QR codes
items = [
    {'data': 'https://maybesurya.dev', 'output': 'website.png'},
    {'data': 'mailto:[email protected]', 'output': 'email.png'},
    {'data': 'tel:+1234567890', 'output': 'phone.png'},
]

results = client.batch_generate(items)

# Print summary
successful = sum(1 for r in results if r['success'])
print(f'\nCompleted: {successful}/{len(results)} successful')

Django Integration

# views.py
from django.http import HttpResponse, JsonResponse
from django.views import View
import requests
import os

class GenerateQRView(View):
    def get(self, request):
        data = request.GET.get('data')

        if not data:
            return JsonResponse({'error': 'Missing data parameter'}, status=400)

        api_key = os.environ.get('QRX_API_KEY')

        try:
            response = requests.get(
                'https://qrgen.maybesurya.live/api/qrgen',
                params={'data': data},
                headers={'x-api-key': api_key} if api_key else {},
                timeout=10
            )

            if response.status_code == 200:
                return HttpResponse(
                    response.content,
                    content_type='image/png',
                    headers={'Content-Disposition': 'inline; filename="qrcode.png"'}
                )
            else:
                return JsonResponse(
                    {'error': f'QR generation failed: {response.status_code}'},
                    status=response.status_code
                )

        except requests.exceptions.RequestException as e:
            return JsonResponse({'error': str(e)}, status=500)

# urls.py
from django.urls import path
from .views import GenerateQRView

urlpatterns = [
    path('api/generate-qr/', GenerateQRView.as_view(), name='generate_qr'),
]

Flask Integration

from flask import Flask, request, send_file, jsonify
import requests
import os
from io import BytesIO

app = Flask(__name__)

@app.route('/api/generate-qr')
def generate_qr():
    data = request.args.get('data')

    if not data:
        return jsonify({'error': 'Missing data parameter'}), 400

    api_key = os.environ.get('QRX_API_KEY')
    headers = {'x-api-key': api_key} if api_key else {}

    try:
        response = requests.get(
            'https://qrgen.maybesurya.live/api/qrgen',
            params={'data': data},
            headers=headers,
            timeout=10
        )

        if response.status_code == 200:
            return send_file(
                BytesIO(response.content),
                mimetype='image/png',
                as_attachment=False,
                download_name='qrcode.png'
            )
        else:
            return jsonify({
                'error': f'QR generation failed: {response.status_code}'
            }), response.status_code

    except requests.exceptions.RequestException as e:
        return jsonify({'error': str(e)}), 500

if __name__ == '__main__':
    app.run(debug=True)

FastAPI Integration

from fastapi import FastAPI, HTTPException, Query
from fastapi.responses import StreamingResponse
import requests
import os
from io import BytesIO

app = FastAPI()

@app.get("/api/generate-qr")
async def generate_qr(data: str = Query(..., description="Data to encode in QR code")):
    """Generate a QR code using QrX API."""

    api_key = os.environ.get('QRX_API_KEY')
    headers = {'x-api-key': api_key} if api_key else {}

    try:
        response = requests.get(
            'https://qrgen.maybesurya.live/api/qrgen',
            params={'data': data},
            headers=headers,
            timeout=10
        )

        if response.status_code == 200:
            return StreamingResponse(
                BytesIO(response.content),
                media_type="image/png",
                headers={"Content-Disposition": "inline; filename=qrcode.png"}
            )
        elif response.status_code == 429:
            raise HTTPException(status_code=429, detail="Rate limit exceeded")
        elif response.status_code == 401:
            raise HTTPException(status_code=401, detail="Invalid API key")
        else:
            raise HTTPException(
                status_code=response.status_code,
                detail=f"QR generation failed"
            )

    except requests.exceptions.RequestException as e:
        raise HTTPException(status_code=500, detail=str(e))

# Run with: uvicorn main:app --reload

Error Handling

import requests
from requests.exceptions import RequestException, Timeout, HTTPError

def generate_qr_with_error_handling(data: str, output_path: str, api_key: str = None):
    """Generate QR code with comprehensive error handling."""

    url = 'https://qrgen.maybesurya.live/api/qrgen'
    params = {'data': data}
    headers = {'x-api-key': api_key} if api_key else {}

    try:
        response = requests.get(
            url,
            params=params,
            headers=headers,
            timeout=10
        )

        # Raise an exception for bad status codes
        response.raise_for_status()

        # Save the QR code
        with open(output_path, 'wb') as f:
            f.write(response.content)

        print(f'✓ QR code saved to {output_path}')
        return True

    except Timeout:
        print('✗ Request timed out. Please try again.')
    except HTTPError as e:
        if e.response.status_code == 429:
            print('✗ Rate limit exceeded. Please wait and try again.')
        elif e.response.status_code == 401:
            print('✗ Invalid API key.')
        else:
            print(f'✗ HTTP error: {e.response.status_code}')
    except RequestException as e:
        print(f'✗ Network error: {e}')
    except IOError as e:
        print(f'✗ File error: {e}')
    except Exception as e:
        print(f'✗ Unexpected error: {e}')

    return False

Best Practices

✅ Do: - Use environment variables for API keys - Handle all exceptions properly - Use sessions for multiple requests - Set reasonable timeouts - Respect rate limits with delays
❌ Don’t: - Hardcode API keys in your code - Ignore HTTP status codes - Make requests without timeouts - Exceed rate limits - Commit .env files to version control

Next Steps