Skip to main content
POST

Authorizations

Authorization
string
header
required

API key in the Authorization header: Bearer qr_live_… or Bearer qr_test_…. Token endpoints take a Clerk session JWT instead.

Body

application/json
target
object
required

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.

name
string

Defaults to "Campaign {code}" / "Static {code}".

Maximum string length: 255
type
enum<string>

Chooses 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.

Available options:
dynamic,
static
design
object

Visual customization. Stored with the code, so the dashboard shows exactly what the API created.

folder_id
string

Folder to place the code in (e.g. fld_12).

domain_id
string | null

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).

Example:

"dom_3"

tags
string[]
Maximum array length: 10
Maximum string length: 50

Response

QR code created

id
string

qr_… for dynamic, sqr_… for static.

Example:

"qr_123"

object
string
Example:

"qr_code"

kind
enum<string>
Available options:
dynamic,
static
name
string
type
string

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.

Example:

"url"

short_code
string
Example:

"AB3D5"

short_url
string | null

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>.

Example:

"https://qrkit.to/AB3D5"

domain_id
string | null

The custom domain short_url is on, or null for the default host (and for static codes).

Example:

"dom_3"

gs1
object

Present on GS1 codes only. The identifier half is READ-ONLY (R4 — it is printed); links and overrides are the editable half.

target
object
design
object | null
folder_id
string | null
Example:

"fld_12"

tags
string[]
image_url
string
Example:

"https://img.useqrkit.com/qr-AB3D5-1717000000000.svg"

download_url
string
Example:

"/v1/qr-codes/qr_123/download"

is_active
boolean

Dynamic codes: whether the redirect is on. Static codes: false while the code is in the Trash (the printed payload itself keeps working).

scan_count
integer | null

null for static codes (no tracking).

utm
object | null

UTM parameters (null unless set on a dynamic url code).

created_at
string<date-time>
updated_at
string<date-time>
deleted_at
string<date-time> | null

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.