Generate a QR code with a simple POST request:
curl -X POST https://qr.aahub.es/api.php \
-H "Content-Type: application/json" \
-d '{"type": "url", "data": "https://example.com"}' \
--output qr.png
POST https://qr.aahub.es/api.php
Content-Type: application/json
Response: Image (PNG or SVG) or JSON error
Rate Limit: 100 requests per minute per IP
| Parameter | Type | Default | Description |
|---|---|---|---|
type |
string | "text" | QR code type (see types below) |
format |
string | "png" | "png" or "svg" |
size |
integer | 300 | Size in pixels (100-1000) |
color |
string | "000000" | Hex color (without #) |
logo |
string | null | Base64-encoded logo image (PNG, JPEG, GIF, WebP). Max 2MB. Logo will be 25% of QR size. |
Simple text or URL QR code
{"type": "url", "data": "https://example.com"}
Contact card with name, phone, email, etc.
{
"type": "vcard",
"name": "John Doe",
"phone": "+1234567890",
"email": "john@example.com",
"company": "Acme Inc",
"title": "Developer",
"url": "https://johndoe.com"
}
Compose email with recipient, subject, body
{
"type": "email",
"to": "hello@example.com",
"subject": "Hello!",
"body": "I saw your QR code..."
}
Send SMS with pre-filled message
{"type": "sms", "phone": "+1234567890", "message": "Hello!"}
Initiate phone call
{"type": "phone", "phone": "+1234567890"}
WhatsApp chat link with optional message
{"type": "whatsapp", "phone": "1234567890", "message": "Hi!"}
Telegram chat link
{"type": "telegram", "username": "johndoe"}
Signal chat link
{"type": "signal", "phone": "1234567890"}
WiFi network credentials
{
"type": "wifi",
"ssid": "MyNetwork",
"password": "secret123",
"encryption": "WPA",
"hidden": false
}
GPS coordinates for maps
{"type": "geo", "lat": 40.7128, "lng": -74.0060, "label": "NYC"}
Calendar event (iCalendar format)
{
"type": "event",
"title": "Team Meeting",
"start": "2024-03-15T10:00:00",
"end": "2024-03-15T11:00:00",
"location": "Conference Room A",
"description": "Weekly sync",
"allDay": false
}
PayPal.me payment link
{"type": "paypal", "username": "johndoe", "amount": 10.00, "currency": "USD"}
Venmo payment link
{"type": "venmo", "username": "johndoe", "amount": 10.00, "note": "Thanks!"}
Cash App payment link
{"type": "cashapp", "cashtag": "johndoe", "amount": 10.00}
Bitcoin payment URI (BIP-21)
{
"type": "bitcoin",
"address": "1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2",
"amount": 0.001,
"label": "Donation",
"message": "Thanks!"
}
Ethereum payment URI (EIP-681)
{
"type": "ethereum",
"address": "0x89205A3A3b2A69De6Dbf7f01ED13B2108B2c43e7",
"amount": 0.01
}
Litecoin payment URI
{
"type": "litecoin",
"address": "LaMT348PWRnrqeeWArpwQPbuanpXDZGEUz",
"amount": 0.5,
"label": "Payment"
}
Dogecoin payment URI
{
"type": "dogecoin",
"address": "D7Y55K3d3KBhMtJz5EEtzqDyqTY3sdPtPV",
"amount": 100,
"label": "Much thanks!",
"message": "To the moon!"
}
Monero payment URI (privacy-focused cryptocurrency)
{
"type": "monero",
"address": "4AdUndXHHZ6cfufTMvppY6JwXNouMBzSkbLYfpAV5Usx3skxNgYeYTRj5UzqtReoS44qo9mtmXCqY45DJ852K5Jv2684Rge",
"amount": 0.5,
"recipient_name": "Your Name",
"tx_description": "Payment for services"
}
Solana Pay compatible URI (works with Phantom, Solflare, etc.)
{
"type": "solana",
"address": "DemoKMZWkk483hX4mUrcJoo3zVvsKhm8XXs28TuwZw9H",
"amount": 1.5,
"label": "Your Business",
"message": "Thanks for your purchase!",
"memo": "Order #12345"
}
XRP URI compatible with XUMM, Trust Wallet, and other XRP wallets
{
"type": "xrp",
"address": "rN7n3473SaZBCG4dFL83w7a1RXtXtbk2D9",
"amount": 25.5,
"destination_tag": 123456789,
"label": "Your Business"
}
Note: destination_tag (or dt) is required by some exchanges. Use type "ripple" as an alias.
CIP-13 compliant Cardano URI for Daedalus, Yoroi, and other ADA wallets
{
"type": "cardano",
"address": "addr1qy8ac7qqy0vtulyl7wntmsxc6wex80gvcyjy33qffrhm7sh927ysx5sftuw0dlft05dz3c7revpf7jx0xnlcjz3g69mq4afdhv",
"amount": 50.0
}
Uses web+cardano: URI scheme per CIP-13 standard. Use type "ada" as an alias.
BIP-21 style URI for Bitcoin.com, Electron Cash, and other BCH wallets
{
"type": "bitcoincash",
"address": "qze75dks3vtgr3ezeg0jgkmezl2ttvpylyrk26dlsq",
"amount": 0.05,
"label": "Your Business",
"message": "Payment for order #123"
}
Uses bitcoincash: URI scheme per Bitcoin Cash standards. Use type "bch" as an alias. Addresses start with 'q' (P2PKH) or 'p' (P2SH).
Polkadot URI for Polkadot.js, Talisman, SubWallet, and other DOT wallets
{
"type": "polkadot",
"address": "1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg",
"amount": 10.0,
"label": "Your Business",
"message": "Payment for services"
}
Uses polkadot: URI scheme. Use type "dot" as an alias. Addresses are SS58-encoded and typically start with '1' for Polkadot mainnet.
Tezos URI for Temple, Kukai, Galleon, and other XTZ wallets
{
"type": "tezos",
"address": "tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb",
"amount": 50.0,
"label": "Your Business",
"message": "Payment for services"
}
Uses tezos: URI scheme. Use type "xtz" as an alias. Addresses start with tz1, tz2, tz3 (implicit accounts) or KT1 (smart contracts).
Stellar SEP-7 URI for Lobstr, StellarX, Solar, and other XLM wallets
{
"type": "stellar",
"address": "GCKFBEIYV2U22IO2BJ4KVJOIP7XPWQGQFKKWXR6DOSJBV7STMAQSMTGG",
"amount": 100.0,
"memo": "Payment reference"
}
Uses web+stellar:pay URI scheme (SEP-7 standard). Use type "xlm" as an alias. Addresses are 56 characters starting with G or federation addresses (name*domain.com).
Generate multiple QR codes at once. Returns a ZIP file containing all QR codes.
POST https://qr.aahub.es/api.php
Content-Type: application/json | Response: application/zip
| Parameter | Type | Description |
|---|---|---|
batch |
boolean | Set to true to enable batch mode |
batch_type |
string | "text" (default), "wifi", "vcard", "email", "sms", "paypal", "venmo", "cashapp", "bitcoin", "ethereum", "litecoin", "dogecoin", "monero", "solana", "xrp", "cardano", "bitcoincash", "polkadot", "tezos", or "stellar" |
items |
array | Array of items to generate (max 50) |
{
"batch": true,
"batch_type": "text",
"items": [
"https://example.com/page1",
"https://example.com/page2",
"https://example.com/page3"
],
"size": 300,
"format": "png"
}
Each item: "SSID,Password,Security" (Security: WPA, WPA2, WEP, or blank)
{
"batch": true,
"batch_type": "wifi",
"items": [
"GuestWiFi,password123,WPA2",
"CafeNetwork,cafepass,WPA",
"OpenNetwork,,"
]
}
Each item: "Name,Phone,Email,Company"
{
"batch": true,
"batch_type": "vcard",
"items": [
"John Doe,+1234567890,john@example.com,Acme Inc",
"Jane Smith,+1987654321,jane@example.com,Tech Corp",
"Bob Wilson,+1555123456,,"
]
}
Each item: "Email,Subject,Body"
{
"batch": true,
"batch_type": "email",
"items": [
"support@company.com,Question about service,Hello I need help...",
"sales@company.com,Product inquiry,I'm interested in...",
"info@company.com,,"
]
}
Each item: "Phone,Message"
{
"batch": true,
"batch_type": "sms",
"items": [
"+1234567890,Hello from our company!",
"+1987654321,Thank you for your purchase!",
"+1555123456,"
]
}
Each item: "Username,Amount,Currency"
{
"batch": true,
"batch_type": "paypal",
"items": [
"johndoe,25.00,USD",
"janesmith,50.00,EUR",
"merchant,,"
]
}
Each item: "Username,Amount,Note"
{
"batch": true,
"batch_type": "venmo",
"items": [
"johndoe,25.00,Coffee",
"janesmith,10.00,Lunch",
"friend,,Thanks!"
]
}
Each item: "$Cashtag,Amount"
{
"batch": true,
"batch_type": "cashapp",
"items": [
"$johndoe,25.00",
"$janesmith,10.00",
"merchant,"
]
}
Each item: "Address,Amount,Label" (BIP-21 format)
{
"batch": true,
"batch_type": "bitcoin",
"items": [
"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa,0.001,Donation",
"3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy,0.05,Product",
"bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq,,"
]
}
Each item: "Address,Amount" (EIP-681 format, amount in ETH)
{
"batch": true,
"batch_type": "ethereum",
"items": [
"0x742d35Cc6634C0532925a3b844Bc454e4438f44e,0.5",
"0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe,1.0",
"0x71C7656EC7ab88b098defB751B7401B5f6d8976F,"
]
}
Each item: "Address,Amount,Label"
{
"batch": true,
"batch_type": "litecoin",
"items": [
"LZ7tYccN7Wn9L1V2xFFXvnFGxHMYgEqhpG,0.5,Payment",
"LTdsVS8VDw6sXuVzXRRe1BWgSHwRjHpRNj,1.0,Order 123",
"MBfpRQPQQg9dLqU2HXBv1rQ4vRZzxqFTcL,,"
]
}
Each item: "Address,Amount,Label"
{
"batch": true,
"batch_type": "dogecoin",
"items": [
"D7Y55K3d3KBhMtJz5EEtzqDyqTY3sdPtPV,100,Much thanks!",
"DHkFPq3cL3LwPQVkAMPBxXs9K4tVn7Ldvf,50,To the moon!",
"D5AHRgjyBvdPpTQH8rM4cQwzN7hqPvQ9,,"
]
}
Each item: "Address,Amount,RecipientName"
{
"batch": true,
"batch_type": "monero",
"items": [
"4AdUndXHHZ6cfufTMvppY6JwXNouMBzSkbLYfpAV5Usx...,0.5,Your Name",
"888tNkZrPN6JsEgekjMnABU4TBzc2Dt29EPAvkRxbANs...,1.0,",
"47sghzufGhJJDQEbScMCwVBimTuq6L5JiRixD8VeGbpj...,,"
]
}
Each item: "Address,Amount,Label" (Solana Pay compatible)
{
"batch": true,
"batch_type": "solana",
"items": [
"DemoKMZWkk483hX4mUrcJoo3zVvsKhm8XXs28TuwZw9H,1.5,Payment",
"7fUAJdStEuGbc3sM84cKRL6yYaaSstyLSU4ve5oovLS7,2.0,Order 123",
"9noXzpXnkyEcKF3DZRq1oLrjHRBBBBX4VPAhb2mXW7yd,,"
]
}
Each item: "Address,Amount,DestinationTag"
{
"batch": true,
"batch_type": "xrp",
"items": [
"rN7n3473SaZBCG4dFL83w7a1RXtXtbk2D9,25.5,123456789",
"rEb8TK3gBgk5auZkwc6sHnwrGVJH8DuaLh,50.0,",
"rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW,10.0,987654321"
]
}
Note: Destination tag is required by some exchanges.
Each item: "Address,Amount" (CIP-13 compliant)
{
"batch": true,
"batch_type": "cardano",
"items": [
"addr1qy8ac7qqy0vtulyl7wntmsxc6wex80gvcyjy33qffrhm7sh927ysx5sftuw0dlft05dz3c7revpf7jx0xnlcjz3g69mq4afdhv,50.0",
"addr1q9d66zzs27kppmx8qc8h43q7m4w2g5jxewjyxqyjcxzpqxeesm...,25.0",
"addr1qxhxg5rkwg5sk2kj9k6kkfxhh9vrgml9jvw4nj7r5qm8zp8t4s6..."
]
}
Each item: "Address,Amount,Label" (CashAddr format)
{
"batch": true,
"batch_type": "bitcoincash",
"items": [
"qze75dks3vtgr3ezeg0jgkmezl2ttvpylyrk26dlsq,0.05,Payment",
"qr4nue8t2wrq8j0tvyq4l9r4r7sj9yj80gzwc8r7h6,0.1,Order 123",
"pq2xk6gxunl7x7l4v65klxzyl6v8r8mvau4y7xfpj5,,"
]
}
Each item: "Address,Amount,Label" (SS58 format)
{
"batch": true,
"batch_type": "polkadot",
"items": [
"1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg,10.0,Payment",
"15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5,5.0,Order 123",
"14ShUZUYUR35RBZW6uVVt1zXDxmSQddkeDdXf1JkMA6P721N,,"
]
}
Each item: "Address,Amount,Label" (tz1/tz2/tz3/KT1 format)
{
"batch": true,
"batch_type": "tezos",
"items": [
"tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb,50.0,Payment",
"tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU,25.0,Order 123",
"tz1aZoFH2pd3V9UEq5psqVokVBYkt7YSi1ow,,"
]
}
Each item: "Address,Amount,Memo" (56-char addresses starting with G)
{
"batch": true,
"batch_type": "stellar",
"items": [
"GCKFBEIYV2U22IO2BJ4KVJOIP7XPWQGQFKKWXR6DOSJBV7STMAQSMTGG,100.0,Payment",
"GA2XP4KMY4KWNPW4KUCUKYUF2J7Y6HO5HLPUEA3VPVGP2QC2GDAEVMEM,50.0,Order 456",
"GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ,,"
]
}
curl -X POST https://qr.aahub.es/api.php \
-H "Content-Type: application/json" \
-d '{
"batch": true,
"batch_type": "wifi",
"items": ["GuestWiFi,pass123,WPA2", "LobbyWiFi,lobby456,WPA"]
}' \
--output qrcodes.zip
const response = await fetch('https://qr.aahub.es/api.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
batch: true,
batch_type: 'vcard',
items: [
'John Doe,+1234567890,john@example.com,Acme',
'Jane Smith,+1987654321,jane@example.com,Tech'
]
})
});
const blob = await response.blob();
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'contacts.zip';
a.click();
Errors return JSON with an error field:
{"error": "Phone number is required"}
const response = await fetch('https://qr.aahub.es/api.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
type: 'wifi',
ssid: 'MyNetwork',
password: 'secret123'
})
});
const blob = await response.blob();
const url = URL.createObjectURL(blob);
document.getElementById('qr').src = url;
import requests
response = requests.post('https://qr.aahub.es/api.php', json={
'type': 'vcard',
'name': 'John Doe',
'email': 'john@example.com',
'phone': '+1234567890'
})
with open('contact.png', 'wb') as f:
f.write(response.content)
$ch = curl_init('https://qr.aahub.es/api.php');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'type' => 'url',
'data' => 'https://example.com',
'format' => 'svg'
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$svg = curl_exec($ch);
curl_close($ch);
file_put_contents('qr.svg', $svg);
Embed a logo in the center of your QR code using base64-encoded image data:
// Read logo file and convert to base64
const logoFile = document.querySelector('input[type="file"]').files[0];
const reader = new FileReader();
reader.onload = async () => {
const response = await fetch('https://qr.aahub.es/api.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
type: 'url',
data: 'https://example.com',
logo: reader.result // data:image/png;base64,...
})
});
const blob = await response.blob();
document.getElementById('qr').src = URL.createObjectURL(blob);
};
reader.readAsDataURL(logoFile);
import requests
import base64
# Read and encode logo
with open('logo.png', 'rb') as f:
logo_base64 = base64.b64encode(f.read()).decode('utf-8')
response = requests.post('https://qr.aahub.es/api.php', json={
'type': 'url',
'data': 'https://example.com',
'logo': logo_base64
})
with open('qr-with-logo.png', 'wb') as f:
f.write(response.content)
# Encode logo and generate QR
LOGO=$(base64 -i logo.png)
curl -X POST https://qr.aahub.es/api.php \
-H "Content-Type: application/json" \
-d "{\"type\": \"url\", \"data\": \"https://example.com\", \"logo\": \"$LOGO\"}" \
--output qr-with-logo.png
Note: The logo is automatically sized to 25% of the QR code dimensions and placed in the center with a punchout background for visibility. Max logo size: 2MB. Supported formats: PNG, JPEG, GIF, WebP.