Skip to main content
POST
Create a QR code
Create a QR code in the workspace bound to your API key. You do not send a workspace ID.

Authentication and permissions

POST /v1/qr requires QR codes: Write (qr_codes.create). A non-empty tag_ids array also requires Tags: Read (tags.view).
type, content_type, title, and payload are required. A dynamic QR encodes a stable Biqli tracking URL, so you can update its destination later. A static QR directly encodes its content and cannot use dynamic routing features.

Supported content

The vCard socials object accepts youtube, x, instagram, tiktok, and linkedin. The public API does not upload vCard avatars.

Optional dynamic behavior

Styling

Send the optional qr_config object to control matrix, eye-frame, and eye styles, flat colors, gradients, gradient inheritance, and the default Biqli logo. See Style a QR code for every field and precedence rule.

Response

Success returns 201 Created with a complete qr_code resource and a biq_qr_... ID. scan_value contains the directly encoded value for static QR codes or the stable Biqli URL for dynamic QR codes. Validation failures return 422 validation_error. Unsafe destinations use the standard URL-safety response. Quota or plan restrictions return 403; hiding the default logo without the required plan returns upgrade_required.

Shared API behavior

Authentication is workspace-scoped; see Authentication. Errors use the standard envelope and request IDs described in Errors, and requests are subject to Rate limits.

Authorizations

Authorization
string
header
required

A workspace API key beginning with biqli_.

Body

application/json
type
enum<string>
required
Available options:
static,
dynamic
content_type
enum<string>
required
Available options:
text,
link,
email,
phone,
sms,
wifi,
vcard,
event,
application,
whatsapp
title
string
required
Maximum string length: 255
payload
object
required

Fields must match content_type. See Create a QR code for required combinations.

qr_config
null | object

Public QR design. applyGradientToAll gives the matrix gradient precedence over both eye sections. Otherwise applyEyeFrameGradientToEye gives the eye-frame gradient precedence over the eye center. Custom logos are not supported.

utm
string | null
Maximum string length: 2000
activates_at
string<date-time> | null
expires_at
string<date-time> | null
geo_rules
object[]
device_rules
object[]
platform_rules
object[]
exp_clicks_rule
object | null
tag_ids
string[]
Maximum array length: 100

Response

QR code created.

qr_code
object
required
status
string
required
Allowed value: "success"