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.
dataTypecolumn. Optional. Defaults tourlif 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}/resultThe 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.