GuidesBulk upload format

Bulk QR upload format

The dashboard’s QR codes → Bulk page and the customer API’s POST /api/qr/codes/bulk endpoint both accept the same simple format. One row per QR you want to create.

CSV format (dashboard)

Each row is a destination URL, with an optional second column overriding the data type. A header row is allowed; we ignore it.

destination,dataType
https://yourbrand.com/spring,url
https://yourbrand.com/summer,url
mailto:hello@yourbrand.com,email
  • One destination per line. Required.
  • dataType column. Optional. Defaults to url if absent. Allowed values match the dashboard builder: url, text, email, phone, wifi, vcard, sms, geo.
  • Row cap. Up to 500 rows per upload from the dashboard. The API endpoint accepts up to 1,000 per call.
  • Quoting. Quote any value that contains a comma. Standard CSV rules.

Every row produces a fresh dynamic QR with default styling — same dot shape, color, error correction as the builder defaults. Edit individual QRs afterwards if you want custom branding.

JSON format (API)

The customer API accepts an array of QR-spec objects with the same shape the single-create endpoint uses:

POST /api/qr/codes/bulk
Authorization: Bearer exr_live_...
Content-Type: application/json
 
[
  { "data": "https://yourbrand.com/spring", "dataType": "url" },
  { "data": "https://yourbrand.com/summer", "dataType": "url" }
]

Response is a bulkId you poll:

GET /api/qr/codes/bulk/{bulkId}

When the status is complete, fetch the result archive once:

GET /api/qr/codes/bulk/{bulkId}/result

The result archive is a one-shot download; it is removed after the first successful fetch.

What you cannot do via bulk yet

  • Custom styling per row (different colors, shapes, error correction).
  • Per-row security flags (password, encrypt, expire).
  • Logo embedding.

If you need any of those, generate one-by-one via POST /api/qr/codes (or the dashboard builder) until per-row styling lands on the bulk surface.