API docs
Queue up to 100 QR codes in a single request. Batches process asynchronously — poll the status endpoint, then download a ZIP once it's ready.
/v1/qr/bulkSchedules an async worker job to generate up to 100 QR codes in one request. Each item can override the global size/format/style, or inherit it.
Bulk limit is up to 1000 items per request depending on plan.
Example response · 200
{
"task_id": "task_abc123xyz",
"item_count": 2,
"status": "queued",
"message": "Batch processing job successfully scheduled."
}Stored only in this browser's local storage — never sent anywhere but the API itself.
curl -X POST "https://api.qrcode-genie.com/v1/qr/bulk" \
-H "X-QRGenie-Api-Key: <your_api_key>" \
-H "Content-Type: application/json" \
-d '{"items":[{"data":"https://user1.com","filename":"user1-promo-qr"},{"data":"https://user2.com","filename":"user2-promo-qr"}],"size":512,"file_format":"png","global_config":{"body_type":"body2","eye_frame":"frame3"}}'/v1/qr/bulk/dynamicCreates a dynamic link and a matching QR code for each item in one job. Any global_* field sets a default for the whole batch; an item can override it individually by setting the same field on itself. Requires a plan with dynamic link access.
An item-level field always wins over the matching global_* field — e.g. an item with its own expires_at ignores global_expires_at entirely.
Bulk limit, webhooks limit, and dynamic-link plan limits all apply — this call is rejected if the batch would exceed your plan's bulk_max_items or the maximum webhooks allowed or its remaining dynamic link capacity.
A custom_domain used by any item (or set as global_custom_domain) must already be verified on your account before this call — see Custom domains under Dynamic Links.
Poll /v1/qr/bulk/status/{task_id}, then download from /v1/qr/bulk/download/{task_id} once ready — identical to the static bulk flow.
The downloaded ZIP includes a manifest.csv mapping each generated filename to its short_key, short_url, destination_url, and title.
Example response · 200
{
"task_id": "task_abc123xyz",
"item_count": 2,
"status": "queued",
"message": "Bulk dynamic link job queued. Poll /v1/qr/bulk/status/{task_id} for progress."
}Stored only in this browser's local storage — never sent anywhere but the API itself.
curl -X POST "https://api.qrcode-genie.com/v1/qr/bulk/dynamic" \
-H "X-QRGenie-Api-Key: <your_api_key>" \
-H "Content-Type: application/json" \
-d '{"items":[{"destination_url":"https://example.com/promo-a","title":"Promo A","tags":["marketing","q3"],"filename":"promo-a","qr_config":{"body_type":"body2","eye_frame":"frame3","colors":{"bg_color":"#ffffff","body_color":"#4F46E5"}}},{"destination_url":"https://example.com/promo-b","title":"Promo B","expires_at":"2026-12-31T23:59:59Z","ios_url":"https://apps.apple.com/app/x","android_url":"https://play.google.com/store/apps/details?id=x","geo_targeting":{"US":"https://example.com/us","GB":"https://example.com/uk"}}],"size":512,"file_format":"png","global_is_active":true,"global_tags":["marketing"],"global_qr_config":{"body_type":"body2","eye_frame":"frame3","colors":{"bg_color":"#ffffff","body_color":"#4F46E5"}}}'/v1/qr/bulk/status/{task_id}Poll this to determine whether a batch job has finished and whether its archive is ready to download.
Parameters
task_idstringrequiredThe task ID returned when the batch was created.
Example response · 200
{
"task_id": "d3005699-cf69-46ad-93b1-05d58af26b35",
"status": "SUCCESS",
"ready": true,
"completed_count": 10,
"total_count": 10,
"download_available": true,
"download_url": "/v1/qr/bulk/download/d3005699-cf69-46ad-93b1-05d58af26b35"
}Stored only in this browser's local storage — never sent anywhere but the API itself.
curl -X GET "https://api.qrcode-genie.com/v1/qr/bulk/status/d3005699-cf69-46ad-93b1-05d58af26b35" \
-H "X-QRGenie-Api-Key: <your_api_key>"/v1/qr/bulk/download/{task_id}Downloads the finished batch as a ZIP archive once status reports download_available: true.
Parameters
task_idstringrequiredThe completed task's ID.
Example response · 200
Raw application/zip binary stream containing every generated file from the batch.
Stored only in this browser's local storage — never sent anywhere but the API itself.
curl -X GET "https://api.qrcode-genie.com/v1/qr/bulk/download/d3005699-cf69-46ad-93b1-05d58af26b35" \
-H "X-QRGenie-Api-Key: <your_api_key>"