CreateQR Developer Manual

Automate dynamic QR code creation with the CreateQR API

Use JSON endpoints to create, list, and delete QR codes from your own systems. Generate dynamic QR codes for campaigns and managed destinations, plus static WiFi and crypto wallet QR codes where supported.

Base path: /api/v1 Auth: Authorization: Bearer <key> (recommended)

Create QR Codes

Create a dynamic QR code for URLs and managed destinations, or a static QR code for WiFi and crypto wallet payloads.

POST https://createqr.app/api/v1/create

Send JSON only. For key auth, header is best practice. Body key fields are there for compatibility with existing integrations.

Quickstart (cURL)

This dynamic URL example is the fastest hello-world path.

curl -sS -X POST 'https://createqr.app/api/v1/create' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer ck_live_XXXXXXXXXXXXXXXXXXXXXXXX' \
  -d '{"data":"https://createqr.app","qrtype":"dynamic"}'

Auth & compatibility

  • Recommended: Authorization: Bearer <key>
  • Also accepted: X-API-Key
  • JSON fallback: apikey or api_key
  • Content-Type must be application/json
  • Non-POST methods return 405 method_not_allowed

Main Parameters

Parameter Type Default Description
apikey String Required Secret API key. Recommended in Authorization header (Bearer). JSON body apikey/api_key is also accepted.
data String Required Content to encode. Dynamic QR requires a valid URL. Static QR accepts WiFi payload strings or crypto wallet addresses only.
qrtype String dynamic QR mode: dynamic for URLs and managed destinations, or static for WiFi and crypto wallet payloads only.
title String Optional QR title shown in dashboard (trimmed to 120 chars).
folderid Number Optional Positive integer folder ID owned by your account.

Color & Shape Parameters

Parameter Type Default Description
transparent String/Bool off on/off, true/false, 1/0, yes/no accepted.
backcolor String #FFFFFF Background hex color in #RRGGBB format.
frontcolor String #000000 Main dots hex color in #RRGGBB format.
gradient String/Bool off Enable two-color dot gradient.
radial String/Bool off Enable radial gradient (works when gradient is on).
gradient_color String #15A97C Second gradient color in #RRGGBB.
marker_out_color String #000000 Frame around corner dots color in #RRGGBB format.
marker_in_color String #000000 Corner dots color in #RRGGBB format.
pattern String default Body dot style preset.
default circle star diamond sparkle danger cross plus x heart shake blob special-circle-orizz special-circle-vert special-circle special-diamond ribbon oriental ellipse
marker String default Frame around corner dots style.
corner_1 corner_2 corner_3 corner_4 corner_5 corner_6 corner_7 corner_8
marker_in String default Corner dots type.
corner_in_1 corner_in_2 corner_in_3 corner_in_4 corner_in_5 corner_in_6 corner_in_7 corner_in_8
optionlogo String none none, recommended local SVG watermark path, legacy local PNG path, or base64 image data.
none /images/watermarks/v2/01-link.svg /images/watermarks/v2/02-location.svg /images/watermarks/v2/03-email.svg /images/watermarks/v2/04-whatsapp.svg /images/watermarks/v2/05-wifi.svg /images/watermarks/v2/06-vcard.svg /images/watermarks/v2/07-menu.svg /images/watermarks/v2/08-app.svg /images/watermarks/v2/09-video.svg /images/watermarks/v2/10-feedback.svg /images/watermarks/v2/11-event.svg /images/watermarks/v2/12-coupon.svg /images/watermarks/v2/13-music.svg /images/watermarks/v2/14-social.svg /images/watermarks/v2/15-paypal.svg /images/watermarks/v2/16-bitcoin.svg /images/watermarks/v2/17-scan.svg data:image/*;base64,...
no_logo_bg String/Bool on Remove the logo background plate.

Frame Parameters

Parameter Type Default Description
outer_frame String none Frame style preset.
none svg_frame_01 svg_frame_02 svg_frame_03 svg_frame_04 svg_frame_05 svg_frame_06 svg_frame_07 svg_frame_08 svg_frame_09 svg_frame_10 svg_frame_11 svg_frame_12 svg_frame_13 svg_frame_14 svg_frame_15 svg_frame_16 svg_frame_19 svg_frame_22 svg_frame_23 svg_frame_26 svg_frame_27 svg_frame_28 svg_frame_29 svg_frame_30 svg_frame_31 svg_frame_33 svg_frame_34 svg_frame_35 svg_frame_36 svg_frame_38 svg_frame_42
framelabel String SCAN ME Frame text label (trimmed to 80 chars).
label_font String Arial, Helvetica, sans-serif Font stack for frame label.
custom_frame_color String/Bool off Enable custom frame color.
framecolor String #000000 Frame hex color in #RRGGBB format.

Create request examples

Example: Plain QR

No-frills, fast scan

Request Method:
POST
Request URL:
https://createqr.app/api/v1/create
Request Parameters:

All parameters need to be sent as a JSON object in the request body.

{
    "apikey": "ck_live_XXXXXXXXXXXXXXXXXXXXXXXX",
    "data": "https://createqr.app",
    "qrtype": "dynamic",
    "title": "Launch Landing QR",
    "transparent": "off",
    "backcolor": "#FFFFFF",
    "frontcolor": "#000000",
    "marker_out_color": "#000000",
    "marker_in_color": "#000000",
    "pattern": "default",
    "marker": "corner_1",
    "marker_in": "corner_in_1",
    "optionlogo": "none"
}
Request Outcome
Example output preview

Example: Static WiFi QR

Built for distance

Request Method:
POST
Request URL:
https://createqr.app/api/v1/create
Request Parameters:

All parameters need to be sent as a JSON object in the request body.

{
    "apikey": "ck_live_XXXXXXXXXXXXXXXXXXXXXXXX",
    "data": "WIFI:T:WPA;S:CreateQR Guest;P:guest-2026;H:false;;",
    "qrtype": "static",
    "title": "Guest Wi-Fi QR",
    "transparent": "off",
    "backcolor": "#0B1220",
    "frontcolor": "#FFFFFF",
    "marker_out_color": "#F4C84A",
    "marker_in_color": "#F4C84A",
    "pattern": "circle",
    "marker": "corner_3",
    "marker_in": "corner_in_3",
    "optionlogo": "none"
}
Request Outcome
Example output preview

Brand Color

Theme-aligned campaign

Request Method:
POST
Request URL:
https://createqr.app/api/v1/create
Request Parameters:

All parameters need to be sent as a JSON object in the request body.

{
    "apikey": "ck_live_XXXXXXXXXXXXXXXXXXXXXXXX",
    "data": "https://createqr.app/pricing",
    "qrtype": "dynamic",
    "title": "Pricing QR",
    "transparent": "off",
    "backcolor": "#EAF4FF",
    "frontcolor": "#033895",
    "marker_out_color": "#15A97C",
    "marker_in_color": "#15A97C",
    "pattern": "special-circle-orizz",
    "marker": "corner_4",
    "marker_in": "corner_in_4",
    "optionlogo": "none"
}
Request Outcome
Example output preview

Example: Color + Logo

Preset watermark icon

Request Method:
POST
Request URL:
https://createqr.app/api/v1/create
Request Parameters:

All parameters need to be sent as a JSON object in the request body.

{
    "apikey": "ck_live_XXXXXXXXXXXXXXXXXXXXXXXX",
    "data": "https://createqr.app/features",
    "qrtype": "dynamic",
    "title": "Feature Tour QR",
    "transparent": "off",
    "backcolor": "#033895",
    "frontcolor": "#FFFFFF",
    "marker_out_color": "#669DF4",
    "marker_in_color": "#669DF4",
    "pattern": "ribbon",
    "marker": "corner_5",
    "marker_in": "corner_in_5",
    "optionlogo": "/images/watermarks/v2/01-link.svg"
}
Request Outcome

Example: Framed Campaign QR

Poster-ready "SCAN ME"

Request Method:
POST
Request URL:
https://createqr.app/api/v1/create
Request Parameters:

All parameters need to be sent as a JSON object in the request body.

{
    "apikey": "ck_live_XXXXXXXXXXXXXXXXXXXXXXXX",
    "data": "https://createqr.app/pricing",
    "qrtype": "dynamic",
    "title": "Pricing Poster QR",
    "transparent": "off",
    "frontcolor": "#2B0011",
    "marker_out_color": "#3B0001",
    "marker_in_color": "#3B0001",
    "pattern": "ellipse",
    "marker": "corner_8",
    "marker_in": "corner_in_7",
    "optionlogo": "none",
    "outer_frame": "balloon-top",
    "framelabel": "SCAN ME",
    "label_font": "Arial, Helvetica, sans-serif",
    "custom_frame_color": "on",
    "framecolor": "#3B0001"
}
Request Outcome
Example output preview

Gradient Mood

Extra style for socials

Request Method:
POST
Request URL:
https://createqr.app/api/v1/create
Request Parameters:

All parameters need to be sent as a JSON object in the request body.

{
    "apikey": "ck_live_XXXXXXXXXXXXXXXXXXXXXXXX",
    "data": "https://createqr.app/why-us",
    "qrtype": "dynamic",
    "title": "Brand Story QR",
    "transparent": "off",
    "backcolor": "#FFFFFF",
    "frontcolor": "#4B1EFF",
    "gradient": "on",
    "radial": "off",
    "gradient_color": "#FF7A00",
    "marker_out_color": "#101828",
    "marker_in_color": "#101828",
    "pattern": "special-diamond",
    "marker": "corner_6",
    "marker_in": "corner_in_8",
    "optionlogo": "none"
}
Request Outcome
Example output preview

Example: Static crypto wallet QR

Static crypto address

Request Method:
POST
Request URL:
https://createqr.app/api/v1/create
Request Parameters:

All parameters need to be sent as a JSON object in the request body.

{
    "apikey": "ck_live_XXXXXXXXXXXXXXXXXXXXXXXX",
    "data": "bitcoin:bc1qexampleaddress",
    "qrtype": "static",
    "title": "Bitcoin Wallet QR",
    "transparent": "off",
    "backcolor": "#FFF7ED",
    "frontcolor": "#1F2937",
    "marker_out_color": "#F7931A",
    "marker_in_color": "#F7931A",
    "pattern": "circle",
    "marker": "corner_2",
    "marker_in": "corner_in_2",
    "optionlogo": "/images/watermarks/v2/16-bitcoin.svg"
}
Request Outcome
Example output preview

Success response envelope

{
    "success": true,
    "data": {
        "qrid": "1284",
        "svg": "<svg ...>...</svg>",
        "type": "dynamic",
        "title": "Launch Landing QR",
        "dashboard_url": "https://createqr.app/app/qrs/1284",
        "download_url": "https://createqr.app/app/qrs/1284/download/svg"
    },
    "request_id": "0f8fad5b-d9cb-469f-a165-70867728950e"
}

Delete QR Codes

Delete a QR by ID (owner-only).

POST https://createqr.app/api/v1/delete

Request body

{
    "apikey": "ck_live_XXXXXXXXXXXXXXXXXXXXXXXX",
    "qrid": "1284"
}

Response

{
    "success": true,
    "data": {
        "deleted": true,
        "qrid": "1284"
    },
    "request_id": "0f8fad5b-d9cb-469f-a165-70867728950e"
}

List QR Codes

List your QRs in pages of 100, newest first.

POST https://createqr.app/api/v1/list

Use pagination starting at 1. Results return up to 100 items per page.

Request body

{
    "apikey": "ck_live_XXXXXXXXXXXXXXXXXXXXXXXX",
    "pagination": "1"
}

Response

{
    "success": true,
    "data": {
        "pagination": "1",
        "page_size": 100,
        "total": 2,
        "items": [
            {
                "qrid": "1284",
                "title": "Campaign QR",
                "type": "dynamic",
                "created_at": "2026-02-17 09:12:30",
                "short_url": "https://createqr.app/r/a1b2c3",
                "dashboard_url": "https://createqr.app/app/qrs/1284"
            },
            {
                "qrid": "1269",
                "title": "Guest Wi-Fi QR",
                "type": "static",
                "created_at": "2026-02-17 08:02:08",
                "dashboard_url": "https://createqr.app/app/qrs/1269"
            }
        ]
    },
    "request_id": "0f8fad5b-d9cb-469f-a165-70867728950e"
}

Error responses, limits, and retries

Every response includes request_id. Keep it when contacting support so we can debug quickly.

Typical error envelope

{
    "success": false,
    "error": {
        "code": "validation_error",
        "message": "Static QR is only available for WiFi payloads or crypto wallet addresses."
    },
    "request_id": "5f5fbd38-f82f-49ad-bf11-f7f04ca9747a"
}

Retry strategy

  • 429 rate_limited: retry with exponential backoff plus jitter.
  • Honor Retry-After when present.
  • 429 monthly_quota_exceeded: wait for quota reset or use a key with quota left.
  • 5xx: retry with capped attempts, then alert your team.
Error code HTTP When it happens What to do
invalid_api_key 401 Missing or invalid API key Provide a valid key via Bearer, X-API-Key, or JSON body field.
invalid_content_type 415 Body is not application/json Send Content-Type: application/json.
request_too_large 413 Payload exceeds configured limit Shrink body size, especially base64 logos.
plan_upgrade_required 403 Plan is not allowed for API Upgrade to Business from Billing.
validation_error 422 Invalid fields such as URL, static payload, color, or folderid Use dynamic for URLs and managed destinations; use static only for WiFi or crypto wallet payloads.
rate_limited 429 Per-minute limit reached Retry with exponential backoff and honor Retry-After.
monthly_quota_exceeded 429 Monthly quota exhausted Wait for reset or adjust quota and key settings.
qr_not_found 404 Delete target is missing or not yours Verify qrid ownership and try again.
internal_error 500 Unexpected server-side issue Retry with backoff and keep request_id for support.

FAQ

Short answers for the questions we see most in integrations.

How many API requests can I run?

The API is Business-only. The monthly quota comes from your active plan and key overrides. Default Business seed is high, and admins can fine-tune per key.

Can I send API keys in JSON body?

Yes. Header-based auth is recommended, but compatibility body fields apikey or api_key are also accepted.

Can I create static QR codes through the API?

Yes, but static mode is limited to WiFi payload strings and crypto wallet addresses. Use dynamic mode for URLs, PDFs, menus, apps, social pages, and other managed destinations.

Do API-created QRs show up in my dashboard?

Yes. Every successful create is saved in your account and can be managed like any other QR.

What happens when I hit limits?

You receive JSON errors. For 429 responses, respect Retry-After and use exponential backoff with jitter.

Can I delete a QR from another account?

No. Delete and list are scoped to the authenticated API-key owner.

Security best practices

  • Never expose raw API keys in browser JavaScript, mobile bundles, or public repositories.
  • Use API key IP allowlists to lock usage to trusted servers.
  • Log request_id together with your own trace IDs for faster incident triage.
  • Rotate keys on a schedule and immediately after credential leaks.
Open API key manager