Create QR codes with the full PRO experience.

Start trial
Docs/API Reference
Dashboard →
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/
ParameterValue
ProtocolHTTPS only — HTTP connections are rejected
Current versionv1
FormatJSON only (Content-Type: application/json)
EncodingUTF-8
Timeout30 seconds per request
03

HTTP Status Codes

CodeStatusDescription
200OKRequest successful
201CreatedResource created successfully
400Bad RequestMissing or invalid parameters
401UnauthorizedAPI key missing or invalid
403ForbiddenQuota exceeded or insufficient plan
404Not FoundResource not found
429Too Many RequestsRate limit reached
500Server ErrorInternal 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

PlanLimitNote
Business1 000 req/min60-second sliding window
ProNot availableAPI is not available on this plan
FreeNot availableAPI 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/generate

Body parameters (JSON)

FieldTypeRequiredDescription
typestringYesurl, wifi, vcard, sms, whatsapp, maps, email, phone, event, payment, text
contentstring / objectYesEncoded content. String for url/text/phone, JSON object for wifi/vcard/event/maps.
formatstringNopng (default), svg, pdf
sizeintegerNoSize in px: 100 to 4096. Default: 512
error_correctionstringNoL, M (default), Q, H — H recommended if using logo
designobjectNoVisual options (colors, logo, dot style)

Design object

FieldTypeDescription
fg_colorstring (hex)Module color. E.g. #1a1a2e. Default: #000000
bg_colorstring (hex)Background color. Default: #ffffff
logo_urlstring (URL)HTTPS URL of your logo (PNG/SVG, square recommended)
logo_sizenumberLogo size: 0.1 to 0.4. Default: 0.2
dot_stylestringsquare (default), round, dots, classy, classy-rounded
corner_stylestringsquare (default), round, extra-rounded

Available QR code types

typeContent 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 code
PUT/v1/qrcodes/{qr_id}/destinationUpdate the destination
JSON — 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

FieldTypeDescription
passwordstringPassword required before each scan
expiry_datestring ISO 8601Expiry date. The QR will be inactive after this date.
max_scansintegerMaximum 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 code
DELETE/v1/qrcodes/{qr_id}Supprimer un QR code
GET/v1/qrcodes/{qr_id}/downloadDownload the image file

Query params — liste

ParameterTypeDescription
pageintegerPage number (default: 1)
limitintegerResults per page: 1–100 (default: 20)
typestringFiltrer par type: url, wifi, vcard... (optionnel)
kindstringFiltrer: 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 code
GET/v1/qrcodes/{qr_id}/stats/dailyScans per day (time series)
GET/v1/qrcodes/{qr_id}/stats/countriesScans par pays
GET/v1/qrcodes/{qr_id}/stats/devicesScans par type d'appareil
GET/v1/stats/overviewVue globale de tous vos QR codes
JSON — 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)

ParameterTypeDescription
fromstring ISO 8601Start date. E.g. 2026-01-01
tostring ISO 8601Date de fin. Ex: 2026-03-12
granularitystringFor /daily: hour, day (default), week, month
09

Product Barcodes

EAN-13, EAN-8, UPC-A, Code128 and more

POST/v1/barcodes/generate
FieldTypeRequiredDescription
formatstringYesEAN13, EAN8, UPCA, CODE128, CODE39, ITF, QR
valuestringYesValue to encode. For EAN-13: 12 digits (checksum auto-calculated)
outputstringNopng (default), svg
widthintegerNoWidth in pixels (default: 400)
heightintegerNoHeight in pixels (default: 200)
show_textbooleanNoShow digits below the barcode (default: true)
metadataobjectNon{"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 keys
POST/v1/api-keysCreate a new API key
DELETE/v1/api-keys/{key_id}Revoke an API key
API 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 erreurHTTPCause & Solution
INVALID_API_KEY401Invalid API key. Check the Authorization header and your key validity.
QUOTA_EXCEEDED403QR code limit reached. Upgrade your plan or delete old QR codes.
API_NOT_AVAILABLE403API is not available on your plan. Business plan required.
INVALID_TYPE400The specified type does not exist. See the list in section 5.
INVALID_CONTENT400The content field does not match the type. E.g. url requires a valid URL.
QR_NOT_FOUND404The qr_id does not exist or does not belong to your account.
RATE_LIMIT_EXCEEDED429Too many requests. Wait for X-RateLimit-Reset before retrying.
LOGO_TOO_LARGE400Logo trop grand. Utilisez logo_size entre 0.1 et 0.4.
INVALID_COLOR400Invalid color format. Use hex format: #rrggbb.
INVALID_EAN400For EAN-13: provide 12 digits (checksum is calculated automatically).
ℹ️
Troubleshooting checklist:
  1. Ensure the Authorization header is in the format Bearer YOUR_KEY
  2. Ensure Content-Type: application/json is present
  3. Read the error.code field to identify the exact issue
  4. Check your quota via GET /v1/qrcodes
  5. Check X-RateLimit-Remaining for HTTP 429
  6. 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.