Create QR Code
Creates a QR code, renders its image (SVG, stored on QRKit’s CDN) and
returns the full object. Requires the qr:write scope.
Each target type takes structured fields (recommended) or a
pre-encoded destination string. Dynamic codes count against your
plan’s QR limit; static codes do not.
GS1 Digital Link codes use a different body, discriminated by
"type": "gs1": they carry an identifier (a GTIN and its qualifiers)
instead of a target. See CreateGs1QrCodeRequest.
Authorizations
API key in the Authorization header: Bearer qr_live_… or Bearer qr_test_…. Token endpoints take a Clerk session JWT instead.
Body
- Option 1
- Option 2
What the QR code points to. Each type takes structured fields; the
link types and most static types also accept a pre-encoded
destination string if you prefer to encode yourself.
Defaults to "Campaign {code}" / "Static {code}".
255Chooses the mode where the type allows it. url defaults to dynamic; wifi/text/email/sms/event default to static but accept dynamic (hosted scan page, editable, scan analytics — requires structured target fields, not a pre-encoded destination); vcard, appstores and review always dynamic; url, the link types (youtube … googleform), whatsapp, telegram and location default to dynamic and accept static. Omit to use the type's default.
dynamic, static Visual customization. Stored with the code, so the dashboard shows exactly what the API created.
Folder to place the code in (e.g. fld_12).
Dynamic codes only: the scan host printed in the QR. Omit it to use
the workspace's primary custom domain when it has an active one
and the plan includes custom domains (Plus and up) — the same
default the dashboard uses — pass null for the default QRKit
host, or a dom_<n> id from GET /v1/me → custom_domains.
An id that is not an active custom domain of the workspace is
refused (422), as is any non-null domain_id on a static code; naming a
domain on a plan without custom domains is 403. In a batch, every
item's domain is checked before the batch is accepted. The host is
fixed once the code exists: PATCH refuses a different domain_id
(sending the current value is accepted, except on GS1 codes, which
refuse any domain_id). GS1
codes use their own domain_id (see CreateGs1QrCodeRequest).
"dom_3"
1050Response
QR code created
qr_… for dynamic, sqr_… for static.
"qr_123"
"qr_code"
dynamic, static The stored type: any target.type the API creates (a review is stored as linkpage), gs1, or a dashboard-only type such as file, menupage, form or smarturl. Treat unknown values as opaque.
"url"
"AB3D5"
null for static codes. On the workspace custom domain when the code was created on one. For a dynamic GS1 code this is the Digital Link URI itself, not <host>/<short_code>.
"https://qrkit.to/AB3D5"
The custom domain short_url is on, or null for the default host (and for static codes).
"dom_3"
Present on GS1 codes only. The identifier half is READ-ONLY (R4 — it is
printed); links and overrides are the editable half.
"fld_12"
"https://img.useqrkit.com/qr-AB3D5-1717000000000.svg"
"/v1/qr-codes/qr_123/download"
Dynamic codes: whether the redirect is on. Static codes: false while the code is in the Trash (the printed payload itself keeps working).
null for static codes (no tracking).
UTM parameters (null unless set on a dynamic url code).
null for a live code. Set while the code is in the Trash (or paused by a plan downgrade); restore it with POST /v1/qr-codes/{id}/restore.

