Back to Docs
RESTJSONHTTPSAPI KEY
REST API Documentation
Integrate QR code and barcode generation directly into your applications. The API is available exclusively with the Business plan.
01
Authentication
How to authenticate with the API
All requests must include your API key in the HTTP header Authorization.
HTTP Header
Authorization: Bearer YOUR_API_KEYℹ️
Where to find your key? Go to Dashboard → Settings → API Keys. You can generate multiple keys and revoke them at any time.
cURL — Authenticated request
400">curl -X 400 font-semibold">GET https:500 italic">//api.qrcode-app.com/v1/qrcodes \
-H 400">"Authorization: Bearer sk_live_abc123xyz789" \
-H 400">"Content-Type: application/json"⚠️
Security: Never expose your API key in front-end code or a public repository. Use environment variables (
.env).02
Base URL & Versioning
Base URL
https:500 italic">//api.qrcode-app.com/v1/| Parameter | Value |
|---|---|
| Protocol | HTTPS only — HTTP connections are rejected |
| Current version | v1 |
| Format | JSON only (Content-Type: application/json) |
| Encoding | UTF-8 |
| Timeout | 30 seconds per request |
03
HTTP Status Codes
| Code | Status | Description |
|---|---|---|
| 200 | OK | Request successful |
| 201 | Created | Resource created successfully |
| 400 | Bad Request | Missing or invalid parameters |
| 401 | Unauthorized | API key missing or invalid |
| 403 | Forbidden | Quota exceeded or insufficient plan |
| 404 | Not Found | Resource not found |
| 429 | Too Many Requests | Rate limit reached |
| 500 | Server Error | Internal error — contact support |
JSON error structure:
JSON — Error response
{
400">"error": {
400">"code": 400">"QUOTA_EXCEEDED",
400">"message": 400">"You have reached your plan limit.",
400">"details": 400">"Upgrade to the Business plan for unlimited access."
}
}04
Rate Limiting
Requests per minute limits
| Plan | Limit | Note |
|---|---|---|
| Business | 1 000 req/min | 60-second sliding window |
| Pro | Not available | API is not available on this plan |
| Free | Not available | API is not available on this plan |
Response headers
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 873
X-RateLimit-Reset: 1710254400⚠️
On HTTP 429, wait for the window expiration indicated by
X-RateLimit-Reset (Unix timestamp).05
Generate a Static QR Code
Create a QR code with design options
POST
/v1/qrcodes/generateBody parameters (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | url, wifi, vcard, sms, whatsapp, maps, email, phone, event, payment, text |
content | string / object | Yes | Encoded content. String for url/text/phone, JSON object for wifi/vcard/event/maps. |
format | string | No | png (default), svg, pdf |
size | integer | No | Size in px: 100 to 4096. Default: 512 |
error_correction | string | No | L, M (default), Q, H — H recommended if using logo |
design | object | No | Visual options (colors, logo, dot style) |
Design object
| Field | Type | Description |
|---|---|---|
fg_color | string (hex) | Module color. E.g. #1a1a2e. Default: #000000 |
bg_color | string (hex) | Background color. Default: #ffffff |
logo_url | string (URL) | HTTPS URL of your logo (PNG/SVG, square recommended) |
logo_size | number | Logo size: 0.1 to 0.4. Default: 0.2 |
dot_style | string | square (default), round, dots, classy, classy-rounded |
corner_style | string | square (default), round, extra-rounded |
Available QR code types
| type | Content structure |
|---|---|
url | "content": "https://example.com" |
email | "content": {"to":"a@b.com","subject":"Objet","body":"Msg"} |
wifi | "content": {"ssid":"MonWifi","password":"pass","encryption":"WPA"} |
vcard | "content": {"first_name":"Jean","last_name":"Dupont","phone":"+336...","email":"..."} |
maps | "content": {"latitude":48.8566,"longitude":2.3522,"label":"Paris"} |
event | "content": {"title":"Conference","start":"2026-06-01T09:00","end":"2026-06-01T18:00"} |
sms | "content": {"phone":"+33612345678","message":"Bonjour"} |
whatsapp | "content": {"phone":"+33612345678","message":"Salut!"} |
phone | "content": "+33612345678" |
payment | "content": {"iban":"FR76...","amount":50,"currency":"EUR","label":"Facture"} |
Exemple complet — QR URL avec logo
cURL
400">curl -X 400 font-semibold">POST https:500 italic">//api.qrcode-app.com/v1/qrcodes/generate \
-H 400">"Authorization: Bearer sk_live_abc123" \
-H 400">"Content-Type: application/json" \
-d '{
400">"type": 400">"url",
400">"content": 400">"https:500 italic">//monsite.com",
400">"format": 400">"png",
400">"size": 1024,
400">"error_correction": 400">"H",
400">"design": {
400">"fg_color": 400">"500 italic">#1a1a2e",
400">"bg_color": 400">"500 italic">#ffffff",
400">"logo_url": 400">"https:500 italic">//monsite.com/logo.png",
400">"logo_size": 0.25,
400">"dot_style": 400">"round",
400">"corner_style": 400">"extra-rounded"
}
}'JSON — Response
500 italic"># Response — 200 OK
{
400">"success": 400">true,
400">"data": {
400">"qr_id": 400">"qr_K9mX2pL7nR",
400">"type": 400">"url",
400">"content": 400">"https:500 italic">//monsite.com",
400">"format": 400">"png",
400">"image_url": 400">"https:500 italic">//cdn.qrcode-app.com/qr_K9mX2pL7nR.png",
400">"download_url": 400">"https:500 italic">//api.qrcode-app.com/v1/qrcodes/qr_K9mX2pL7nR/download",
400">"created_at": 400">"2026-03-12T10:30:00Z"
}
}06
Dynamic QR Codes
Change the destination without reprinting
A dynamic QR code points to an intermediate URL controlled by the API. You can change the destination at any time. Scan statistics are available in real time.
POST
/v1/qrcodes/dynamicCreate a dynamic QR codePUT
/v1/qrcodes/{qr_id}/destinationUpdate the destinationJSON — Create a dynamic QR
{
400">"name": 400">"Summer 2026 Campaign",
400">"destination_url": 400">"https:500 italic">//monsite.com/promo-ete",
400">"format": 400">"png",
400">"size": 512,
400">"protection": {
400">"password": 400">"secret123",
400">"expiry_date": 400">"2026-09-01",
400">"max_scans": 500
},
400">"design": { 400">"fg_color": 400">"500 italic">#e11d48", 400">"dot_style": 400">"round" }
}Protection parameters
| Field | Type | Description |
|---|---|---|
password | string | Password required before each scan |
expiry_date | string ISO 8601 | Expiry date. The QR will be inactive after this date. |
max_scans | integer | Maximum number of scans allowed. 0 = unlimited. |
07
Manage your QR Codes
List, view, delete
GET
/v1/qrcodesList all your QR codes (pagination)GET
/v1/qrcodes/{qr_id}View a specific QR codeDELETE
/v1/qrcodes/{qr_id}Supprimer un QR codeGET
/v1/qrcodes/{qr_id}/downloadDownload the image fileQuery params — liste
| Parameter | Type | Description |
|---|---|---|
page | integer | Page number (default: 1) |
limit | integer | Results per page: 1–100 (default: 20) |
type | string | Filtrer par type: url, wifi, vcard... (optionnel) |
kind | string | Filtrer: static ou dynamic (optionnel) |
Exemple — Liste des QR codes
400 font-semibold">GET /v1/qrcodes?page=1&limit=10&type=url&kind=dynamic
500 italic"># Response
{
400">"data": [
{ 400">"qr_id": 400">"qr_K9mX2pL7nR", 400">"type": 400">"url", 400">"kind": 400">"dynamic", ... },
{ 400">"qr_id": 400">"qr_P3rT8qW1xN", 400">"type": 400">"wifi", 400">"kind": 400">"static", ... }
],
400">"pagination": { 400">"total": 42, 400">"page": 1, 400">"limit": 10, 400">"pages": 5 }
}08
Statistics & Analytics
Analyze your scans in real time
GET
/v1/qrcodes/{qr_id}/statsStats globales d'un QR codeGET
/v1/qrcodes/{qr_id}/stats/dailyScans per day (time series)GET
/v1/qrcodes/{qr_id}/stats/countriesScans par paysGET
/v1/qrcodes/{qr_id}/stats/devicesScans par type d'appareilGET
/v1/stats/overviewVue globale de tous vos QR codesJSON — Stats globales
{
400">"data": {
400">"qr_id": 400">"qr_dyn_5Rp9wZ",
400">"total_scans": 1284,
400">"unique_scans": 1102,
400">"last_scan_at": 400">"2026-03-12T09:45:00Z",
400">"top_country": 400">"France",
400">"top_city": 400">"Paris",
400">"devices": { 400">"mobile": 78.4, 400">"desktop": 18.2, 400">"tablet": 3.4 },
400">"os": { 400">"ios": 45.1, 400">"android": 42.3, 400">"windows": 9.8, 400">"other": 2.8 }
}
}Filtres temporels (query params)
| Parameter | Type | Description |
|---|---|---|
from | string ISO 8601 | Start date. E.g. 2026-01-01 |
to | string ISO 8601 | Date de fin. Ex: 2026-03-12 |
granularity | string | For /daily: hour, day (default), week, month |
09
Product Barcodes
EAN-13, EAN-8, UPC-A, Code128 and more
POST
/v1/barcodes/generate| Field | Type | Required | Description |
|---|---|---|---|
format | string | Yes | EAN13, EAN8, UPCA, CODE128, CODE39, ITF, QR |
value | string | Yes | Value to encode. For EAN-13: 12 digits (checksum auto-calculated) |
output | string | No | png (default), svg |
width | integer | No | Width in pixels (default: 400) |
height | integer | No | Height in pixels (default: 200) |
show_text | boolean | No | Show digits below the barcode (default: true) |
metadata | object | Non | {"sku":"...","name":"...","price":9.99,"category":"..."} |
JSON — Generate an EAN-13
{
400">"format": 400">"EAN13",
400">"value": 400">"590123412345",
400">"output": 400">"png",
400">"width": 600,
400">"height": 250,
400">"show_text": 400">true,
400">"metadata": {
400">"sku": 400">"PROD-001",
400">"name": 400">"Premium Coffee 250g",
400">"price": 7.99,
400">"category": 400">"Grocery"
}
}10
API Key Management
GET
/v1/api-keysList your API keysPOST
/v1/api-keysCreate a new API keyDELETE
/v1/api-keys/{key_id}Revoke an API keyAPI key creation
500 italic"># Create an API key
400 font-semibold">POST /v1/api-keys
{ 400">"name": 400">"App Mobile Production", 400">"permissions": [400">"read", 400">"write"] }
500 italic"># Response (the key is shown ONLY ONCE)
{
400">"key_id": 400">"key_8Wn4pQz",
400">"name": 400">"App Mobile Production",
400">"api_key": 400">"sk_live_x9Km2pL7nR8qW3vT...",
400">"created_at": 400">"2026-03-12T10:00:00Z"
}⚠️
Important: The
api_key value is only visible once at creation. Copy it immediately and store it in your environment variables.11
Complete Examples by Language
cURL
500 italic"># Generate a QR code
400">curl -X 400 font-semibold">POST https:500 italic">//api.qrcode-app.com/v1/qrcodes/generate \
-H 400">"Authorization: Bearer sk_live_abc123" \
-H 400">"Content-Type: application/json" \
-d '{400">"type":400">"url",400">"content":400">"https:500 italic">//monsite.com",400">"format":400">"png",400">"size":512}'
500 italic"># List your QR codes
400">curl https:500 italic">//api.qrcode-app.com/v1/qrcodes?limit=10 \
-H 400">"Authorization: Bearer sk_live_abc123"
500 italic"># View stats
400">curl https:500 italic">//api.qrcode-app.com/v1/qrcodes/qr_K9mX/stats \
-H 400">"Authorization: Bearer sk_live_abc123"12
Errors & Troubleshooting
| Code erreur | HTTP | Cause & Solution |
|---|---|---|
INVALID_API_KEY | 401 | Invalid API key. Check the Authorization header and your key validity. |
QUOTA_EXCEEDED | 403 | QR code limit reached. Upgrade your plan or delete old QR codes. |
API_NOT_AVAILABLE | 403 | API is not available on your plan. Business plan required. |
INVALID_TYPE | 400 | The specified type does not exist. See the list in section 5. |
INVALID_CONTENT | 400 | The content field does not match the type. E.g. url requires a valid URL. |
QR_NOT_FOUND | 404 | The qr_id does not exist or does not belong to your account. |
RATE_LIMIT_EXCEEDED | 429 | Too many requests. Wait for X-RateLimit-Reset before retrying. |
LOGO_TOO_LARGE | 400 | Logo trop grand. Utilisez logo_size entre 0.1 et 0.4. |
INVALID_COLOR | 400 | Invalid color format. Use hex format: #rrggbb. |
INVALID_EAN | 400 | For EAN-13: provide 12 digits (checksum is calculated automatically). |
ℹ️
Troubleshooting checklist:
- Ensure the
Authorizationheader is in the formatBearer YOUR_KEY - Ensure
Content-Type: application/jsonis present - Read the
error.codefield to identify the exact issue - Check your quota via
GET /v1/qrcodes - Check
X-RateLimit-Remainingfor HTTP 429 - Contact support@qrcode-app.com for HTTP 500 errors
Ready to integrate the API?
Enable the Business plan to get your API key and start generating QR codes.